理解jquery的.on()方法

jquery在的.on()方法用来给元素绑定事件处理函数的,我经常用在两个地方:

  • 给未来的元素绑定事件:我总是这样用:$(document).on(‘click‘,‘#div1‘,function(){});
  • 给拥有同一个父元素的多个子元素绑定事件。

可以查看以前写的博客:jQuery中对未来的元素绑定事件

先来看一个实例:

在页面A的一个div里动态加载页面B,页面B里的一个div绑定了一个单击事件。

页面A如下:

<body>
<input type="button" name="" id="btn1" value="load含事件的页面B" />
<input type="button" name="" id="btn2" value="load随便一个别的页面" />
<div id="content"  style="height:300px;width:80%;"></div>
<script src="http://common.cnblogs.com/script/jquery.js" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
    $(‘#btn1‘).click(function(){
        $(‘#content‘).load(‘B.html‘);
    })
    $(‘#btn2‘).click(function(){
        $(‘#content‘).load(‘justForShowSomething.html‘);
    })
})
</script>
</body>
</html>

页面B如下:

<style>
.box {width: 200px;height: 50px;background: green;}
.added{background: gray;color:white; }
</style>
</head>
<body>
    <div class=‘box‘></div>
</body>
<script src="http://common.cnblogs.com/script/jquery.js" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
   $(document).on(‘click‘,‘.added‘,function(){alert(‘clicked‘);})
   $(‘.box‘).append("<div class=‘added‘>我是用.on方式绑定了事件的节点,click我会有事件</div>");
})
</script>
</html>

运行实例

发现问题:第一次load页面B,单击.added,会alert一次;再次load页面B,单击.added,会alert两次;即使中间load过另一个页面。即页面B多次绑定了相同的点击事件。

效果同下面这样是一样的:

$(‘#btn1‘).click(function(){alert(1);})
$(‘#btn1‘).click(function(){alert(2);})
$(‘#btn1‘).click(function(){alert(3);})
//如此这般,单击btn1,会依次弹出1、2、3

上述问题就算不理解是怎么回事也可以通过每次绑定事件前先解除事件来解决:$(document).off(‘click‘,‘.added‘);

本来我认为每次重新加载页面B时,由于之前的.added节点不存在了,自然之前绑定的事件也就不存在,奇怪为什么事件还会保留?原因是没有理解.on()用法。

实例中:$(document).on(‘click‘,‘.added‘,f)事件并不是绑定到.added元素上,而是绑定到document对象上(所以.on()才能给未来的元素绑定事件)。单击.added时因为会事件冒泡到document从而触发事件。load的页面B中的$(document)获取的其实是页面A的document对象(如果页面B是嵌入到iframe标签中,则页面B中的$(document)是指它自己的document对象),所以多次加载页面B的话,就会给页面A的document对象重复注册事件。

解决方法:把$(document).on(‘click‘,‘.added‘,f)中的document换成自己页面里的一个已经存在的父节点就可以了。这样就可以每次重新load页面时,由于之前的那个父节点不存在了,自然之前绑定的事件也就不存在。

如页面B中修改为:

 $(‘.box‘).on(‘click‘,‘.added‘,function(){alert(‘clicked‘);})

理解jquery的.on()方法

时间: 2024-08-01 10:30:08

理解jquery的.on()方法的相关文章

深度理解Jquery 中 scrollTop() 方法

这是工作遇到scrollTop() 方法.为了强化自己,把它记录在博客园当中. 下面就开始scrollTop 用法讲解: scrollTop() 定义和用法 scrollTop() 方法设置或返回被选元素的[垂直滚动条位置]. Note: 当滚动条位置位于最顶部时,位置是0:当用于返回位置时:    该方法返回 第一个匹配元素的滚动条的垂直位置.当用于设置位置时:    该方法设置 所有匹配元素的滚动条的垂直位置. scrollTop() 语法 返回滚动条位置 $(selector).scrol

深度理解Jquery 中 offset() 方法

多说无益,现在就开始! 一.语法 1. 返回偏移坐标 $(selector).offset(); top: $(selector).offset().top; left: $(selector).offset().left; 2.设置偏移坐标: $(selector).offset({top:value,left:value}); 参数的含义:{top:value,left:value}     当设置偏移时是必需的.规定以像素为单位的 top 和 left 坐标. 可能的值:(1).名/值对,

理解一下jQuery.extend()和jQuery.fn.extend()方法

为了方便用户创建插件,jquery提供了jQuery.extend()和jQuery.fn.extend()方法.1. jQuery.extend() 方法有一个重载. jQuery.extend(object) ,一个参数的用于扩展jQuery类本身,也就是用来在jQuery类/命名空间上增加新函数,或者叫静态方法,例如jQuery内置的 ajax方法都是用 jQuery.ajax()这样调用的,有点像 "类名.方法名" 静态方法的调用方式.下面我们也来写个jQuery.extend

理解jquery的$.extend()、$.fn和$.fn.extend()

jQuery.fn jQuery.fn = jQuery.prototype = { init: function( selector, context ) {//-. //-- }; 原来 jQuery.fn = jQuery.prototype.对prototype肯定不会陌生啦. 虽然 javascript 没有明确的类的概念,但是用类来理解它,会更方便. jQuery便是一个封装得非常好的类,比如我们用 语句 $("#btn1″) 会生成一个 jQuery类的实例. jQuery.ext

jQuery - DOM 元素方法

jQuery DOM 元素方法 - get() 方法 实例 获得第一个 p 元素的名称和值: <script type="text/javascript">   $(document).ready(function(){   $("button").click(function(){   x=$("p").get(0);   $("div").text(x.nodeName + ": " + x

jQuery常用工具方法

前面的话 jQuery提供一些与元素无关的工具方法,不必选中元素,就可以直接使用这些方法.如果理解原生javascript的继承原理,那么就能理解工具方法的实质.它是定义在jQuery构造函数上的方法,即jQuery.method(),所以可以直接使用.而那些操作元素的方法,是定义在构造函数的prototype对象上的方法,即jQuery.prototype.method(),所以必须生成实例(即选中元素)后使用.把工具方法理解成像javascript原生函数那样可以直接使用的方法就行了.下面将

深入理解jQuery、Angular、node中的Promise

最初遇到Promise是在jQuery中,在jQuery1.5版本中引入了Deferred Object,这个异步队列模块用于实现异步任务和回调函数的解耦.为ajax模块.队列模块.ready事件提供基础功能.在用jQuery操作DOM的时候对Promise的使用欲不够强烈,最近学习node和Angular,需要用js写业务逻辑和数据操作代码的时候这种场景需求就出来了.一般来说事件适合在交互场景中运用,因为用户的行为本来就是分散的,而promise这样的流程控制适合在后台逻辑中处理业务. //j

jQuery的extend方法

jq中的extend在面试中经常会被问道,今天我总结一个下有关于extend的用法三种进行对比,可能不全,希望大家指点, 用法一: $.extend({})  ,为jQuery类添加方法,可以理解为扩展静态方法 用法二:$.fn.extend({})  插件,对jQuery.prototype进行扩展,提到插件那么就得说一下另一种方法$.fn.method = function(){} 1. $.fn.method = function(){} 可以定义一个方法 2 . $.fn.extend(

为Jquery类和Jquery对象扩展方法

jquery.fn.extend与jquery.extend jQuery为开发插件提拱了两个方法,分别是: JavaScript代码 jQuery.fn.extend(object); jQuery.extend(object); jQuery.extend(object); 为扩展jQuery类本身.为类添加新的方法. jQuery.fn.extend(object);给jQuery对象添加方法. fn 是什么东西呢.查看jQuery代码,就不难发现. JavaScript代码 jQuery