今天幫人家修Bug,頁面大致是這樣:有四個按鈕,對應上下左右四個方向,點擊哪一個就使頁面上的某個元素向相應方向移動。這原本是個很簡單的頁面;
代碼大致以下:javascript
html
<div id="top">top</div> <div id="bottom">bottom</div> <div id="left">left</div> <div id="right">right</div> <script> var top=document.getElementById("top"); var bottom=document.getElementById("bottom"); var left=document.getElementById("left"); var right=document.getElementById("right"); top.onclick=function(){alert("top");}; bottom.onclick=function(){alert("bottom");}; left.onclick=function(){alert("left");}; right.onclick=function(){alert("right");}; </script>
每個onclick
事件中原本是有更多的代碼的,可是最後找bug找瘋掉了,不斷的刪掉代碼,刪到這個樣子,問題仍是存在:不管點擊哪一個,"top"也會被彈出,也就是說,top
的onclick
也被觸發了!html
萬般無奈之下,只好試試彈出top
究竟是啥,一看到結果一會兒就想到什麼緣由了。java
在瀏覽器中,top
指代一個對象,始終指向最高層框架,也就是瀏覽器窗口。
1. 當頁面中存在框架時,從top
出發,能夠幫助很快得找到想要引用的框架。
2. 若是頁面不包含框架,即最外層window
就是惟一的window
窗口,此時top
是window
的一個屬性,指向window
自己。瀏覽器
javascripttop == window.top;//true top == window;//true window == window.top;//true
然而!然而咱們是能夠給top
賦值的,雖然這樣的操做是無效的,原來top
引用的窗口對象並不會被覆蓋,可是瀏覽器也並不會報錯!(因此其實能讓瀏覽拋出異常的錯誤通常來講是比較好修正的,由於提示的錯誤信息已經能指明問題所在了。)框架
這樣以前那個頁面的問題就很清楚了,點擊了任何div
後,最終事件都會冒泡到window
窗口上。也就是,給top
定義的onclick
事件也會執行。spa
過後回頭想一想,debug的思路其實很清晰的,以前已經肯定了top
的onclick
事件會很奇怪的執行,那麼咱們看看top
究竟是啥,這是個很天然的思路;也不會折騰那麼久吧。debug