JavaScript---事件綁定 (多種方式、傳遞參數)


事件綁定方式:將對html元素或窗口的操作綁定給響應函數的方式。共四種方式

  • Html級別綁定
  • 符合DOM0  級的事件綁定方式
  • 符合DOM2

Html級別綁定

無法設置事件流

<script>
    function a(){
        //好的習慣,把整個網頁上所有的事件綁定程序,聚集在一個函數中
        alert("nihao");
    }
</script>
<input type="button" value="html級別綁定方式" onclick="a()" />

 

符合DOM0  級的事件綁定方式

將響應程序直接賦值給dom元素的事件屬性。這是DOM最早版本的事件綁定方式,被所有瀏覽器兼容

無法設置事件流

1、是用普通函數作為響應程序

document.getElementById("btn1").onclick = sayHellow;    不要帶(), 帶着()表示直接調用·

<h2>DOM0級別的綁定方式</h2>
<input type="button" id="btn1" value="DOM0級別的綁定方式" />
<script>
    window.onload=function(){
        document.getElementById("btn1").onclick = sayHellow; //注意不要帶()
    }
    
    function sayHellow(){
        alert("hi==")
    }
</script>

  

2、是用匿名函數作為響應程序

document.getElementById("btn2").onclick = function(){ alert("hi:"+this.id) }
或者
document.getElementById("btn2").onclick = _ => console.log("hi123ID:"+this);  //參考我的博客:JavaScript箭頭函數(Lambda表達式)

 彈出 : btn1

特點:

  1. 在響應函數中this代表目標元素(當前的button對象)
  2. 不符合DOM2標准,無法設定事件流
  3. 無法直接傳遞參數,但可以通過其他方式傳遞
  4. 對同一個事件只能綁定一個響應函數,最后綁定的響應函數會執行
  5. 通過 obj.onxx = null 可以解除綁定。

總結:可以使用匿名函數或普通函數作為響應函數

 

傳遞參數的方式:

 

傳遞參數的方法1 ---將參數 作為屬性賦 給事件源

<input type="button" id="btn3" workerNum=987 value="屬性傳遞參數" />
document.getElementById("btn3").onclick = function(){ alert("hi:"+this.getAttribute("workerNum")); }

 

傳遞參數方法2

使用綁定函數,專門設置一個函數,實現兩重調用(綁定)

 

        <input type="button" id="btn4" workerNum="==屬性參數==" value="動態綁定事件並傳遞參數" />

        //綁定函數
        bindEvent(document.getElementById("btn4"),"onclick",onclickWorker,"btn=123");
        
        //響應函數
        function  onclickWorker(wNum){ alert("工號為:"+ wNum); }
        
        //執行事件綁定,將參數傳給事件源
        function bindEvent(dom, eventType , fun ,args){
            dom[eventType] = handleEvent;
            function handleEvent(){ //閉包
                fun.call(this,args);  //給響應函數的 this 指針賦值為 dom
            }
        }

