效果将是相同的,但事件处理程序传递事件的方式略有不同。
您.on()
在每种情况下都在使用,但在第二个版本中没有使用选择器。该事件在第一个实例中被委托,并在第二个实例中直接绑定。该.on()
文档指出:
对于直接事件,
每次在所选元素上发生事件时都会调用处理程序,无论它是直接发生在元素上还是来自后代(内部)元素的冒泡
对于委托事件,
当事件直接发生在绑定元素上时不会调用处理程序,而只会调用匹配选择器的后代(内部元素)
发生的情况是,当浏览器检测到一个事件时,它会弹出DOM
. 在向上的每个元素处,jQuery 将调用已附加的事件处理程序。在第一个版本中,事件一直传播到document
之前的 jQuery 检查事件是否源自class="wrapper1"
元素。第二个版本,如果事件在class="wrapper1"
元素上,事件将停止冒泡。
.wrapper1
另一个区别是,如果页面完成加载时不存在,第一个版本仍然能够绑定事件处理程序,即如果元素是动态添加的,则第二个版本将不起作用。当页面加载并且执行的 jQuery$('.wrapper1')
可能不存在时。
如果.wrapper1
元素不是动态的,那么您可能会发现使用第二个版本的(可忽略不计的)性能优势。
除此之外,该scroll
事件不会冒泡,也不能被委派。但是,可以从.on()
文档中再次委托它们:
在所有浏览器中,加载、滚动和错误事件(例如,在元素上)不会冒泡。在 Internet Explorer 8 及更低版本中,粘贴和重置事件不会冒泡。此类事件不支持与委托一起使用,但可以在事件处理程序直接附加到生成事件的元素时使用。
所以唯一可行的版本是第二个!请参阅DevTools 控制台中的演示,document scroll
输出永远不会出现。