jquery事件绑定的几种用法

常见的事件绑定的几种方法

主要有on(),bind(),live(),delegate(),随着版本的不断更新,live(),bind(),delegate()被相继弃用。
live():1.7版本之后被弃用
bind()、delegate():3.0版本之后被弃用
虽然在3.0之后的版本中有bind和delegate在,但在具体的实现上还是调用的on()

bind: function( types, data, fn ) {
        return this.on( types, null, data, fn );
    },
delegate: function( selector, types, data, fn ) {
        return this.on( types, selector, data, fn );
    },

本文主整理1.7之后的事件绑定有on(),one()
one():只执行一次并自动除
on():为当前选定的元素集附加事件处理方法,与之对应的解绑方法off();

 $(function () {
            $("p").on("click", function () {
                alert($(this).text())
            });
            $("button").click(function () {
                $("p").off("click");
            });
        });
});
 $(document).ready(function () {
            $("p").one("click", function () {
                $(this).animate({ fontSize: "+=6px" });
            });

            $("p").on("click", function () {
                $(this).animate({ fontSize: "+=6px" });
            });
        });

on()的使用(1.7和之后的版本)

on():为当前选定的元素集附加事件处理方法,与之对应的解绑方法off();
查看on的源码可以发现,on的方法中是调用EventListener来绑定的

语法: .on( events [, selector ] [, data ], handler )

参数 描述
events 必需。类型是字符串,由空格分隔多个事件值。
selector 可选。只能添加到指定的子元素上的事件处理程序(且不是选择器本身)。
data 可选。规定传递到函数的参数。
handler 规定当事件发生时运行的函数。允许为false,false被作为是一个函数return false的一个简写

demo:

function myHandler( event ) {
  alert( event.data.foo );
}
$( "p" ).on( "click", { foo: "bar" }, myHandler );

语法: .on( events [, selector ] [, data ] )

参数 描述
events 必需。类型是object,由空格分隔多个事件值。事件值是被事件调用的处理函数
selector    可选。只能添加到指定的子元素上的事件处理程序(且不是选择器本身)。
data 可选。规定传递到函数的参数。
handler 可选。规定当事件发生时运行的函数。允许为false,false被作为是一个函数return false的一个简写

demo:

$( "div.test" ).on({
  click: function() {
    $( this ).toggleClass( "active" );
  },
  mouseenter: function() {
    $( this ).addClass( "inside" );
  },
  mouseleave: function() {
    $( this ).removeClass( "inside" );
  }

直接和委托事件

  • 当on函数省略了selector参数或者selector为null时,那么事件被称为直接事件或直接绑定事件。每次选中的元素触发事件时,就会执行处理程序,不管它直接绑定在元素上,还是从后代(内部)元素冒泡到该元素的。
  • 当提供了selector参数时,事件被称为委托事件。事件不会在直接绑定的元素上触发,但当selector参数选择器匹配到后代(内部元素)的时候,事件处理函数才会被触发。

1、一些区别:

  1. 直接事件处理只能绑定在当前被选中的元素上,而且,在您的代码调用.on()的时候,他们必须在页面文档中已经存在。
  2. 委托事件除了可以给未创建的后代元素绑定事件外(即上面提到的优势),委托事件的另一个好处就是,当需要监视很多元素的时候,代理事件的开销更小
例子

下面的例子table有1,000行,给行上添加点击事件

<script type="text/javascript">
        $(function () {
            var tabledom = "";
            for (var i = 0; i < 10; i++) {
                tabledom += "<tr ><td>测试" + i + "</td></tr>";
            }
            $("#dataTable tbody").html(tabledom);

            $("#btnAddtr").click(function () {
                var html = ‘‘
                for (var i = 0; i < 10; i++) {
                    html += "<tr ><td>后添加行" + i + "</td></tr>";
                }
                $("#dataTable tbody").append(html)
            });

            //第一种事件绑定方式
            $("#dataTable tbody tr").click(function () {
                console.log("第一种方式点击:" + $(this).text());
            });
            // 第二种事件绑定方式
            $("#dataTable tbody").on("click", "tr", function () {
                console.log("第二种方式点击:" + $(this).text());
            });

        })
    </script>
 <table id="dataTable">
            <tbody></tbody>
        </table>
        <button id="btnAddtr">添加table行</button>

代码解释

  1. 事件会绑定到选中元素的所有子元素,如果一个div有1,000行,那么以下代码会将处理函数绑定到1,000个元素
$( "#dataTable tbody tr" ).on( "click", function() {
  console.log( $( this ).text() );
});

2.委派事件的方法只有一个元素的事件处理程序,tbody,并且事件只会向上冒泡一层(从被点击的tr 到 tbody ):

$("#dataTable tbody").on("click", "tr", function(event){
  console.log( $( this ).text() );
});

从图片中可以出例1绑定了1000次,例2只绑定了一次,内存开销例1也比例2的开销会比较大,因此在使用时,尽量使用代理事件。

3.后添加的行,使用第一种方式事件绑定无效,但是第二种方式点击事件有效

2、冒泡特性

默认情况下,大多数事件的冒泡从最初的event target(目标元素)开始的,直到document元素。每个元素都沿着DOM层级这条路,jQuery会调用任何匹配的已被绑定的事件处理程序。如果想要防止事件向上冒泡文档树(从而防止这些元素的处理程序运行)可以调用的event.stopPropagation()。但调用event.stopPropagation(),任何绑定到当前元素上的其他同类会继续运行,为了防止这种情况,可以调用event.stopImmediatePropagation()。

调用event.stopPropagation()能阻止事件的冒泡,但默认事件事件还会触发,需要调用event.preventDefault()。event.stopPropagation()和event.preventDefault()会从一个事件处理程序会自动返回false。也可以直接将 false 当作 handler 的参数,作为 function(){ return false; } 的简写形式。直接使用return false的时候冒泡和默认事件都会阻止。

总结:

  • event.stopPropagation(); 只阻止了冒泡事件, 默认行为没有阻止
  • event.stopImmediatePropagation() 阻止了冒泡事件, 默认行为没有阻止,另外还阻止了同类事件
  • event.preventDefault(); 只阻止了默认事件:a的跳转,冒泡事件没有阻止
  • return false; 冒泡事件和默认事件都阻止

以下是例子,可以查看效果

  <script>
        $(function () {
            $("a").click(function (event) {
                $("div").append("<p>父元素被点击</p>");
            })

            $("button").click(function (event) {
                $("#txtResult").append("<p>子按钮被点击</p>");
                // event.stopPropagation();  //只阻止了冒泡事件, 默认行为没有阻止
                // event.stopImmediatePropagation() //阻止了冒泡事件, 默认行为没有阻止,另外还阻止了同类事件
                // event.preventDefault();  //只阻止了默认事件:a的跳转,冒泡事件没有阻止
                //return false;   //冒泡事件和默认事件都阻止
            })
            $("button").click(function (event) {
                $("#txtResult").append("<p>其他事件被触发</p>");
            })
        })
    </script>
  
  <a href="http://www.baidu.com" target="_blank">超链接
        </br>
        <button>子按钮</button>
    </a>
    <div id="txtResult">
    </div>

3、其他

  • 多个事件绑定同一个函数
    function Print(type) {
            $("#txtResult").append("<p>" + type + "</p>")
        }
        ///-------------多个事件绑定同一个函数-----------------///
        $(function () {
            $("p").on("mouseover mouseout", function (event) {
                Print(event.originalEvent.type)
            });
        });
  • 多个事件绑定不同函数
  ///--------------多个事件绑定不同函数----------------///
        $(function () {
            $("p").on({
                mouseover: function (event) { Print(event.originalEvent.type) },
                mouseout: function (event) { Print(event.originalEvent.type) },
                click: function (event) { Print(event.originalEvent.type) }
            });
        });
  • 绑定自定义事件
  ///--------------绑定自定义事件----------------///
        $(function () {
            $("p").on("myOwnEvent", function (event, showName) {
                $("#txtResult").append(showName + "! What a beautiful name!");
            });
            $("button").click(function () {
                $("p").trigger("myOwnEvent", ["Hello"]);
            });
        });
  • 传递数据到函数
     ///--------------传递数据到函数----------------///
        $(function () {
            $("p").on("click", { msg: "clicked!" }, handlerName);
        });
        function handlerName(event) {
            alert(event.data.msg);
        }

原文地址:https://www.cnblogs.com/judyh/p/9979589.html

时间: 2024-10-12 08:20:11

jquery事件绑定的几种用法的相关文章

jQuery事件绑定的四种方法

jQuery中提供了四种绑定事件的方法,分别是bind.live.delegate.on,对应的解除监听的函数分别是unbind.die.undelegate.off: 一.on()方法(首选方法) on() 方法在被选元素及子元素上添加一个或多个事件处理程序. 自 jQuery 版本 1.7 起,on() 方法是 bind().live() 和 delegate() 方法的新的替代品.该方法给 API 带来很多便利,我们推荐使用该方法,它简化了 jQuery 代码库. 参数: event:必需

深入学习jQuery事件绑定

× 目录 [1]bind [2]trigger [3]delegate[4]on[5]one 前面的话 javascript有HTML.DOM0级.DOM2级和IE这四种事件处理程序,而jQuery对这四种事件处理程序进行了兼容处理,以更简单的方式就可以实现事件绑定.本文将详细介绍jQuery事件绑定 bind() bind()方法为一个元素绑定事件处理程序,有以下3种使用方法 bind(eventType[,eventData],handler(eventObject)) bind()方法可以

jQuery事件绑定on()、bind()、live()与delegate() 方法详解

jQuery事件绑定有四个方法,对应为on,off,bind,unbind,delegate,undelegate,live,die 比较和联系: 1.bind()函数只能针对已经存在的元素进行事件的设置:但是live(),on(),delegate()均支持未来新添加元素的事件设置: 2.bind()函数在jquery1.7版本以前比较受推崇,1.7版本出来之后,官方已经不推荐用bind(),替代函数为on(),这也是1.7版本新添加的函数,同样,可以 用来代替live()函数,live()函

jQuery事件绑定和委托实例

本文实例讲述了jQuery事件绑定和委托.分享给大家供大家参考.具体方法如下: jQuery事件的绑定和委托可以用多种方法实现,on()  . bind()  . live()  . delegate() ,还有one(). 有时我们可能会像下面这样绑定一个事件: 复制代码代码如下: $("#div1").click(function() {      alert("点击后触发");  }); 上面的事件绑定,我们可以通过多种方式去实现: 1. on() 复制代码代

jQuery事件绑定方法bind、 live、delegate和on的区别

我们试图绑定一些事件到DOM元素上的时候,我相信上面这4个方法是最常用的.而它们之间到底有什么不同呢?在什么场合下用什么方法是最有效的呢? 1.准备知识 当我们在开始的时候,有些知识是必须具备的: 1).DOM树 下图仅仅是一个示例,这是一个在browser环境下的一棵模拟DOM树,在下面的代码中仅起到演示的作用: 2).Event bubbling (aka event propagation)冒泡 我们的页面可以理解为一棵DOM树,当我们在叶子结点上做什么事情的时候(如click一个a元素)

