魚躍于淵

          First know how, Second know why !
          posts - 0, comments - 1, trackbacks - 0, articles - 49

          addEventListener-有用的筆記

          Posted on 2008-12-21 10:07 魚躍于淵 閱讀(269) 評論(0)  編輯  收藏 所屬分類: javascript相關

          為什么用 addEventListener

          • 可以對同一物件的同一事件綁定多個事件處理程序。
          • 可以通過事件流三個階段更好地控制何時觸發事件處理程序。
          • 工作于 DOM 元素,而不僅是 HTML 元素。

          事件分發時添加 eventListener

          不會立即觸發 eventListener,可能會在下一個事件流(比如冒泡階段)中觸發。

          多個相同的 eventListener

          如下,三個參數完全相同,并且第二個參數不是匿名函數。

          document.getElementById("myBox").addEventListener("click", Go, false);
          document.getElementById("myBox").addEventListener("click", Go, false);
          document.getElementById("myBox").addEventListener("click", Go, false);

          會拋棄多余的,只保留一個,對應的 removeEventListener 也只用一次就可以了(removeEventListener 用法和 addEventListener 完全相同)。

          但如果是第二個參數是匿名函數,比如:

          document.getElementById("outDiv").addEventListener("click", function () { document.getElementById("info").innerHTML += "1";}, false);
          document.getElementById("outDiv").addEventListener("click", function () { document.getElementById("info").innerHTML += "1";}, false);
          document.getElementById("outDiv").addEventListener("click", function () { document.getElementById("info").innerHTML += "1";}, false);

          則三個均有效,并且無法用 removeEventListener 除去。

          this

          事件處理程序中,this 變成了觸發事件的控件,但我們仍推薦用 event.target 或 event.currentTarget。

          早期的事件監聽

          在 DOM0 中,我們用 obj.onclick = FuncName,由于兼容性好,應用非常廣泛,只是功能不如 addEventListener 強大。

          內存問題

          前面提到了許多使用域名函數的地方,有時這是沒辦法的,請參見在各瀏覽器中動態添加事件-參數篇,但這會導致內存問題。

          一旦事件綁定之后,該綁定代碼作用域的變量就都保留下來,不會被 JavaScript 引擎回收,這可能會引起占用大量內存的問題,由于 removeEventListener 無法刪除匿名函數的事件處理程序,只有在物件(比如按鈕)去除之后,該內存才可能得到回收。

          主站蜘蛛池模板: 鄯善县| 太原市| 民县| 镇远县| 新乡市| 长岭县| 三门县| 神农架林区| 平利县| 安福县| 湘潭县| 关岭| 汤原县| 梅州市| 开平市| 万年县| 奉新县| 南京市| 依安县| 乡宁县| 杂多县| 曲靖市| 龙岩市| 太仆寺旗| 古交市| 中宁县| 会昌县| 昌平区| 桐柏县| 临沂市| 伊宁县| 阳山县| 温泉县| 上饶市| 丘北县| 庄浪县| 阜新| 临汾市| 阿拉善左旗| 武隆县| 乌拉特中旗|