js中事件绑定,$("body").on("click")与$("").click()区别

问题描述

js中事件绑定,$("body").on("click")与$("").click()区别
 <dl>
     <dt>性别</dt>
     <dd>
            <a href="javascript:void(0);" class="sex_icon set_icon"></a><p>男</p>
            <a href="javascript:void(0);" class="sex_icon set_icon"></a><p>女</p>
            <a href="javascript:void(0);" class="sexon_icon set_icon"></a><p>保密</p>
            </dd>
</dl>

这是一个选择 男、女、保密 的功能
但 下面的 js 一个有问题,一个成功:

有问题、有bug的:

 $(".sex_icon").click(function(){
        $(this).removeClass().addClass("sexon_icon set_icon").siblings("a").removeClass().addClass("sex_icon set_icon");
    });

    或者是:

    $(".sex_icon").click(function(){
        $(this).removeClass("sex_icon").addClass("sexon_icon").siblings("a").removeClass("sexon_icon").addClass("sex_icon");

    });

下面是成功的、无问题的:

 $("body").on("click",".sex_icon",function(){
         $(this).removeClass("sex_icon").addClass("sexon_icon").siblings("a").removeClass("sexon_icon").addClass("sex_icon");
    });

以上2种均在浏览器点击时无报错!
求大神 解释!它们有什么区别!!!

解决方案

你虽然你自己说了:"我点中的元素 添加被选中的样式"。但这不是你的问题的关键。你的问题的关键是哪些元素被绑定了click事件。你以为三个a标签都被绑定了click事件是吗?其实只有两个a标签被绑定了click事件,即男和女的这两个选项前面的a标签。因为它们都有sex_icon的class。你的保密选项因为没有sex_icon的class,所以没有被绑定click事件,后来它有了sex_icon的class,那是因为另外两个选项的点击事件代码里面给的。也就是动态给的sex_icon样式。但是element.click这种写法不支持给动态元素或者样式重新绑定事件。

支持给动态元素和属性绑定事件的是live和on,其中live在JQUERY 1.7之后就不推荐使用了。现在主要用on,使用on的时候也要注意,on前面的元素也必须在页面加载的时候就存在于dom里面。动态的元素或者样式等,可以放在on的第二个参数里面。

我做了一个在线演示,在你的click事件中添加了一个alert来显示点击的那个选项的内容,你会发现点击男或者女的时候,会有alert,但是点击保密的时候没有alert。希望这样的实例演示能帮助理解。

解决方案二:

http://www.cnblogs.com/weihengblogs/p/3433154.html

解决方案三:

这三个公共的class是set_icon吧,不是sex_icon

解决方案四:

参考jQuery 属性操作 - removeClass() 方法

removeClass() 方法从被选元素移除一个或多个类。
注释:如果没有规定参数,则该方法将从被选元素中删除所有类。

区别:
首先,如果没有给removeClass指定类,则移除这个元素的所有类。
其实,你一个是addClass("sexon_icon set_icon"),添加的是两个类,另一个是addClass("sexon_icon"), 添加的是一个类

参考Jquery .on() method not working on dynamic content
另外你说的 $(".sex_icon")这个如果没有反应,请先确定一下你的sex_icon这些元素是页面原先就有的还是动态添加到DOM上的。on前面的元素必须是在调用代码的时候已经存在。

解决方案五:

这个没反应很正常吧,你是把点击对象删除了,删除了,对象都不存在了怎么往后执行
你下面那个是因为点击的对象跟删除的对象不是同一个,当然可以成功

解决方案六:

应该是你放代码的位置有问题导致元素找不到,你放到$(function(){。。。。})里面没有,或者你的html代码后面

就你发的2个代码基本没有差别。。都是点击.sex_icon选中的元素时触发。。如果on没有指定selector,那么事件就只有body响应了。

API:http://api.jquery.com/on/

时间: 2024-10-27 03:04:37

js中事件绑定,$(&amp;quot;body&amp;quot;).on(&amp;quot;click&amp;quot;)与$(&amp;quot;&amp;quot;).click()区别的相关文章

JS中事件冒泡和事件捕获介绍_javascript技巧