其實綜合起來就是一句話:document.getElementById("btn4")["onclick"]= _ => onclickWorker("99999”);

 

傳遞參數方法3

JS中的call、apply、bind方法詳解

符合DOM2級別的事件綁定方式:(不兼容)

綁定后可以設定事件流的順序,順序為綁定順序。

格式:addEventListener("eventType",callback,use-capture);

  1. eventTye:事件名稱。 click 省略on
  2. callback:事件處理方法
  3. use-capture:false-->冒泡階段/ture-->捕獲階段。

ps:大多數情況下,都是將事件處理程序添加到事件流的冒泡階段,這樣可以最大限度地兼容各種瀏覽器

 

//瀏覽器可以自動傳入一個對象 event對象
/*document.getElementById("outerDiv").addEventListener("click" , function(){
        //執行語句
})*/ //匿名函數方式
                
document.getElementById("outerDiv").addEventListener("click" ,handleEvent ); //綁定函數方式

 

特點 :

可以使用匿名函數或普通函數

響應函數中this代表目標函數

可以設定事件流

無法傳遞參數,通過其他方式傳遞

對同一個事件可以綁定多個形影函數,響應函數執行順序依據綁定順序

建議使用jquery 的on方法 解決綁定函數兼容方式

1、可以傳遞參數

2、實現了事件委托

3、on方法可以實現事件流控制

4、在一般的瀏覽器都兼容

 

出處:https://my.oschina.net/u/2991733/blog/800883

 

=======================================================================================

JavaScript綁定事件的方法[3種]

要想讓 JavaScript 對用戶的操作作出響應,首先要對 DOM 元素綁定"事件處理函數"。所謂事件處理函數,就是處理用戶操作的函數,不同的操作對應不同的名稱。

在JavaScript中,有三種常用的綁定事件的方法:

  1. 在DOM元素中直接綁定;
  2. 在JavaScript代碼中綁定;
  3. 綁定事件監聽函數。

一. 在DOM元素中直接綁定

一. 在DOM元素中直接綁定這里的DOM元素,可以理解為HTML標簽。JavaScript支持在標簽中直接綁定事件,語法為:
    onXXX="JavaScript Code"

其中:

  • onXXX 為事件名稱。例如,鼠標單擊事件 onclick ,鼠標雙擊事件 ondouble,鼠標移入事件 onmouseover,鼠標移出事件 onmouseout 等。
  • JavaScript Code 為處理事件的JavaScript代碼,一般是函數。


例如,單擊一個按鈕,彈出警告框的代碼有如下兩種寫法。

1. 原生函數

?
1
<input  onclick= "alert('謝謝支持')"  type= "button"  value= "點擊我,彈出警告框" />

 2. 自定義函數

?
1
2
3
4
5
6
<input  onclick= "myAlert()"  type= "button"  value= "點擊我,彈出警告框" />
<script type= "text/javascript" >
function myAlert(){
     alert( "謝謝支持" );
}
</script>

 

2. this在第一種綁定方式中的用法。this作為形式參數

?
 
<input  type= 'button' onclick= 'ClickOn(this)' >
function ClickOn(self){
   //self 就代指當前點擊的標簽
}

 

實例:

?
 
<!DOCTYPE html>
<html lang= "en" >
<head>
     <meta charset= "UTF-8" >
     <title>Title</title>
</head>
<body>
     <input type= "button" value= "點我" onclick= "myClick(this)" />
     <script>
         function myClick(ths){
         ths.style.backgroundColor= "red" ;
     }
     </script>
</body>
</html>

 效果:

 

 

 

二. 在JavaScript代碼中綁定

在JavaScript代碼中(即<script>標簽內)綁定事件可以使JavaScript代碼與HTML標簽分離,文檔結構清晰,便於管理和開發。

在JavaScript代碼中綁定事件的語法為:
elementObject.onXXX=function(){     // 事件處理代碼 }

其中:

  • elementObject 為DOM對象,即DOM元素。
  • onXXX 為事件名稱。


例如,為 id="demo" 的按鈕綁定一個事件,顯示它的 type 屬性:

 

?
1
2
3
4
5
6
<input  id= "demo"  type= "button"  value= "點擊我,顯示 type 屬性" />
<script type= "text/javascript" >
document.getElementById( "demo" ).onclick= function (){
     alert( this .getAttribute( "type" ));  //  this 指當前發生事件的HTML元素,這里是<input>標簽
}
</script>

 

 this在第二種綁定方式中的應用: 

?
1
2
3
4
5
6
7
<input id= 'i1' type= 'button' >
 
document.getElementById( 'i1' ).onclick= function (){
 
this // 這里的this代指當前點擊的標簽
 
}

 

三. 綁定事件監聽函數

 綁定事件的另一種方法是用 addEventListener() 或 attachEvent() 來綁定事件監聽函數。

addEventListener()函數語法:
elementObject.addEventListener(eventName,handle,useCapture);

addEventListener()是標准的綁定事件監聽函數的方法,是W3C所支持的,Chrome、FireFox、Opera、Safari、IE9.0及其以上版本都支持該函數。

參數 說明
elementObject DOM對象(即DOM元素)。
eventName 事件名稱。注意,這里的事件名稱沒有“ on ”,如鼠標單擊事件 click ,鼠標雙擊事件 doubleclick ,鼠標移入事件 mouseover,鼠標移出事件 mouseout 等。
handle 事件句柄函數,即用來處理事件的函數。
useCapture Boolean類型,是否使用捕獲,一般用false 。true:捕獲模型;false:冒泡模型


useCapture: false,  true 的實例效果探索

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!DOCTYPE html>
<html lang= "en" >
<head>
     <meta charset= "UTF-8" >
     <title>Title</title>
</head>
<style>
     #main{
     background-color:red;
     width:300px;
     height:400px;
     }
     #content{
     background-color:pink;
     width:150px;
     height:200px;
     }
