回覆列表
  • 1 # 一杯茶87345135

    attachEvent是ie新增事件處理程式,接收兩個引數,其中事件型別名稱要加"on",

    可以新增多個事件處理程式,按照新增順序相反的順序觸發;

    addEventListener是給非ie新增事件處理程式,接收三個引數,第一個是事件名,不需要加“on”,

    第二個是繫結的函式,第三個引數是一個布林值,是事件的方式,意思是是否使用useCatch方式,

    如果是false,就使用傳統的冒泡方式,如果為true,就在捕獲階段呼叫事件處理程式。

    addEventListener可以新增多個事件處理程式,按照新增順序觸發

    二者有個本質上的區別,attachEvent的事件處理程式會在全域性作用域中執行,this等於window物件,

    而addEventLinstener新增的事件處理程式是在其依附的元素的作用域中執行的,this等於繫結元素物件。

    既然他們的this指向不同,那怎麼才能實現相同的this指向呢?

    如果想要實現this關鍵字指向相同的話,要用Function的apply或者call方法。示例程式碼如下:

    function bind(el, fn, type){ var _fn = function(){ fn.apply(el, arguments); }; window.addEventListener ? el.addEventListener(type, _fn, false) : el.attachEvent("on" + type, _fn);}

    即用el來代替_fn裡的this。

    el.onclick和addEventListener和attachEvent有什麼區別呢?本質的區別是el.onclick相當於在標籤上寫onclick,用addEventListener和attachEvent是透過DOM介面去繫結事件。

    一個html文件的解析是有順序的,先解析標籤項,再解析DOM項,el.onclick事實上相當於寫在標籤上,

    透過標籤的onclick屬性輸入到文件,然後由文件解析成事件的。而後者,要在文件解析完成以後,

    透過文件的dom介面去繫結的事件,雖然結果是一樣的,都是click事件,但是過程是不同的。

    透過這三種方式繫結的事件,怎麼取消呢?

    el.onclick:el.onclick=null;這樣就可以取消繫結在el上的事件處理程式了。

    透過addEventListener()新增的事件處理程式只能透過removeEventListener()來移除,並且移除時傳入的引數與新增

    處理程式時使用的引數相同。透過addEventListener()新增的匿名函式將無法移除。

    透過attachEvent()新增的事件處理程式要透過detachEvent()來移除,其他的情況和addEventListener()一樣。

    如果都想在事件函數里面獲取event物件,怎麼獲取呢?

    這要分瀏覽器,IE和非IE的事件物件不同。相容DOM的瀏覽器會將一個event物件傳入到事件處理程式中,無論指定事件

    處理程式時使用什麼方法,都會傳入event物件。

    el.onclick=function(event){

      alert(event.type); //"click"

    };

    el.addEventListener("click",function(event){

      alert(el.type); //"click"

    },false);

    透過HTML標籤屬性指定的事件處理程式時,變數event中儲存著event物件。

    <input type="button" value="Click me" onclick="alert(event.type)"/> //"click"

    在IE中,要訪問event物件有幾種不同的方式:

    透過el.onclick繫結的事件處理程式中,event物件作為window物件的一個屬性存在。

    el.onclick=function(){

      var event=window.event;

      alert(event.type); //"click"

    }

    如果透過attachEvent()新增事件處理程式時,event物件作為引數被傳入事件處理程式,

    el.attachEvent("onclick",function(event){

      alert(event.type); //"click"

    });

    透過HTML標籤屬性指定的事件處理程式時,變數event中儲存著event物件。這點和非IE一樣。

    綜上,跨瀏覽器的事件物件獲取方法是: return event?event:window.event;

  • 中秋節和大豐收的關聯?
  • 足球亞盤九步分析法?