【发布时间】:2023-03-28 18:49:01
【问题描述】:
我希望能够确定我的页面的哪一部分被点击了。不能保证元素从一开始就在页面上,这意味着我需要使用 jQuery 委托之类的东西。
一种方法是遍历 DOM 中的所有元素,然后将事件处理程序附加到每个元素 - 但这会很慢而且很复杂 - 每次动态添加新的 html 时,我都必须重新- 附加所有处理程序,或找出添加的 html 子集。
另一种方法是使用事件冒泡 - 因此将事件处理程序添加到文档或正文并依赖于冒泡的事件。
类似这样的:
$('body').delegate('div', 'click', function(e){
dummyId++;
console.log(e);
console.log(e.currentTarget);
console.log("=====");
});
但是,在使用此代码后,当我单击页面上的按钮时,我会看到按钮周围的 div,而不是实际的按钮。换句话说,上面的内容太具体了。此外,我觉得原始选择器应该是文档,而不是正文标签。
明确地说,我想知道何时点击了我的页面上的任何元素 - 我该怎么做?
所以我用.on 尝试了这段代码:
$(document).on('click', function(e){
console.log("EVENT DUMMY ID");
console.log(e.target);
console.log("=====");
});
但是,当我单击应用程序中的按钮时,什么都不会触发 - 当我单击其他元素时,控制台日志会运行。
我知道如果没有更多上下文,这可能很难回答 - 你还需要什么?
【问题讨论】:
-
不要使用基于选择器的委托。只需将处理程序绑定到
document,然后检查e.target。这将是点击次数最多的元素。$(document).on("click", function(e) { console.log(e.target.nodeName); }) -
on 无法工作 - 我动态附加 html 元素
-
在你说它不能工作之前,先试试吧。没有理由它不适用于动态创建的元素,假设我已经正确理解您想要最深点击的元素。
-
我已经尝试过了 - api.jquery.com/on - 也支持我 - “事件处理程序仅绑定到当前选定的元素;它们必须在您的代码调用时存在于页面上。上()。”
-
cookie monster 的代码将起作用,正是因为他绑定到文档 - 从一开始就存在的元素 - 并且只有在回调中询问调用事件的实际元素时,无论是从一开始就在那里或后来添加。
标签: javascript jquery dom events jquery-events