</style>
<body>
 
     <div id= "main" >
         <div id= "content" ></div>
     </div>
     <script>
         var mymain=document.getElementById( "main" );
         var mycontent=document.getElementById( "content" );
         mymain.addEventListener( "click" , function (){console.log( "main" )}, false );
         mycontent.addEventListener( "click" , function (){console.log( "content" )}, false );
 
     </script>
</body>
</html>

 

 false 效果,從內往外出來,所以是content先出來:

 

true效果,從外往內出來,所以是main先出來:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!DOCTYPE html>
<html lang= "en" >
<head>
     <meta charset= "UTF-8" >
     <title>Title</title>
</head>
<style>
     #main{
     background-color:red;
     width:300px;
     height:400px;
     }
     #content{
     background-color:pink;
     width:150px;
     height:200px;
     }
</style>
<body>
 
     <div id= "main" >
         <div id= "content" ></div>
     </div>
     <script>
         var mymain=document.getElementById( "main" );
         var mycontent=document.getElementById( "content" );
         mymain.addEventListener( "click" , function (){console.log( "main" )}, true );
         mycontent.addEventListener( "click" , function (){console.log( "content" )}, true );
 
     </script>
</body>
</html>

 效果圖:

 

 

 

出處:https://www.cnblogs.com/momo8238/p/7449437.html

=======================================================================================

JavaScript 事件屬性綁定帶參數的函數

在JavaScript中,為了實現表現和控制相分離,可以通過0級的DOM事件屬性或者2級的事件模型來實現,不過這兩者在針對某個事件類型調用相應的事件句柄的時候,不能給事件句柄提供參數,也就是說,事件屬性的值只能是一個函數引用。
例如不能采用以下這種調用方式:
element.onclick = test();
element.onclick = test(arg1,arg2);
只能通過:element.onclick = function(){ ... }; 
或者element.onclick = test這種方式來實現,所以無法給函數傳遞參數。
參考了大量的網上資料,解決這個問題的方式,以代碼為例,如下所示:

 

function Handler() {};
Handler.prototype = {
    /*
     * 把eventType類型的事件綁定到element元素,並使用handler事件句柄進行處理
     * 兼容 IE 及 Firefox 等瀏覽器
     *
     * @param element 在其上注冊事件的對象(Object)
     * @param eventType 注冊的事件類型(String),不加“on”
     * @param handler 事件句柄(Function)
     */
    registerEvent: function(element, eventType, handler) {
        if (element.attachEvent) { //2級DOM的事件處理
            element.attachEvent('on' + eventType, handler);
        } else if (element.addEventListener) {
            element.addEventListener(eventType, handler, false);
        } else { //0級DOM的事件處理
            element['on' + eventType] = handler;
        }
    },
    /*
     * 獲得帶參數的事件句柄的引用
     *
     * @param obj 需要綁定事件處理函數的所有者,null 表示 window 對象
     * @param func 需要綁定的事件處理函數名
     * @param ... 第三個參數開始為綁定事件處理函數的參數,由 0 到多個構成
     */
    bind: function(obj, handler) {
        obj = obj || window;
        var args = [];
        for (var i = 2; i < arguments.length; i++) {
            args.push(arguments[i]);
        }
        return function() {
            handler.apply(obj, args)
        };
    }
}可能是使用方式為:

