调用preventDefault时,为什么事件冒泡没有按预期工作?

时间:2012-12-13 15:07:59

标签: javascript jquery jqgrid

我有一个jqGrid,其中一列是格式化列,呈现anchor标记。与锚标记关联的点击处理程序调用{​​{1}}。

我还在网格中注册了一个preventDefault()事件处理程序,当用户点击呈现onCellSelect标记的列中的任意位置时,它会执行一些有意义的操作。

我想要做的是显示anchor标记,但点击它时应触发向网格注册的基础anchor处理程序。

然而这不起作用。

查看位于here

的jsFiddle示例

我有一个位于here的jsFiddle会触发冒泡事件。

不确定哪里出错了。

4 个答案:

答案 0 :(得分:0)

这有点像黑客,但它有效:

$("#grid").delegate(".logDetailsDialogClass",'click', 
   function(e) {
      alert('link clicked');
      e.preventDefault();
      $(this).parent().trigger("click");
   });

请注意,您可以继续使用.live,但我建议不要使用它。我添加的全部是$(this).parent().trigger("click");

答案 1 :(得分:0)

要在点击另一个事件时触发另一个事件,您可以使用触发功能

$('.anchorClass').live('click', function(e){
     e.preventDefault();

     // get the current cell
     var $cell = $(e.target).parent('div');

     $($cell).trigger('onCellSelect');

});

请参阅此fiddle如何从另一个

触发一个事件

答案 2 :(得分:0)

你在这里混淆了几件事(你应该阅读jQuery文档)

event.preventDefault():如果调用此方法,则不会触发事件的默认操作。 event.stopPropagation():防止事件冒泡DOM树,防止任何父处理程序被通知事件。
event.stopImmediatePropagation():保持其余的处理程序不被执行,并防止事件冒泡DOM树。

另外,您应该阅读.stopPropagation().stopImmediatePropagation()上的附加说明:

附加说明:

  • 由于.live()方法在事件传播到文档顶部后处理事件,因此无法停止实时事件的传播。同样,.delegate()处理的事件将传播到它们被委派给的元素;在DOM树中它下面的任何元素上绑定的事件处理程序将在调用委托事件处理程序时执行。因此,这些处理程序可能会通过调用event.stopPropagation()或返回false来阻止委派的处理程序触发。

答案 3 :(得分:0)

我建议您移除anchors并将其替换为spans?如果你真的需要它们链接到某个地方,你可以使用CSS和Jquery的混合模拟anchor动作。