问题标签 [event-delegation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
453 浏览

javascript - 使用 createEvent 选择另一个元素后面的文本

我有一个场景,我有一些文本,应该是用户可选择的。问题是,它上面有一个 UI 覆盖,默认情况下会阻止选择文本。保持覆盖并仍然能够选择文本的合乎逻辑的方法是使用合成事件(使用document.createEvent),但由于某种原因,它不能按预期工作。

事件似乎被正确委派并触发其处理程序,但未选择任何文本。我这里有一个例子,这是对问题的粗略简化。

几点注意事项

  1. 在 Firefox 中,如果您在覆盖层之外开始选择,您仍然可以选择所需的文本,即使它位于覆盖层之下
  2. 当您在未覆盖区域中有一个正常选择并单击覆盖时,委托事件预计会mousedown删除选择,但不会发生

我是否错过了一个也应该被委派的事件(我有mousedownmousemovemouseup)?或者浏览器是否采取了某种安全措施来禁用此类行为(请参阅注释 nr 2)?关于如何获得所需结果的任何其他建议?我知道我应该完全解决当前的覆盖解决方案,但我已经对问题本身感到好奇。

0 投票
2 回答
268 浏览

actionscript-3 - ActionScript 3 是否有某种事件委托系统?

我有一个包含许多图像的容器。我不想在每个图像上添加单击和其他鼠标事件的侦听器,而是只想在图像的父级上侦听这些事件。

那可能吗?

0 投票
2 回答
10600 浏览

javascript - 向页面添加复杂元素时的事件委托与直接绑定

我有一些这样的标记(类仅用于说明):

也就是说,嵌套的可排序列表。然而,可排序插件就足够了,因为每个 li(以下称为“项目”)都保持其级别,尽管内部列表是连接的。这些项目有一个始终可见的标题和一个在展开状态时可见的部分,通过单击标题进行切换。用户可以随意添加和删除任一级别的项目;添加顶级项目将在其中包含一个空的嵌套列表。我的问题是关于新创建项目的 JS 初始化:虽然它们将共享一些通用功能,但我可以通过

(附带问题:这是否是使用详细信息/摘要 HTML5 标记的合适位置?关于这些是否会进入最终规范似乎有点不确定,我想要一个滑动过渡,所以看起来我会无论如何都需要JS。但我把这个问题抛给大众。你好,大众。)

如果根列表是保证在页面加载时存在的唯一(相关)元素,为了 .on() 有效地工作,我必须将所有事件绑定到该元素并为每个元素拼出精确的选择器,因为我明白它。因此,例如,要将单独的功能绑定到彼此相邻的两个按钮,我必须每次都完整地拼出选择器,à la

那准确吗?既然如此,在将新项目添加到页面时放弃 .on() 并绑定我的事件是否更有意义?如果这会对响应产生影响,那么项目的总数最多可能会达到几十个。

0 投票
4 回答
2063 浏览

jquery - .live()、.delegate() 或 .on() 都不适用于动态加载到页面的表单

我有一个无限滚动的页面。ajax 功能适用于最初加载时页面上存在的表单,但不适用于从无限滚动 ajax 功能加载的表单。我已经搜索了大约 5 天试图找到答案,但还没有。这是javascript的一部分:

:not(.member)部分的原因是页面上的其他表单(例如搜索表单)不包含在脚本中。

我试过了

这些都不适用于初始页面加载后加载的表单。有没有人有任何其他建议?顺便说一句,我正在使用 jquery 1.7.1。我也试过

0 投票
5 回答
1773 浏览

javascript - 事件委托的事件冒泡

我正在尝试使用以下代码实现事件委托:

我希望事件冒泡,这样当我单击一个<li>项目时,会显示一个警报item,然后显示另一个警报list。但是这段代码只给出了警报item。如何修改它以使事件冒泡?

0 投票
2 回答
1061 浏览

jquery - 使用处理程序删除元素时的最佳做法是什么?

在删除我的委托处理程序附加到的元素时,我在 IE8 上使用 jQuery 的 .delegate() 方法遇到了一个问题。这是场景:我有一个表,其中的行都有一个删除按钮。这些行是动态创建的,因此删除按钮是使用委托连接的,以处理单击事件。当需要删除最后一行时,整个表都被删除了(只有在有创建至少一行的值时才创建表。)除了 IE8 之外,几乎所有地方都可以正常工作。即使那样,它也可以在某些页面上运行,但不是一个(每个页面上使用完全相同的代码。)对于这个特定页面,删除最后一行会在 IE8 中生成一个 js 错误,指出“需要对象”- 违规行在委托的 jQuery 代码中。

所以问题是,当处理程序使用的某些 DOM 元素被删除时,处理程序的最佳实践是什么?是否应该在某个时候调用取消委托,如果是,在哪里?

0 投票
1 回答
926 浏览

javascript - 单击事件未在 chrome 中委派

在我的应用程序中,我创建了一些新元素并根据用户的操作将它们附加到页面,

创建此 div 元素后,我将向其添加一些事件:

这是页面中生成的结果(一个 div 包含一个 img 标签和一个 span 标签):

在此处输入图像描述

页面加载后,事情就出错了。

如果我直接单击图像,click事件不会触发,但mousedown事件会触发。

如果我在没有图像的情况下直接单击 div,一切顺利。

似乎,当我单击图像时,该click事件并未委托给 div。

但是后来我通过 Chrome 开发工具复制了最终生成的代码,它是这样的:

然后我将它复制到一个新的 .html 文件中,并添加事件脚本:

现在,无论我在 div 内的哪个位置单击,这两个事件都会发生。

我真的疯了,有什么问题?我没有专门为生成的 div 做任何事情。

所以我想知道你们中是否有人遇到过这个问题?或者在哪种情况下会发生这种异常?


更新:

它仅用于跨浏览器使用,请注意该mousedown事件无论如何都运行良好。

0 投票
2 回答
1619 浏览

javascript - jQuery 1.7 .on() 事件委托不适用于禁用元素上的选择器

我的 HTML(非动态)如下所示:

这有效:

这不会:

删除$("#domain").attr("disabled", "disabled");调用会恢复$(document).on()委托的功能,因此当元素被禁用时,事件似乎不会冒泡,无论事件是如何触发的(即既不是通过.trigger也不.triggerHandler是通过用户交互)。但是,我不明白为什么,因为处理程序都没有返回任何内容或进行任何调用以防止事件传播,并且 jQuery 文档没有提到“禁用”属性对传播有任何影响。我在这里想念什么?

0 投票
2 回答
4659 浏览

javascript - 按键事件仅触发一次

我正在这样做:

与上面类似的代码,只工作一次,我的意思是,第一次输入并单击 Enter 时,它可以工作,但下一次,它根本没有反应。

第二个代码一直工作,但第一个代码只工作一次。

此外,如果第二个代码运行一次,则第一个代码甚至不会运行一次。

解决办法是什么?我想我在这里遗漏了一些规则,你能告诉他们,以便我搜索它们。谢谢

0 投票
3 回答
3264 浏览

jquery - 嵌套 ul 元素上的 jquery 委托展开/折叠功能

我有一个嵌套的 ul “树”,为了这个问题,它只有顶部的几个级别和几个孩子,但是如果你可以假设从顶部 ul(以id="group"此处为目标)可能有几个嵌套元素,但它们将始终遵循此结构。目前我只有顶部元素在折叠时折叠它们的子 ul 元素。我想在所有 ul 元素中实现这种性质。此外,我还想折叠另一个单击的“同一级别”的打开元素,以便只有一个 ul 与另一个打开。我希望我已经解释了我想要完成的功能。我觉得我应该使用slideToggle()但每次尝试都以失败告终......我还应该说这是我实际使用的第一手delegate() 但我了解传播(“事件冒泡”),这也是我觉得这是完成此类任务的方式的部分原因。另一个是我可能需要在 ul 中添加新元素。所以这就是我目前所拥有的:

这是测试用例的jsfiddle 链接。欢迎所有输入以实现这一目标的最佳方式。