function show(txtObj) {
    alert(txtObj.value);
    txtObj.focus();
    txtObj.select();
}
window.onload = function() {
    var handler = new Handler();
    handler.registerEvent($("txt"), "change", handler.bind(null, show, $("txt"))); //采用2級事件模型的方式
    //$("txt").onchange = handler.bind(null,show,$("txt"));//JavaScript事件屬性的方式
}

 

 
 

 

出處:https://www.jb51.net/article/17463.htm

====================================================================================

功能優化

根據上面的提示,我自己進行了優化,用在自己的項目上。

方便使用,接口方法統一,優化后的代碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>

<body>
 
 <input type="text" id='txt' placeholder="請輸入關鍵詞" />
 <input type="button" id="btn1" value="綁定事件函數()" />
 <input type="button" id="btn2" value="綁定事件函數(參數)" />
 
<script>
    
    function Handler() {};
    Handler.prototype = {
        /* 
         * 把eventType類型的事件綁定到element元素,並使用handler事件句柄進行處理
         * 兼容 IE 及 Firefox 等瀏覽器
         *
         * @param element 在其上注冊事件的對象(Object)
         * @param eventType 注冊的事件類型(String)
         * @param fun 事件句柄(Function)
         */
        registerEvent: function(element, eventType, fun) {
            eventType = (eventType.toLowerCase().startsWith("on")?"":"on")+eventType;
            var args = [element,fun];
            for (var i = 3; i < arguments.length; i++) {
                args.push(arguments[i]);
            }
            handler = this.bindFun.apply(null,args);
            if (element.attachEvent) { //2級DOM的事件處理 
                element.attachEvent(eventType, handler);
            } else if (element.addEventListener) {
                element.addEventListener(eventType.substring(2), handler, false);
            } else { //0級DOM的事件處理 
                element[eventType] = handler;
            }
        },
        /* 
         * 獲得帶參數的事件句柄的引用
         *
         * @param obj 需要綁定事件處理函數的所有者,null 表示 window 對象
         * @param func 需要綁定的事件處理函數名
         * @param ... 第三個參數開始為綁定事件處理函數的參數,由 0 到多個構成
         */
        bindFun: function(obj, handler) {
            //console.log(this);
            obj = obj || window;
            var args = [];
            for (var i = 2; i < arguments.length; i++) {
                args.push(arguments[i]);
            }
            return function() {
                handler.apply(obj, args)
            };
        }
    }

    //使用方式為:
    function show(txtObj) {
        var str="normal";
        str=txtObj?.id;
        for (var i = 1; i < arguments.length; i++) {
            str+="\r\n"+arguments[i];
        }
        alert(str);
        //txtObj.focus();
        //txtObj.select();
    }
    window.onload = function() {
        var handler = new Handler();
        var dom=document.getElementById("txt");
        handler.registerEvent(dom, "onchange", show, dom,0,1,2,3);  //采用2級事件模型的方式 
        //dom.onchange = handler.bindFun(null,show,dom,'1111',"aa");  //JavaScript事件屬性的方式 
        
        dom=document.getElementById("btn1");
        handler.registerEvent(dom, "click", show, dom);
        dom=document.getElementById("btn2");
        handler.registerEvent(dom, "click", show,dom,1,2,3,4,5);
    }
 
</script>
</body>
</html>
View Code

 


免責聲明!

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



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