javascript 自定義事件


  javascript自定義事件的方式分為4個步驟;

一、谷歌、火狐自定義JavaScript事件

  1、創建事件;

document.createEvent('HTMLEvents');

  參數是字符串類型,表示要創建的事件類型。

  • uievents;
  • mutationevents;
  • htmlevents;

  2、初始化事件;

ev.initEvent('listen', false, false);

  參數說明:

  • eventType:事件名稱;
  • canBubble:事件是否冒泡;
  • cancelable:是否可以用 preventDefault() 方法取消事件;

  3、監聽事件;

document.addEventListener(dataavailable, handler, param3);

  參數說明:

  • dataavailable:監聽的事件名稱;
  • handler:處理函數;
  • param3:是否是撲獲事件模型;

  4、觸發事件;

document.dispatchEvent(ev);

  參數說明:
  ev:第一步所創建的事件對象;

<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>javascript自定義事件</title>
<script type="text/javascript">
  //創建事件
  var ev = document.createEvent('HTMLEvents');
  window.onload = function () {
    //初始化事件
    ev.initEvent('listen', false, false);
    //監聽事件與綁定處理函數
    document.addEventListener("listen", function (e) {
      alert("事件被觸發!");
    }, false);
  }
</script>
</head>
<body>
  <div>
    <input type="button" value="觸發" onclick="document.dispatchEvent(ev);" />
  </div>
</body>
</html>

2016-05-25補充:移除監聽removeEventListener及ev.stopPropagation()

 

<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>javascript自定義事件</title>
<script type="text/javascript">
  //創建事件
  var ev = document.createEvent('HTMLEvents');

    function myFun1(e) {
    alert("事件被觸發11!");
  }

    function myFun2(e) {
    alert("事件被觸發22!");
  }

  window.onload = function () {
    //初始化事件
    ev.initEvent('listen', false, false);
    //監聽事件與綁定處理函數
    document.addEventListener("listen", myFun1, false);
        document.addEventListener("listen", myFun2, false);
  }

</script>
</head>
<body>
  <div>
    <input type="button" value="觸發" onclick="document.dispatchEvent(ev);" />
       <input type="button" value="移除" onclick='document.removeEventListener("listen", myFun1, false);' />
  </div>
</body>
</html> 

  上面是移除myFun1的監聽,事件依然觸發,myFun2的監聽依然可以監聽到。而且,如果是用匿名函數添加的監聽,怎么移除呢?這是個問題。知道的請告訴我。

  如果要移除全部的監聽,逐一移除監聽是可行方法之一。還有就是,讓事件不再派發,如上面的

<input type="button" value="停止派發" onclick='ev.stopPropagation()' />

  這樣寫,單擊了停止派發按鈕后,事件就不再派發,全部監聽都不會再接收到此事件對象的派發。

  Event的屬性非常多,比如時間戳,是否冒泡等,不同的屬性又可以實現不同的功能,有興趣的可以了解下Event對象的更多屬性

二、IE自定義JavaScript事件

  注意,以上方式只適用於谷歌,如果希望IE也能夠兼容,要並上兼容IE的方式。
  其中谷歌與IE的對應關系為:
  谷歌、火狐 IE

createEvent、initEvent    createEventObject
addEventListener    attachEvent
dispatchEvent    fireEvent

  IE自定義事件示例:

<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>javascript自定義事件</title>
<script type="text/javascript">
  //創建事件
  var ev = document.createEventObject();

  window.onload = function () {
    document.attachEvent('ondataavailable',function () { 
      alert("IE事件觸發!"); //IE
    }
    ); 
  }
</script>
</head>
<body>
  <div>
    <input type="button" value="觸發" onclick="document.fireEvent('ondataavailable', ev);" />
  </div>
</body>
</html>

三、兼容谷歌火狐IE的自定義事件

  要兼容谷歌火狐IE,那么按照上面的邏輯,那就是先判斷一下,如果是低版本IE,那么就使用低版本IE的函數或對象,否則就使用谷歌的事件對象。

<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>javascript自定義事件</title>
<script type="text/javascript">
  //創建事件
  var HtmlEvent;
  if (document.createEvent) {
    HtmlEvent = document.createEvent('HTMLEvents'); //谷歌、火狐創建新事件的寫法
    HtmlEvent.initEvent("Click", false, false);
  }
  else if (document.createEventObject) {
    HtmlEvent = document.createEventObject(); //舊版本IE的創建新事件的寫法
  }
  window.onload = function () {
    //監聽事件與綁定處理函數
    if (document.addEventListener) {
      document.addEventListener('Click', function (e) {
        alert("谷歌火狐、事件被觸發!"); //谷歌火狐的觸發事件
      }, false);
    } 
    else if(document.attachEvent) {
      document.attachEvent('ondataavailable', function () { 
        alert("IE事件觸發!"); }); //IE
      }
    }
  }

  function fire()
  {
    if (document.dispatchEvent) {
      document.dispatchEvent(HtmlEvent);
    }
    else if (document.fireEvent) {
      document.fireEvent('ondataavailable', HtmlEvent);
    }
  }
</script>
</head>
<body>
  <div>
    <input type="button" value="觸發" onclick="fire()" />
  </div>
</body>
</html>

 

四、觸發事件時向Listen傳參

  傳參的方式很簡單,直接在參數賦值在事件Event對象上就OK了,什么格式的都可以。

<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>javascript自定義事件</title>
<script type="text/javascript">
  //定義一個事件
  var ev = document.createEvent('HTMLEvents');
  window.onload = function () {
    //初始化事件
    ev.initEvent('listen', false, false);

    //監聽事件與綁定處理函數
    document.addEventListener("listen", function (e) {
      alert("傳過來的參數:" + e.name);
      }, false);
    }

    function fire()
    {
      ev.name = "劉備";
      document.dispatchEvent(ev);
    }
    </script>
  </head>
  <body>
    <div>
      <input type="button" value="觸發" id="btn1" onclick="fire()" />
    </div>
  </body>
</html>

五、jQuery的自定義事件的綁定與觸發

jQuery綁定與觸發自定義事件更加方便,而且兼容性更好。

<!DOCTYPE html>
<html>
<head>
<script src="http://libs.baidu.com/jquery/1.10.2/jquery.min.js">
</script>
<script>
    $(document).on("listen",function(event,a,b){
        alert(a + " " + b);
    });

    //第一個是自定義的事件名
    //第二個參數是一個數組
    //數組中的項會和自定義事件中回調的參數項對應
      $(function(){
      $('#btn1').click(function(){
          $(document).trigger("listen",["aa","bb"])
      });
    })
</script>
</head>
<body>
    <input type="button" id="btn1"  value="觸發"  />
</body>
</html>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM