[英]Trigger event on parent originating, bubbling up from child
如果我有一个<div class="timely"></div>
包含一个表,则该表中的<th class="prev"><i>previous</i></th>
... Chrome开发人员工具说在<th>
上有一个事件侦听器,但是Firefox开发人员工具指出它不在<th>
,而是父.timely
,Chrome在查看此事件的处理程序中的内容时也会指出。
我想做的是复制单击时发生的情况,并在键入时发生的情况。 在jQuery中,它看起来并不那么简单:
$('.timely th').each(function(){
$(this).on('keyup', function(){
$(this).trigger('click');
});
});
因为事件处理程序位于.timely
上,并且它正在侦听执行代码时事件冒泡的位置。
我如何复制.timely
keyup上的click事件以及它从<th>
起泡的上下文?
首先,请注意,没有必要进行each
循环(除非您正在执行未显示的其他操作) 。 请记住,jQuery是基于集合的,因此$("selector").on(...)
集合中的所有元素上设置处理程序。
您的问题:接受事件参数并将其target
属性用作触发其的元素:
$('.timely th').on('keyup', function(e) {
$(e.target).trigger('click');
});
或者,如果您想在.timely
而不是.timely
的th
进行.timely
,只需更改选择器并使用委派形式(假设您只希望在th
元素上使用它):
$('.timely').on('keyup', 'th', function(e) {
$(e.target).trigger('click');
});
当然,要在th
一个元素上输入keyup
是很棘手的; 立即想到的唯一方法是在th
放置一个input
元素,这样keyup
冒泡:
$('.timely th').on('keyup', function(e) { console.log("keyup"); $(e.target).trigger('click'); }); $('.timely th').on('click', function(e) { console.log('click'); });
<div class="timely"> <table> <tbody> <tr> <th> <input type="text"> </th> </tr> </tbody> </table> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
您没有说为什么要触发keyup
click
,但是如果只是为了运行click
事件处理程序,则不建议这样做。 取而代之的是,只对keyup
和click
处理程序使用相同的功能。 您可以只用空间划定在他们钩多个事件.on
( .on("click keyup", ...)
或使用命名函数和引用它,你钩住你的click
和keyup
处理程序。
Chrome开发人员工具表示
<th>
上有一个事件侦听器,但Firefox开发人员工具指出它不在<th>
,而是父.timely
如果您不想看到附加到祖先的处理程序,请取消选中“事件侦听器”选项卡中的“ 祖先”框:
但是请注意,在示例代码中,处理程序绝对位于th
,而不是祖先.timely
元素上。
这种jQuery的魔术可能无法快速工作
$('.timely th').each(function(){
$(this).on('keyup', function(){
$(this).trigger('click');
});
});
您可以抽象要在单击和键入时使用的功能
function clickKeyupHandler (e) {
// ...
}
// somewhere when you use it use same functions to handle click and keyup
// $('.timely').on('click', clickKeyupHandler);
$('.timely').on('keyup', 'th', clickKeyupHandler);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.