- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以,这可能是一个非常简单的问题,但我还是会问。这显然只是为了在我的脑海中澄清这两个语句是如何工作的。
场景我通过 Ajax 调用拉取一些 JSON,然后将其插入到具有一些选择器的 html 中。像这样:
$.each(r, function(k,v){
str+='location: <div class=\'loc-to-select\' data-location-id=\'' + v.id + '\'>';
str+= v.name + '</div>';
});
$('#event-search-locations').html(str);
基本上写出:
<div class='loc-to-select' data-location-id='2'>Joe's</div>
我有这两段 jQuery:
// doesn't work
$('.loc-to-select').on('click',function(){
alert('here you go');
});
// does work
$(document).on('click','.loc-to-select', function(){
alert('here you go');
});
所有这一切显然都发生在 jQuery 的 $(document).ready 完成触发之后。据我了解,这是 jQuery 提供的主要功能。我熟悉事件冒泡的概念。我还在这里阅读了文档 http://api.jquery.com/on/其中讨论委托(delegate)事件。我内部不理解 jQuery 如何通过后代元素做到这一点。其中一些讨论了它如何从用户空间 pov 进行处理:Direct vs. Delegated - jQuery .on()
此外,出于性能原因,似乎首选后代元素技术。后代元素模型基本上是说,如果我们将新内容添加到 DOM,请检查它是否符合“委托(delegate)元素”模型,而直接事件会绕过这个模型?
在更简单的层面上,jQuery“运行时”本质上是监视 DOM 的更改,然后检查还是提前检查 html 函数(本质上是通过 html 解析它所知道的项目)?
最后,为什么他们不将第二种语法(委托(delegate)语法)设为默认语法?它似乎提供了更大的特异性和更好的性能(如文档中提到的)
谢谢
最佳答案
我不能 100% 确定您想知道什么,因为您链接到的问题 (Direct vs. Delegated - jQuery .on()) 似乎包含您所问问题的答案。
这里再次解释差异:
$('.loc-to-select').on('click',function(){
alert('here you go');
});
将搜索当时存在的所有 .loc-to-select
元素,并将事件处理程序绑定(bind)到每个元素。
使用 DOM API 的等效内容是:
var elements = document.getElementsByClassName('loc-to-select');
for(var i = 0, l = elements.length; i < l; i++) {
elements[i].onclick = handler;
}
现在考虑
$(document).on('click','.loc-to-select', function(){
alert('here you go');
});
仅将一个事件处理程序绑定(bind)到 document
。它会检查每个点击事件,并测试它是否源自或位于类为 loc-to-select
的元素内。
同样,DOM 等效项(简化):
document.body.onclick = function(event) {
if(event.target.className === 'loc-to-select') {
handler.call(this);
}
}
<小时/>
jQuery 不会监视 DOM 的更改,它只是利用事件在树中冒泡的事实。
Finally, why don't they just make the second syntax (the delegated syntax) the default? It would seem to provide greater specificity and better performance (as mentioned in the docs)
让我们再次回顾一下事件委托(delegate)中发生的情况:单个事件处理程序绑定(bind)到一个元素以处理多个(相似)元素。这意味着您只需搜索并触摸 x
元素即可处理 y
元素,其中 x << y
,即设置速度更快。
但它需要权衡:由于事件首先遍历树并且必须评估原点,无论它是否匹配,因此在事件发生时处理事件需要更多时间。
想一想,如果您对页面上的所有点击事件使用事件委托(delegate),并将处理程序绑定(bind)到 document
,会发生什么情况。您最终会得到绑定(bind)到 n
的 document
事件处理程序,并且每个事件处理程序都将通过一次点击执行。但在这些 n
中,只有一个需要执行。这似乎性能不太好。
使用直接事件处理,设置速度会更慢,因为您必须找到所有元素并将事件处理程序绑定(bind)到每个元素。如果元素不多,那不是问题,但如果元素很多,那就有问题了。显然,绑定(bind)的事件处理程序越多,浏览器的性能就越差,但这可能会改变或已经改变了。
这是将许多事件处理程序绑定(bind)到许多执行较少次数的元素与将少数事件处理程序绑定(bind)到少数执行多次的元素之间的权衡。
关于jquery - jQuery 的这两部分有何不同以及直接事件模型和委托(delegate)事件模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11972657/
我有一个加载 View 的 View ,需要将 View 推送到主导航 Controller 。 我已经为每个 View 设置了一个委托(delegate),并且基本上使我的调用沿着“链”返回到主导航
我通过 NSURLConnction 从服务器获取数据,并希望从获取的数组中填充表格 View 。数据出现在 NSURLConnection 委托(delegate)方法的日志中,但我意识到 numb
我已经将我用作标题 View 的 View 子类化,它里面有一些按钮委托(delegate),它工作得很好。 但是,我在 viewController 上方展示了一个 modalViewControl
我希望这听起来像是一个显而易见的问题,但是委托(delegate)返回类型是否也必须与其委托(delegate)的方法的返回类型相匹配? EG,像这样: public static void Save
我想使用 Kotlin 委托(delegate),但我不想在委托(delegate)人之外创建委托(delegate)。委托(delegate)的所有示例都如下所示: interface Worker
我有一个问题: - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInf
伙计们。我正在寻求帮助。这似乎是一个非常简单的任务,但我可以解决一整天。我正在尝试使用容器 View 创建侧面菜单。当用户按下“更多”按钮(barButtonItem)时,整个 View 向右滑动并出
我正在努力将 UIWebView 迁移到 WKWebView。我已经更改了所有委托(delegate)方法。我需要 WKWebView 委托(delegate)方法等于下面的 UIWebView 委托
我正在学习 VB.NET 中的委托(delegate),但对委托(delegate)类型感到困惑。在阅读有关委托(delegate)的内容时,我了解到委托(delegate)是一种数据类型,可以引用具
我有一个用 Objetive-C 构建的框架。该框架用于连接蓝牙设备并与之交互。 在演示代码中,Objetive-C 委托(delegate)函数如下所示。演示代码由框架创建者提供。 -(void)b
//NewCharts.h #import @interface NewCharts : UIViewController @property(nonatomic,retain)IBOutlet U
我正在努力了解 async/await 并认为我确实了解有关用法的一些事情。但仍然不太清楚在下面的场景中实际好处是什么。 查看 Task.Run 用法。第一种方法使用普通委托(delegate)并使用
我已经尝试了在我的网站上使用 openID 委托(delegate)的所有可能选项,但没有一个方法对我有用。 我的 HTML 文件的 head 部分有“link rel”标签。 我在 HTML 文件的
如何快速创建一个委托(delegate),即 NSUserNotificationCenterDelegate? 最佳答案 这里有一些关于两个 View Controller 之间委托(delegat
我有一个带有数据源的 NSComboBox,当您单击三角形并通过单击它选择其中一个项目时,它可以完美运行。但是,我还希望它允许用户在框中键入以使用自动完成来选择名称。目前,当用户键入时,我希望选择的项
我在代码中定义了以下类和委托(delegate)(为简洁起见,剪掉了许多其他行)。 Public Delegate Sub TimerCallback(canceled As Boolean) Pub
我使用 ansible 2.1 并且我想使用 delegate_to 向一组主机运行命令。我使用 localhost 作为主机参数,并且我想将“touch”命令委托(delegate)给两个 cls
我想通过重载为我的类实现几个构造函数。据我了解,遵循 DRY 原则的惯用方式是使用一种称为委托(delegate)构造函数的功能。我也看到了关于在任何地方使用引用参数并不惜一切代价避免使用指针的想法,
代表们会导致内存泄漏吗? 我的意思是,例如如果一个类A包含一个ADelegate,并且后者指向BMethod(属于B类),这可以防止GC收集A类或B类吗? 如果是这样,我们如何“释放”代表(设置ADe
委托(delegate)命令和路由命令有什么区别? 我读了一些文章说在 MVVM 上使用委托(delegate)命令而不是路由命令。 那么当我们使用 MVVM 时,Delegate Command 相
我是一名优秀的程序员,十分优秀!