JS中事件绑定的三种方式

以下是搜集的在JS中事件绑定的三种方式. 1. HTML onclick attribute <button type="button" id="upload" onclick="upload_file();"> 原文: http://www.w3school.com.cn/jsref/jsref_events.asp 2. jQuery .on() $(node).on("change", function(e)

事件绑定的第二种形式

一.过去,给一个对象绑定一个事件,来处理函数的形式,如obj.onclick=fn1,我们称之为事件绑定的第一种形式(赋值形式). 这种形式的有一种缺点就是:同一个对象的同一个事件不能同时处理两个不同的函数. 例如: function fn1(){ alert("A") } function fn2(){ alert("B") } document.onclick=fn1; document.onclick=fn2;//后面一个事件会覆盖前面一个事件 二.为了解决上

jquery 事件绑定案例

效果图公如下 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"> <head>  <meta http-equiv

事件绑定的几种常见方式

在项目开发中,经常遇到绑定事件不起作用,或者事件绑定多次,导致重复触发.为了应对所遇到的问题,上网查阅了一些资料,对事件绑定做了一些系统研究.##1.事件绑定的几种常见方式(以click事件为例) $(selector).click(function(){...}) $(selector).bind("click",function(){...}) $(selector).live("click",function(){...}) $(document).deleg