前端面試題匯總

1.移動(dòng)端300ms延遲由來(lái)及解決方案
(1) 300ms延遲由來(lái)300 毫秒延遲的主要原因是解決雙擊縮放(double tap to zoom)。雙擊縮放解藻,顧名思義,即用手指在屏幕上快速點(diǎn)擊兩次巷嚣,iOS 自帶的 Safari 瀏覽器會(huì)將網(wǎng)頁(yè)縮放至原始比例。 那么這和 300 毫秒延遲有什么聯(lián)系呢评雌? 假定這么一個(gè)場(chǎng)景。用戶在 iOS Safari 里邊點(diǎn)擊了一個(gè)鏈接斤吐。由于用戶可以進(jìn)行雙擊縮放或者雙擊滾動(dòng)的操作蜕煌,當(dāng)用戶一次點(diǎn)擊屏幕之后,瀏覽器并不能立刻判斷用戶是確實(shí)要打開(kāi)這個(gè)鏈接贫母,還是想要進(jìn)行雙擊操作因块。因此靠柑,iOS Safari 就等待 300 毫秒,以判斷用戶是否再次點(diǎn)擊了屏幕隔嫡。 鑒于iPhone的成功梢杭,其他移動(dòng)瀏覽器都復(fù)制了 iPhone Safari 瀏覽器的多數(shù)約定,包括雙擊縮放咒唆,幾乎現(xiàn)在所有的移動(dòng)端瀏覽器都有這個(gè)功能误债。

(2)解決方案

1).添加viewpoint meta標(biāo)簽

<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"/>

2).FastClick

移動(dòng)端事件觸發(fā)順序:在移動(dòng)端李命,手指點(diǎn)擊一個(gè)元素,會(huì)經(jīng)過(guò):touchstart --> touchmove -> touchend -->click槽惫。

fastclick.js的原理是:FastClick的實(shí)現(xiàn)原理是在檢測(cè)到touchend事件的時(shí)候,會(huì)通過(guò)DOM自定義事件立即出發(fā)模擬一個(gè)click事件辩撑,并把瀏覽器在300ms之后真正的click事件阻止掉界斜。

?fastclick同樣可以解決移動(dòng)端點(diǎn)透現(xiàn)象。

DEMO


<!DOCTYPE html>

<html lang="en">

<head>

? ? <meta charset="UTF-8">

? ? <meta name="viewport" content="width=device-width, initial-scale=1.0,user-scalable=no">

? ? <meta http-equiv="X-UA-Compatible" content="ie=edge">

? ? <title>移動(dòng)端點(diǎn)透現(xiàn)象</title>

? ? <style>

? ? ? ? * {

? ? ? ? ? ? margin: 0px;

? ? ? ? ? ? padding: 0px;

? ? ? ? }

? ? ? ? #div1 {

? ? ? ? ? ? /*紅色半透明遮蓋層A*/

? ? ? ? ? ? width: 300px;

? ? ? ? ? ? height: 300px;

? ? ? ? ? ? background-color: rgba(255, 0, 0, 0.25);

? ? ? ? }

? ? ? ? #div2 {

? ? ? ? ? ? /*黃色內(nèi)容層B*/

? ? ? ? ? ? width: 240px;

? ? ? ? ? ? height: 240px;

? ? ? ? ? ? background-color: yellow;

? ? ? ? ? ? position: absolute;

? ? ? ? ? ? left: 30px;

? ? ? ? ? ? top: 30px;

? ? ? ? ? ? z-index: -1;

? ? ? ? }

? ? ? ? #console {

? ? ? ? ? ? /*綠色狀態(tài)輸出框*/

? ? ? ? ? ? border: 1px solid green;

? ? ? ? ? ? position: absolute;

? ? ? ? ? ? top: 300px;

? ? ? ? ? ? width: 100%;

? ? ? ? }

? ? </style>

</head>

<body>

? ? <div id="div1"></div>

? ? <div id="div2">

? ? ? ? <a >去百度</a>

? ? </div>

? ? <div id="console"></div>

? ? <script src="https://cdn.bootcss.com/fastclick/1.0.6/fastclick.min.js"></script>

? ? <script type="text/javascript">

