今天有個同事遇到一個奇怪的問題,我照着他的代碼作了一些簡化寫了這個demojavascript
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <style type="text/css"> 5 div{position: absolute;top: 0;left: 0;height: 50px} 6 #back{background-color: blue;left: 20px;width: 200px;z-index: 0} 7 #front{background-color: green;top:10px;width: 100px;z-index: 1} 8 </style> 9 </head> 10 <body> 11 <div id="back"></div> 12 <div id="front"></div> 13 <script type="text/javascript"> 14 document.getElementById("back").addEventListener("click", function () { 15 console.log("back clicked"); 16 }) 17 document.getElementById("front").addEventListener("click", function () { 18 console.log("front clicked"); 19 this.setAttribute("style", "z-index:0"); 20 document.getElementById("back").setAttribute("style", "z-index:1"); 21 }) 22 document.getElementById("back").addEventListener("dblclick", function () { 23 console.log("back double clicked"); 24 }) 25 document.getElementById("front").addEventListener("dblclick", function () { 26 console.log("front double clicked"); 27 }) 28 </script> 29 </body> 30 </html>
代碼的邏輯大體是這樣的:css
首先,頁面中綠色方塊爲front,藍色方塊爲back。系統的需求是,在綠色方塊上單擊時,切換兩個方塊覆蓋方式(也就是點擊front後back會跑到front前面)。同時,還須要在雙擊藍色方塊時實現另外一個功能邏輯。html
因而這哥們很天然了寫了相似上面的代碼就提交了。沒多久,測試MM提了一個bug:「雙擊綠色方塊時,不該觸發雙擊藍色方塊的邏輯」。java
後來我本身測了一下,果真如測試MM所說,當雙擊綠色和藍色方塊重疊的區域時,控制檯會打印出這樣的log:瀏覽器
瀏覽器會先觸發front click,而後是back click,再而後竟然是back double click。按理說,在back上面只點擊了一次,應該不觸發double click纔對,畢竟第一次click是在front上觸發的。微信
因此,我大膽猜測,瀏覽器自己並不會去斷定鼠標是否觸發雙擊事件,雙擊事件是由操做系統直接分發給瀏覽器的。當瀏覽器收到操做系統發來的雙擊消息時,直接根據該雙擊事件中的座標去頁面中找命中的元素,並在這個元素上觸發js中的雙擊事件。測試
操做系統在判斷是否發生雙擊時,並不知道第一次click和第二次click的目標不是同一個元素,因此只要兩次click的間隔足夠短就認爲構成雙擊事件。而瀏覽器在收到操做系統發來的雙擊事件時,並無去檢測此次雙擊是由那兩次單擊所產生,而是直接根據雙擊事件的座標信息將這個事件分發到相應的html元素上了。this
爲驗證這個猜測,我又寫了一個demospa
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <style type="text/css"> 5 body{transition:padding-left 8s linear;padding-left: 0} 6 div{width: 10px;height: 200px;background-color: blue;display: inline-block;float: left;} 7 </style> 8 </head> 9 <body> 10 <div id="div_00"></div> 11 <div id="div_01"></div> 12 <div id="div_02"></div> 13 <div id="div_03"></div> 14 <div id="div_04"></div> 15 <div id="div_05"></div> 16 <div id="div_06"></div> 17 <div id="div_07"></div> 18 <div id="div_08"></div> 19 <div id="div_09"></div> 20 <div id="div_10"></div> 21 <div id="div_11"></div> 22 <div id="div_12"></div> 23 <div id="div_13"></div> 24 <div id="div_14"></div> 25 <div id="div_15"></div> 26 <div id="div_16"></div> 27 <div id="div_17"></div> 28 <div id="div_18"></div> 29 <div id="div_19"></div> 30 <div id="div_20"></div> 31 <div id="div_21"></div> 32 <div id="div_22"></div> 33 <div id="div_23"></div> 34 <div id="div_24"></div> 35 <div id="div_25"></div> 36 <div id="div_26"></div> 37 <div id="div_27"></div> 38 <div id="div_28"></div> 39 <div id="div_29"></div> 40 <script type="text/javascript"> 41 var divs = document.getElementsByTagName("div"); 42 for(var i = 0, length = divs.length; i < length; i++){ 43 divs[i].addEventListener("click", function () { 44 console.log("clicked", this.id); 45 }); 46 divs[i].addEventListener("dblclick", function () { 47 console.log("double clicked", this.id); 48 }); 49 } 50 51 setTimeout(function(){ 52 document.body.setAttribute("style", "padding-left:300px"); 53 }, 1000); 54 </script> 55 </body> 56 </html>
當頁面中的藍色方塊開始移動後,在藍色方塊上雙擊鼠標,能夠多試幾回,獲得下面的結果:操作系統
能夠看到,div_2六、div_22兩次雙擊事件分別是由div2七、div26和div2三、div22的兩次單擊觸發的。
從這兩個結果來看,確實是符合個人猜測的。
不過,這個demo也帶來了一些疑惑:
一、clicked div_19 這個log打印的時候,我很是肯定我點擊了兩次鼠標,可是隻打出了這一個log,爲何?
二、double clicked div_15和double clicked div_11這兩次雙擊事件觸發前,都只觸發了一次click事件,這又是爲何?
以上全部代碼測試結果都是基於 Chrome 33 和 IE 11 運行環境。
但願有高人指導,也歡迎你們各抒己見。
如需轉載,請註明轉自:http://www.cnblogs.com/silenttiger/p/3578397.html
歡迎關注個人微信公衆號:老虎的小窩