谈起JavaScript的 事件,事件冒泡.事件捕获.阻止默认事件这三个话题,无论是面试还是在平时的工作中,都很难避免.事件捕获阶段:事件从最上一级标签开始往下查找,直到捕获到事件目标(target).事件冒泡阶段:事件从事件目标(target)开始,往上冒泡直到页面的最上一级标签. 1.冒泡事件: 事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发.通俗来讲就是,就是当设定了多个div的嵌套时:即建立了父子关系,当父div与子div共同加入了onclick事件时,

js中事件的处理与浏览器对象示例介绍_javascript技巧

复制代码 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>简单的事件处理</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta ht

node.js中事件通知机制的两个应用场景

应用场景 上篇博客介绍了几个EventEmitter的API使用,简单高效,有利于解耦业务逻辑. 通过once()方法解决雪崩问题 在事件订阅/发布模式中,通过once()方法注册的侦听器只会被执行一次,在执行之后会将它与事件的关联移除.实际开发中可以利用这点过滤一些重复性的事件响应. 例如在高访问量和大并发量的情况下,以下直接的写法可能导致数据库无法同时承受,进而影响到网站整体的响应调用: var select = function(callback){    db.select("SQL&q

js自定义事件及事件交互原理概述(一)_javascript技巧

在JS中事件是JS与浏览器交互的主要途径.事件是一种叫做观察者的设计模式,这是一种创建松散耦合代码的技术.对象可以发布事件,用来表示在该对象生命周期中某个有趣的时刻到了.然后其他对象可以观察该对象,等待这些有趣的时刻到来并通过运行代码来响应. 观察者模式有两类对象组成:主题和观察者.主体负责发布事件,同时观察者通过订阅这些事件来观察该主体.该模式的一个关键概念是主体并不知道观察者的任何事情,也就是说它可以独自存在并正常运作即使观察者不存在.从另一方面说,观察者知道主体并能注册事件的回调函数(事件

zepto.js中tap事件阻止冒泡的实现方法

 这篇文章主要介绍了zepto.js中tap事件阻止冒泡的实现方法,实例分析了由冒泡产生的click延迟解决方法,需要的朋友可以参考下     本文实例讲述了zepto.js中tap事件阻止冒泡的实现方法.分享给大家供大家参考.具体如下: 最近在弄一个手机版的网站,本来想用jQuery Mobile,但文件太大了,所以用了zepto.js 由于移动网页中使用click事件会有延迟,所以就用上了zepto.js中的tap事件. 使用click事件可以使用stopPropagation来阻止冒泡,但

new- 在js中引入movieClip后 button点击事件里的for循环失效!

问题描述 在js中引入movieClip后 button点击事件里的for循环失效! /** * Created by Administrator on 2015/5/27. */ var stage,image,btn1,btn2; var image_x = 200; var image_y = 20; var step_x; var step_y; var arr_x_r = []; var arr_x_l = []; var arr_y = []; var arry = []; wind

JS中的事件冒泡与捕获

刚接触 JS 的那个时候,啥也不懂,只想着如何利用 Google.百度到的函数来解决实际的问题,不会想到去一探究竟. 渐渐的,对 JS 的语言的不断深入,有机会去了解一些原理性东西.最近在看 JQuery 源码,感触很多,总想着用原生的 JS 去实现自己的一个 JQuery 库.说实在的,JQuery 里面很多函数和思路,是千百开源工作者长期的贡献,哪能是短时间就能消化的了. 最近再次碰到 addEventListener函数(MDN 上关于 addEventListener 的介绍,很详细),

JS中批量给元素绑定事件过程中的相关问题使用闭包解决_jquery

在JS中,你写一个for循环的时候,内部的循环变量I其实是会保存在它运行的函数或类内的,所以你会发现你给元素批量绑定事件的时候,出现i=最后一个循环变量的值,这就很坑爹啊,解决的方案有2钟, 思路就是:把这个循环变量保存起来,不要让它的作用域在整个函数,而是在循环体内 1.使用闭包(如果你不懂闭包,请打开百度:www.baidu.com) 2.使用with关键字,with语法是with( obj ) { //使得可以在此直接访问obj的属性,而不用加obj.XXX } 代码示例: 复制代码 代码

Node.js中HTTP模块与事件模块详解_node.js

Node.js的http服务器 通过使用HTTP模块的低级API,Node.js允许我们创建服务器和客户端.刚开始学node的时候,我们都会遇到如下代码: 复制代码 代码如下: var http = require('http'); http.createServer(function (req,res) {     res.end('Hello World\n'); }).listen(3000,"127.0.0.1"); console.log("Server funni