2011-09-23 71 views
7

不同于“.trigger()”,jQuery“.triggerHandler()”机制仅对第它被称为的jQuery对象。换句话说,当选择多个元素时,jQuery“.triggerHandler()”与“.trigger()”

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

只要求带班的第一要素“全过度的页面”中的“调整”的处理程序,即使有与该类页面上的许多元素。另一方面,“.trigger()”方法会影响所有这些方法。我知道我可以使用“.each()”来解决这个问题(或者简单地写下我自己的替代品),但是为什么两者在这方面有所不同呢?它对我来说毫无意义。 (我的理解,当然,它几乎可以肯定,现在还不能改变。)

编辑澄清:

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

现在考虑一些其他代码可为自身的原因,是完全独立的复选框控制部件的,实际上做的事情,可能包括更新复选框,设置程序的形式。在这种情况下,其他小部件代码可能希望使用“triggerHandler()”来告诉任何小部件,“嘿,我已经更新了一些东西,因此您可能需要重新检查当前状态并在必要时进行调整。”

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

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

和所有的处理程序可以运行,做任何他们需要的。正如我所说的,它很容易写:“......是有,为什么这两个在这方面不同的一些基本原理”

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

+1好问题Pointy –

+0

我不确定你想要在这里做什么。你能给出更多关于你正试图解决的问题吗? –

+0

更新了一些更具说明性的材料。 – Pointy

回答

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()文档:

“注意,我们路过此地额外的参数和EVENTDATA参数到.bind()方法之间的区别两者都是出于传递信息到一个机制事件处理程序,但参数.trigger()的extraParameters允许在触发事件时确定信息,而.bind()的eventData参数需要信息在处理程序绑定时已经被计算出来。“

+0

好吧,但它会让我感到奇怪,因为编写的事件处理程序希望能够返回值。而且我没有做好默认的行为。这对于复选框上的“点击”确实存在问题(例如)。 – Pointy

+0

@Pointy:是的,它很奇怪,除非你有一个作为独立函数的有用函数,还有一个处理函数。我认为这种情况很罕见。是在使用'triggerHandler'之后禁用了冒泡吗?编辑:只注意到你的问题的更新。阅读... – user113716

+2

@Pointy:我明白你的意思。是的,如果你不需要'.each()'(不管是直接传递函数,还是使用'triggerHandler()'),你都可以考虑使用'.trigger()'的* extraParameters *传递一个标志,告诉处理程序它应该'preventDefault()'和'stopPropagation()'。 – user113716