? ? ? ? window.onload = function() {

? ? ? ? ? ? if('addEventListener' in document) {

? ? ? ? ? ? ? ? document.addEventListener('DOMContentLoaded', function() {

? ? ? ? ? ? ? ? ? ? FadtClick.attach(document.body);

? ? ? ? ? ? ? ? }, false);

? ? ? ? ? ? }

? ? ? ? ? ? let div1 = document.getElementById('div1');

? ? ? ? ? ? let div2 = document.getElementById('div2');

? ? ? ? ? ? function handle(e) {

? ? ? ? ? ? ? ? let tar = e.target,eve = e.type;

? ? ? ? ? ? ? ? console.log('target:' + tar.id + " event:" + eve)

? ? ? ? ? ? ? ? if(tar.id === "div1") {

? ? ? ? ? ? ? ? ? ? div1.style.display = "none";

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? div1.addEventListener('touchend', handle);

? ? ? ? ? ? div2.addEventListener('touchstart', handle);

? ? ? ? ? ? div2.addEventListener('click', handle);

? ? ? ? }

? ? </script>

</body>

</html>


說(shuō)明:手機(jī)端瀏覽器基本已經(jīng)沒(méi)有300ms延時(shí)現(xiàn)象合冀。

2.瀏覽器事件機(jī)制中事件觸發(fā)三個(gè)階段(轉(zhuǎn)自 廊橋夢(mèng)醉

js中時(shí)間執(zhí)行的整個(gè)過(guò)程稱(chēng)之為事件流棕叫,分為三個(gè)階段:事件捕獲階段谨设,事件目標(biāo)處理函數(shù)侣夷、事件冒泡。

當(dāng)某歌元素觸發(fā)某個(gè)事件(如:click),頂級(jí)對(duì)象document發(fā)出一個(gè)事件流帝火,順著dom的樹(shù)節(jié)點(diǎn)向觸發(fā)它的目標(biāo)節(jié)點(diǎn)流去求妹,直到達(dá)到目標(biāo)元素溉委,這個(gè)層層遞進(jìn)熄求,向下找目標(biāo)的過(guò)程為事件的捕獲階段,此過(guò)程與事件相應(yīng)的函數(shù)是不會(huì)觸發(fā)的。

到達(dá)目標(biāo)函數(shù)晋渺,便會(huì)執(zhí)行綁定在此元素上的,與事件相應(yīng)的函數(shù)昭卓,即事件目標(biāo)處理函數(shù)階段占业。

最后峰伙,從目標(biāo)元素起匣摘,再依次往頂層元素對(duì)象傳遞,途中如果有節(jié)點(diǎn)綁定了同名事件枢希,這些事件所對(duì)應(yīng)的函數(shù),在此過(guò)程中便稱(chēng)之為事件冒泡失暴。

通常情況下坯门,事件相應(yīng)的函數(shù)四在冒泡階段執(zhí)行的。addEventListener的第三個(gè)參數(shù)默認(rèn)為false逗扒,表示冒泡階段執(zhí)行(為true的時(shí)候田盈,表示捕獲階段執(zhí)行)。

使用e.stopPropgation()或e.cancelBubble = true(IE)可以阻斷事件向當(dāng)前元素的父元素冒泡缴阎。

3.?this的指向

var o = {

? ? ? ? ? ? ? ? user: 'hello',

? ? ? ? ? ? ? ? fn: function() { // this指向o

? ? ? ? ? ? ? ? ? ? console.log(this.user);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? o.fn();

? ? ? ? ? ? var test = {

? ? ? ? ? ? ? ? a: 10,

? ? ? ? ? ? ? ? fn: function(){

? ? ? ? ? ? ? ? ? ? console.log(this.a); // 12

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? test.b.fn();

? ? ? ? ? ? function Fn() {

? ? ? ? ? ? ? ? this.user = "woca";

? ? ? ? ? ? }

? ? ? ? ? ? var he = new Fn();

? ? ? ? ? ? console.log(he.user); //woca

? ? 4. apply bind call

? ? ? ? ? ? // 1. call()

? ? ? ? ? ? var a = {

? ? ? ? ? ? ? ? user: 'lalala',

? ? ? ? ? ? ? ? fn: function() {

? ? ? ? ? ? ? ? ? ? console.log(this.user);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? var b = a.fn;

? ? ? ? ? ? b(); //undefined

? ? ? ? ? ? a.fn(); // lalala

? ? ? ? ? ? //通過(guò)在call方法,給第一個(gè)參數(shù)添加要把b添加到哪個(gè)環(huán)境中简软,簡(jiǎn)單來(lái)說(shuō)蛮拔,this就會(huì)指向那個(gè)對(duì)象述暂。

? ? ? ? ? ? b.call(a); // lalala

? ? ? ? ? ? //call方法除了第一個(gè)參數(shù)以外還可以添加多個(gè)參數(shù),如下:

? ? ? ? ? ? var a = {

? ? ? ? ? ? ? ? user: 'hahaha',

? ? ? ? ? ? ? ? fn: function(arg1, arg2) {

? ? ? ? ? ? ? ? ? ? console.log(this.user); // hahaha

? ? ? ? ? ? ? ? ? ? console.log(arg1 + arg2); // 3

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? var b = a.fn;

? ? ? ? ? ? b.call(a,1,2);

? ? ? ? ? ? // 2. apply()

? ? ? ? ? ? var a = {

? ? ? ? ? ? ? ? user: 'hahaha',

? ? ? ? ? ? ? ? fn: function(arg1, arg2) {

? ? ? ? ? ? ? ? ? ? console.log(this.user); // hahaha

? ? ? ? ? ? ? ? ? ? console.log(arg1 + arg2); // 3

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? var b = a.fn;

? ? ? ? ? ? b.apply(a,[2,4]);

? ? ? ? ? ? // *注意如果call和apply的第一個(gè)參數(shù)寫(xiě)的是null建炫,那么this指向的是window對(duì)象

? ? ? ? ? ? var a = {

? ? ? ? ? ? ? ? user: "balabala",

? ? ? ? ? ? ? ? fn: function(){

? ? ? ? ? ? ? ? ? ? console.log(this); // window

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? var b = a.fn;

? ? ? ? ? ? b.apply(null);

? ? ? ? ? ? // call和apply的入?yún)^(qū)別:call若干個(gè)畦韭,apply是數(shù)組

? ? ? ? ? ? var a = {

? ? ? ? ? ? ? ? user: 'limei',

? ? ? ? ? ? ? ? fn:function(a,b,c) {

? ? ? ? ? ? ? ? ? ? console.log(this.user); // limei

? ? ? ? ? ? ? ? ? ? console.log(a,b,c); // 10 1 2

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? var b = a.fn;

? ? ? ? ? ? var c = b.bind(a,10);

? ? ? ? ? ? c(1,2);

? ? ? ? ? ? /** 總結(jié):

? ? ? ? ? ? ? * call和apply都是改變上下文中的this并立即執(zhí)行這個(gè)函數(shù),

? ? ? ? ? ? ? * bind方法可以讓對(duì)應(yīng)的函數(shù)想什么時(shí)候調(diào)就什么時(shí)候調(diào)用肛跌,并且可以將參數(shù)在執(zhí)行的時(shí)候添加

? ? ? ? ? ? */

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末艺配,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子衍慎,更是在濱河造成了極大的恐慌转唉,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稳捆,死亡現(xiàn)場(chǎng)離奇詭異赠法,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)乔夯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)砖织,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人末荐,你說(shuō)我怎么就攤上這事侧纯。” “怎么了甲脏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵眶熬,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我剃幌,道長(zhǎng)聋涨,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任负乡,我火速辦了婚禮牍白,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抖棘。我一直安慰自己茂腥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布切省。 她就那樣靜靜地躺著最岗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪朝捆。 梳的紋絲不亂的頭發(fā)上般渡,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼驯用。 笑死脸秽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蝴乔。 我是一名探鬼主播记餐,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼薇正!你這毒婦竟也來(lái)了片酝?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤挖腰,失蹤者是張志新(化名)和其女友劉穎雕沿,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體曙聂,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晦炊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宁脊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片断国。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖榆苞,靈堂內(nèi)的尸體忽然破棺而出稳衬,到底是詐尸還是另有隱情,我是刑警寧澤坐漏,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布薄疚,位于F島的核電站,受9級(jí)特大地震影響赊琳,放射性物質(zhì)發(fā)生泄漏街夭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一躏筏、第九天 我趴在偏房一處隱蔽的房頂上張望板丽。 院中可真熱鬧,春花似錦趁尼、人聲如沸埃碱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)砚殿。三九已至,卻和暖如春芝囤,著一層夾襖步出監(jiān)牢的瞬間似炎,已是汗流浹背辛萍。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留羡藐,地道東北人叹阔。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像传睹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子岸晦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 【轉(zhuǎn)載】CSDN - 張林blog http://blog.csdn.net/XIAOZHUXMEN/articl...
    竿牘閱讀 3,481評(píng)論 1 14
  • HTML Doctype作用欧啤?嚴(yán)格模式與混雜模式如何區(qū)分?它們有何意義? HTML5 為什么只需要寫(xiě) <!DOCT...
    灰色程序閱讀 563評(píng)論 0 6
  • HTML&CSS img的alt和title的異同启上? **alt **是圖片加載失敗時(shí)邢隧,顯示在網(wǎng)頁(yè)上的替代文字;*...
    櫻桃小丸子兒閱讀 11,325評(píng)論 9 193
  • 從這種意義上說(shuō)冈在,我們可以把社會(huì)人群比喻為一堆火倒慧,明智的人在取暖的時(shí)候懂得與火保持一段距離,而不會(huì)像傻瓜那樣太過(guò)靠近...
    你先愛(ài)我閱讀 174評(píng)論 0 0
  • 從前我以為美是我們對(duì)真和善的直覺(jué)包券,我以為美是最無(wú)實(shí)體的纫谅。但當(dāng)我否定了真與善后,仍然否定不了美溅固,許多事物是美的付秕,無(wú)法...
    何青猊閱讀 167評(píng)論 1 1