- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下在 JQuery 中附加事件处理程序的方法有什么区别?
(function () {
var $body = $("body");
$('button').click(function () {
console.log(this) + " - 1";
});
$('button').on('click', function () {
console.log(this) + " - 2";
});
$(document).on('click', 'button', function () {
console.log(this) + " - 3";
});
$body.on('click', 'button', function () {
console.log(this) + " - 4";
});
$body.find('button').on('click', function () {
console.log(this) + " - 5";
});
})();
我发现在某些情况下,一种似乎有效,另一种则无效。例如下面的处理程序 2,不工作,而处理程序 1 工作。为了完成这项工作,我必须实现Handler 3,这显然效率较低。
$retrieveCust = $("#bxRetrieveCustomer");
// Handler 1
$retrieveCust.find(".icoX").on("click", function () {
// DO SOMETHING
});
// Handler 2
$retrieveCust.find(".tag-open").on("click", function () {
// DO SOMETHING
});
// Handler 3
$(document).on("click", ".tag-open", function (event) {
// DO SOMETHING
});
这是 HTML
<div class="box" id="bxRetrieveCustomer">
<h1>RETREIVE CUSTOMER</h1>
<div class="icoX">X</div>
<div class="box-liner10">
<table>
<tr>
<th>First Name</th>
<th>Last Name</th>
<th>Date of Birth</th>
<th>Email</th>
<th>password</th>
<th></th>
</tr>
<!-- ko foreach: Customers -->
<tr>
<td data-bind="text: FirstName"></td>
<td data-bind="text: LastName"></td>
<td data-bind="text: DateOfBirth"></td>
<td data-bind="text: Email"></td>
<td data-bind="text: Pwd"></td>
<td><a class="tag-open"></a></td>
</tr>
<!-- /ko -->
</table>
</div>
</div>
最佳答案
我的猜测是,您看到的行为有所不同,因为页面中的某些对象是动态添加/删除的,并且您需要委托(delegate)事件处理才能自动为新添加的对象提供事件。
在您的各种示例中,有两种基本的行为类型:
$('button').click(function () {
console.log(this) + " - 1";
});
$('button').on('click', function () {
console.log(this) + " - 2";
});
$body.find('button').on('click', function () {
console.log(this) + " - 5";
});
以上三个都将点击处理程序直接附加到代码首次运行时页面中存在的每个按钮对象。这些基本上是相同的。 .click()
语法只是一个快捷方式。 $body.find('button')
在功能上等同于 $('button')
,因为两者都选择正文中的所有按钮。
注意:这些事件处理程序只会附加到首次运行此代码时存在的按钮对象。随后添加到文档中的任何按钮对象都不会附加事件处理程序。
$(document).on('click', 'button', function () {
console.log(this) + " - 3";
});
$(document.body).on('click', 'button', function () {
console.log(this) + " - 4";
});
这两个使用委托(delegate)事件处理来监视冒泡到文档或正文对象的点击。这些同样相似。这些将处理源自按钮标签的任何点击事件。由于事件处理程序没有直接附加到按钮对象,因此按钮可以在页面中来来去去,并且任何时候存在的所有按钮对象都将获得此处理程序行为。
通常不建议将委托(delegate)方法绑定(bind)到 document
或 body
对象。事实上,这就是 .live()
已被弃用的原因,因为它就是这样做的,并且可能会导致性能问题。问题是,如果您获得大量委托(delegate)事件都绑定(bind)到同一个对象,那么每次事件发生并且它冒泡到该对象时,jQuery 都必须将原始选择器与许多不同的选择器进行比较,以了解要使用哪个处理程序打电话。
将委托(delegate)事件绑定(bind)到尽可能接近实际目标对象的父对象要好得多,但显然您必须选择一个不会添加/删除的父对象(您需要一个不断变化的父对象)在页面中)。
在更具体的代码示例中,假设 bxRetrieveCustomer
div 不是动态创建的,您应该更改此设置:
$(document).on("click", ".tag-open", function (event) {
// DO SOMETHING
});
对此:
$("#bxRetrieveCustomer").on("click", ".tag-open", function (event) {
// DO SOMETHING
});
这仍然是委派事件处理,但会将事件处理程序绑定(bind)得更接近实际对象,因此它会更有效地工作。
至于哪一个最好,取决于:
如果您有在运行希望事件绑定(bind)到的事件绑定(bind)代码后创建的对象,那么您将需要对最近的祖先对象(不是事后动态创建的对象)使用委托(delegate)事件处理。
如果您有大量对象(即使它们是静态的),则委托(delegate)事件处理的安装效率会更高,因为它为所有对象安装一个事件处理程序,而不是为每个单独的对象安装数千个事件处理程序。
如果您有中等或少量的静态对象,则将事件处理程序直接绑定(bind)到它们是最有效的。最初将事件处理程序绑定(bind)到每个对象会花费一点时间,但随后在事件发生时效率最高。
关于JQuery 事件处理程序 - "Best"方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9730277/
上下文 我有一个日间 TUMBLINGWINDOW(类似于下面所示的) SELECT DATEADD(day, -1, System.Timestamp()) AS WindowStart
因此,我正在开发一个非常小的 Web 组件,以作为更大的设计系统的一部分。 我对网络组件的使用有点陌生,但我知道这个特定的网络组件可以在一个布局中使用很多很多次。 此 Web 组件控制在传递给它的任何
我刚刚开发了一个 Android 应用程序(minSdkVersion 23/targetSdkVersion 29),可以连接到 BluetoothLE 设备以定期获取数据。 现在,在 MainAc
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
我一直在阅读有关 Airplay SDK 和 Dragonfire SDK 的内容。这些是在没有 Mac 的情况下进行 iphone 开发的合法选择吗?大家有更好的解决办法吗? 最佳答案 由于签名等原
我正在考虑使用 DTO 而不是传递我的域对象。我在这里和其他地方都读过几篇文章,我知道有几种方法可以完成这项工作。 如果我总共只有大约 10 个域类,并且考虑到我想在我的 View (WPF 前端)中
我的问题是,如果我有一个列表 list = [1,2,3,4,5,6,7] 如果我想知道这个列表中元素的数量,是len(list) 或 list.count 更好的选择?还是 .count 仅适用于来
我想知道 Django Rest Framework 的最佳实践。我一直通过每个用户使用不同的序列化程序(员工、帐户所有者、其他人)和 HTTP 方法来限制更改帐户上某些属性的访问权限,但我觉得这太不
我有数百个用于测试组件的脚本。这些脚本中的每一个都包含一组下标和单独的记录。 下标可以在多个 TC_Level 脚本中使用,甚至可以在其他下标中使用。 每个脚本都有一个唯一的名称。 例子: TC_1
我正在建立一个以两种语言提供产品信息的网站:英文和中文。 每个产品必须有英文名称,也可以有中文名称。 每次请求产品页面时,request检查对象以确定产品名称应该以英文还是中文显示。在后一种情况下,如
场景:应用程序具有可以启用某些优化的算法。默认情况下,有些是打开的,有些是关闭的。在 Java 中是否有一种方便的方法来实现某种全局属性系统? 要求: 必须很容易两次使用不同的设置运行程序的多个实例
我从事嵌入式工作,我有一些管理硬件的软件模块。这个模块有状态,状态转换很复杂:根据事件,模块可以从状态 A 到状态 B 或者可能到 C .但是,当它退出某个状态时,它应该对硬件执行一些操作,以使其也保
我有一个免费网站,可以流式传输实时股票期权数据。我想让用户制作并保存他们自己的 JavaScript 可调用工具来解释选项数据。用户可以调用这些自定义工具来帮助他们自己做出有关期权的买卖决定。 但对于
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 2 年前。 社区在 6 个
我不是 DBA,我不知道什么是最好的解决方案。我有两个表, Custumers Table CustomerId (primary key, identity) ... 和 Suppliers Tab
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 7年前关闭。 Improve t
我一直在阅读关于版本控制主题的所有问题,但我认为我没有找到一个看起来像我自己的场景。 场景是: 我们有一个中型/大型 Web 应用程序,它有(至少应该有)一个部署到所有客户端的核心。当我们向客户演示应
我希望根据继承来组织一些项目,目的是确定哪些项目是连接最密集的父项,并且还只是看到形成的连接。 通常这将通过拓扑排序来完成,但我的图有循环。是否有类似“尽力而为”拓扑排序的东西,它可以尝试根据连接数或
以下在 JQuery 中附加事件处理程序的方法有什么区别? (function () { var $body = $("body"); $('button').click(functi
我是一名优秀的程序员,十分优秀!