jquery中$(document).on的一些疑惑

learn511 2013-12-09 09:44:40
jquery中用on来绑定事件,经常的写法有
$(document).on('click','.classname',function(){});
$('.classname').on('click',function(){});

上面两种都是给类是classname的元素添加了click事件,那这两个写法有什么区别呢?在效率上哪个更好呢?

同样的,
$(document).on('click','#idname',function(){});
$('#idname').on('click',function(){});

这个是个id为idname的原始 绑定click事件,这两种写法又有什么不同呢?

我的理解是$(document).on是把事件委托到了document上,$('#idname').on是把事件委托到了元素上面,那应该是后一种比较好,这种理解是对的吗?
...全文
22123 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
箫沐予 2016-07-07
  • 打赏
  • 举报
回复
正在今天遇到这问题,看了上面各位的回答,小小总结了下,顺便贴上来。 $(document).on是把事件委托到document上,$('className').on是把事件绑定到.className元素上。效率方面,直接绑定在元素上会更为高效,绑定在document上,每次document有点击动作,浏览器都会判断当前点击的对象,如果匹配,再决定要不要执行,多了一个判断的环节。但在目前开发中,JS渲染效率很高,所以此异同基本可以忽略不计。此外,针对$(document).on的触发特点,延伸一下,$("className").on为onclick绑定,只有在页面onload的时候执行一次,当页面刷新后,新加载的具有className的元素便没有事件绑定到上面了,相反$(document).on这种方法会刷新和重新赋予绑定操作,所以一定程度上更为全面。
Simon_9527 2016-04-06
  • 打赏
  • 举报
回复
$(document).on是把事件委托到了document上
$('#idname').on是把事件委托到了元素上面

区别:$('#idname').on 当页面动态刷新时,新加载的该id元素便没有事件绑定到上面了。 而第一个还可以让事件生效。例如:
$(document).on("click","#dynamicEle", function(e){
alert("some thing");
});
当dynamicEle动态刷新后事件还在。如果用onclick绑定则事件不存在了,因为onclick只在页面onload的时候执行一次,刷新后的dynamicEle已经不是原来的dynamicEle了。
qq_31292383 2015-12-14
  • 打赏
  • 举报
回复
在效率方面,个人觉得直接绑在元素上面要高些,毕竟绑在document上,每次document有点击动作,浏览器就会判断你当前点击的对象,如果匹配,然后才决定要不要执行,多了一个判断的环节,但是在一般开发中,js执行效率很高,这个判断动作很快,个人觉得影响不是很大,以上纯属个人看法
zhjdg 2013-12-09
  • 打赏
  • 举报
回复
像 绑的: document.onclick = function(e){ if(e.className == 'classname') { dofunction; } } 不绑的; classname 有elem1,elem2,elem3 elem1.onclick = dofunction; elem2.onclick = dofunction; elem3.onclick = dofunction;
learn511 2013-12-09
  • 打赏
  • 举报
回复
引用 2 楼 u012481201 的回复:
[quote=引用 1 楼 zzgzzg00 的回复:] 貌似就是你说的那样 不过好不好得看情况了啊
看情况是什么情况?[/quote] 那这个委托到document和直接绑定是什么差别呢? $(document).on('click','.classname',function(){}); 这种就是只绑定了一个事件,绑定到了document对象,这样理解对吗? 那如果是只对某个id元素绑定事件,$('#idname').on('click',function(){});这种是不是就更好呢?
zhjdg 2013-12-09
  • 打赏
  • 举报
回复
$(document).on是把事件委托到了document上 对的。 $('#idname').on是把事件委托到了元素上面 错的。 事件直接帮到#idname $('.classname').on('click',function(){}); 每一个有.classname的元素,绑一个click事件。 所以用$(document).on('click','.classname',function(){}); 比较好,
learn511 2013-12-09
  • 打赏
  • 举报
回复
引用 1 楼 zzgzzg00 的回复:
貌似就是你说的那样 不过好不好得看情况了啊
看情况是什么情况?
似梦飞花 2013-12-09
  • 打赏
  • 举报
回复
貌似就是你说的那样 不过好不好得看情况了啊
什么是SWFUpload?   SWFUpload是一个客户端文件上传工具,最初由Vinterwebb.se开发,它通过整合Flash与JavaScript技术为WEB开发者提供了一个具有丰富功能继而超越传统标签的文件上传模式。 [编辑本段]SWFUpload的主要特点   * 可以同时上传多个文件;   * 类似AJAX的无刷新上传;   * 可以显示上传进度;   * 良好的浏览器兼容性;   * 兼容其他JavaScript库 (例如:jQuery, Prototype等);   * 支持Flash 8和Flash 9;   SWFUpload不同于其他基于Flash构建的上传工具,它有着优雅的代码设计,开发者可以利用XHTML、CSS和JavaScript来随心所欲的定制它在浏览器下的外观;它还提供了一组简明的JavaScript事件,借助它们开发者可以方便的在文件上传过程更新页面内容来营造各种动态效果。   在使用SWFUpload之前,请确认你具备一定的JavaScript和DOM知识。在实际开发,大部分的错误都是由于错误的设置和低劣的Event Handlers处理程序所造成的。 [编辑本段]文档文翻译   http://www.v-sky.com/doc/swfupload/v2.1.0/Documentation.html [编辑本段]效果演示   * Classic Form Demo http://demo.swfupload.org/formsdemo ;   * Features Demo http://demo.swfupload.org/featuresdemo ;   * Application Demo http://demo.swfupload.org/applicationdemo ;   * v1.0.2 Plugin Demo http://demo.swfupload.org/v102demo ; [编辑本段]选择合适的Flash控件   在发行包(SWFUpload v2)含有2个版本的Flash控件(swfupload_f8.swf 与wfupload_f9.swf),其第一个版本拥有最佳的兼容性,但是为此损失了部分功能;而第二个版本提供了一些附加的功能但是损失了兼容性。 [编辑本段]SWFUpload的初始化与配置   首先,在页面引用SWFUpload.js ,如      然后,初始化SWFUpload ,如   var swfu;   window.onload = function () {   swfu = new SWFUpload({   upload_url : "http://www.swfupload.org/upload.php",   flash_url : "http://www.swfupload.org/swfupload_f9.swf", file_size_limit : "20480"   });   };   以下是一个标准的SWFUpload初始化设置所需的参数,你可以根据需要自己进行删减:   {   upload_url : "http://www.swfupload.org/upload.php", 处理上传请求的服务器端脚本URL   file_post_name : "Filedata", 是POST过去的$_FILES的数组名   post_params : {   "post_param_name_1" : "post_param_value_1",   "post_param_name_2" : "post_param_value_2",   "post_param_name_n" : "post_param_value_n"   },   file_types : "*.jpg;*.gif", 允许上传的文件类型   file_types_description: "Web Image Files", 文件类型描述   file_size_limit : "1024", 上传文件体积上限,单位MB   file_upload_limit : 10, 限定用户一次性最多上传多少个文件,在上传过程,该数字会累加,如果设置为“0”,则表示没有限制   file_queue_limit : 2, 上传队列数量限制,该项通常不需设置,会根据file_upload_limit自动赋值   fl

87,993

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