使用 jQuery 的 .on 函数如何获取事件的原始元素
Using jQuery's .on function how do I get the originating element for the event?
我有这样的代码:
$('.remove-group').click(function () {
$(this).closest('tr').remove();
});
这工作正常,直到我需要使用委托事件处理程序来捕获将来将添加到页面的元素的点击。
$(document).on('click', '.remove-group', function () {
$(this).closest('tr').remove();
});
这不再有效,因为 this
关键字不引用原始元素。
有什么想法吗?
更新
似乎在我努力简化我的问题的代码时,我实际上让它工作了。我实际上是在传递一个分配给变量而不是字符串选择器的包装集。
var $removeGroup = $('.remove-group');
$(document).on('click', $removeGroup, function () {
$(this).closest('tr').remove();
});
当我这样做时,这似乎不起作用。
希望这对某人有所帮助:
$('#container').on('click', '.remove-group', function(event) {
$(this); // returns $('.remove-group') equivalent
$(event.target); // returns $('.remove-group') equivalent
$(event.delegateTarget); // returns $('#container') equivalent
});
参考: http://api.jquery.com/event.delegateTarget/
从问题作者编辑:
我只是想澄清我最初犯的一些错误。
jQuery中的.on()
处理程序似乎有一些特定的用法,这些用法在文档中没有明确说明。
您可以直接在选择器本身上使用
.on()
:$('button').on('click', function () { $(this).css('border', 'solid 1px red'); });
它将起作用,但它不适用于使用相同选择器动态添加到页面的任何未来元素。这与
.live()
过去的工作方式不同。必须绑定到文档对象才能捕获将来的元素以及当前的元素。这是因为选择器现在是您正在侦听的元素,它将捕获冒泡到该元素的所有单击事件(文档是要侦听的最顶层元素之一(。然后,将感兴趣的元素的选择器作为事件名称后面的第二个参数传递。$(document).on('click', 'button', function () { $(this).css('border', 'solid 1px red'); });
现在,侦听器将过滤掉点击事件,直到找到最初在"按钮"上触发并冒泡到文档的事件。
您必须提供字符串选择器,而不是包装集。这将不起作用:
var $buttons = $('button'); $(document).on('click', $button, function () { $(this).css('border', 'solid 1px red'); });
有关示例,请参阅此 jsbin。
基本上,您只需要侦听比动态元素更高的范围。考虑到根据定义,您要侦听的动态元素是在代码运行并注册事件侦听器后添加/删除的,这是有道理的。
若要获取">事件的原始元素",可以使用事件对象的 target
属性:
$(document).on('click', '.remove-group', function (e) {
$(e.target).closest('tr').remove();
});
但是,这种方法可能不是您真正想要的,因为原始元素实际上可能是.remove-group
的后代,其"click"事件只是冒泡了目标元素 - 这意味着您可能会在嵌套表的情况下删除错误的行。在.on()
处理程序的上下文中,this
实际上引用了与 .remove-group
匹配的元素。要使用 .on()
绑定到此元素上的委托事件,语法如下:
$(static-parent-element).on(event, selector-string, handler)
例如,这是正确的语法:
$(document).on('click', '.remove-group', function () {
$(this).closest('tr').remove();
});
这将匹配当前和未来的.remove-group
元素,并删除最近的tr
祖先。您可以(并且应该(将此处的document
替换为最接近的.remove-group
父元素,该元素在绑定时存在于 DOM 中,并且只要预期触发此事件(即静态(,该元素仍然存在。这样做可以最大程度地减少事件在触发事件之前必须在 DOM 树中冒泡的距离。
>$(this)
应该可以正常工作,但无论如何都要尝试event.target
。
$(document).on('click', '.remove-group', function (event) {
$(event.target).closest('tr').remove();
});
演示:http://jsbin.com/inewoc/1/edit
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 在谷歌地图上获取事件的x,y坐标
- 如何获取事件的返回值
- ASP.NET MVC5 jQuery FullCalendar获取事件问题
- Javascript或Jquery获取事件任意按钮点击
- 如何在 JavaScript 中获取事件中的变量值
- jQueryUI FullCalendar:从服务器获取事件后的回调
- JsTree:如何在将节点从一棵树拖到第二棵树时获取事件
- 正在尝试获取事件之外的更新数组的值
- 在FullCalendar中单击一天获取事件
- 使用纯JavaScript获取事件的select元素值
- 可以't使用asp.net mvc 3获取事件模糊
- 延迟后JS setTimeout获取事件
- SAPUI5:在表单完全呈现时获取事件
- FullCalendar 开始和结束日期在获取事件时解析为 null
- 主干网中的共享模型不获取事件
- 当多个对象共享同一视图模型时,如何在 kendo UI 中获取事件源
- 为什么要创建循环来获取事件的元素
- 从服务器获取事件的全日历不起作用
- 如何在没有jQuery的情况下获取事件目标