当选择多个元素时,jQuery“.triggerHandler()”与“.trigger()”

时间:2011-09-23 14:55:31

标签: javascript jquery

与“.trigger()”不同,jQuery“.triggerHandler()”机制仅对jQuery对象所引用的第一个元素进行操作。换句话说,

$('.all-over-the-page').triggerHandler("readjust");

只会为具有“all-over-the-page”类的第一个元素调用“readjust”处理程序,即使页面上有许多具有该类的元素。另一方面,“。turigger()”方法会影响所有这些方法。

我意识到我可以使用“.each()”来解决这个问题(或者只是编写我自己的替代品,为我做这件事),但是为什么两者在这方面有所不同呢?这对我来说没什么意义。 (我当然理解现在几乎肯定无法改变。)

编辑以澄清:

如果我提供一个我实际得到的代码风格的上下文,那么我可能更容易理解为什么我会对此嗤之以鼻。当我在页面上为各种“小部件”功能组合代码时,通常涉及事件处理程序。一个很好的例子是某种形式,它有一些字段,其相关性由复选框,单选按钮或选择器控制。一个常见的例子是“送货地址”复选框,显示在数十亿电子商务网站上:如果选中该复选框,则会禁用送货地址并使用开票地址。

现在考虑一些其他代码,由于其自​​身原因完全独立于复选框控件小部件,实际上可以对表单执行操作,可能包括以编程方式更新复选框设置。在这种情况下,其他窗口小部件代码可能希望使用“triggerHandler()”来告诉任何窗口小部件,“嘿,我已经更新了一些内容,因此您可能需要重新检查当前状态并在必要时进行调整。”

因此,如果“.triggerHandler()”可以对所有选定元素进行操作,我可以使用:

 $theForm.find('input, select, textarea').triggerHandler('change');

所有这些处理程序都可以运行并执行他们需要的任何操作。正如我所说,写起来很容易:

 $theForm.find('input, select, textarea').each(function() {
   $(this).triggerHandler('change');
 });

1 个答案:

答案 0 :(得分:11)

  

“......对于这两方面在这方面有何不同,有什么理由吗?”

我认为这个想法是triggerHandler()是一种调用你作为处理程序的函数的方式,就像它是任何其他函数一样。

因此,他们使triggerHandler()使得该函数仅被调用一次,它返回函数的实际返回值,并且它不会影响具有冒泡或默认行为的DOM。

当然,如果将this值更改为DOM元素之外的其他值,函数可能会中断,因此它们只使用匹配的第一个元素。

如果你想简单地使用你的函数,那么我可能只是保留对它的引用并直接调用它,或者作为.each()的参数。

$('.element').each( handler_func );

...只要您不需要event对象。


编辑:或者如果您想要调用返回的值,请改用.map()

var return_values = $('.element').map( handler_func );

编辑:关于更新问题中提供的示例,一个好的解决方案可能是利用trigger()[docs]方法的 extraParameters 功能这样您就可以告诉处理程序preventDefault()stopPropagation()

$('.elememts').bind( 'click', function( e, was_code_triggered ) {

    if( was_code_triggered ) {
        e.preventDefault();
        e.stopPropagation();
    }
    // your code
});


// ...


$('.elememts').trigger( 'click', true ); // pass "true" to let handler know
                                         //    it wasn't a DOM event

来自.trigger()文档:

  

“请注意我们在此处传递的额外参数与.bind()方法的eventData参数之间的区别。两者都是将信息传递给事件处理程序的机制,但将{{> extraParameters参数传递给{{ 1}}允许在触发事件时确定信息,而.trigger()的eventData参数要求在处理程序绑定时已经计算了信息。“