javascript - 为什么 jQuery的triggerHandler()可以工作,而trigger()却不行?

标签 javascript jquery jquery-events jquery-trigger jquery-triggerhandler

使用 triggerHandler() 单击元素作品:

$element = $('#gwt-debug-location-pill-edit-div:visible');
$element.triggerHandler('click');

但是,使用 trigger() 单击它,不:

$element.trigger('click');

这是为什么?

<小时/>

要复制此内容(在 Firefox 和 Chrome 中):

  • 转到https://adwords.google.com/select/home ,然后使用您的凭据登录
  • 工具和分析->关键字规划师
  • 展开“输入或上传关键字以查看其效果”
  • 使用浏览器的控制台,尝试通过上述两种方法单击位置框(在下面的屏幕截图中以红色标记)(您需要将 jQuery 注入(inject)到页面中。我使用 jQuerify 来做到这一点。)
<小时/>

enter image description here

最佳答案

我们来比较一下jQuery.fn.trigger and jQuery.fn.triggerHandler :

trigger: function( type, data ) {
    return this.each(function() {
        jQuery.event.trigger( type, data, this );
    });
},
triggerHandler: function( type, data ) {
    var elem = this[0];
    if ( elem ) {
        return jQuery.event.trigger( type, data, elem, true );
    }
}

唯一真正的区别是第四个参数,true,通过 triggerHandler 赋予 jQuery.event.trigger

查看jQuery.event.triggerthe argument is called onlyHandlers ,除其他外,the documentation of triggerHandler注意到:

  • The .triggerHandler() method does not cause the default behavior of an event to occur (such as a form submission).

我们可以看到where the default behaviour is actually triggered :

// If nobody prevented the default action, do it now
if ( !onlyHandlers && !event.isDefaultPrevented() ) {

如果 onlyHandlers 为 false (trigger()),并且没有事件处理程序停止执行默认事件,则将执行默认操作。

onlyHandlers 为 true (triggerHandler()) 时,这种情况永远不会发生。

因此,对于 trigger() 情况,它最终会在目标元素上执行 click(),从而正确触发状态更改 - 但事实证明,在 trigger()triggerHandler() 情况下,在 the loop through the eventPath above已经正确触发了点击。 :

// Native handler
handle = ontype && cur[ ontype ];
if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {

因此 trigger('click') 最终会单击该元素两次 (!) - 大概是因为 click() 不会返回 false,因此事件默认操作永远不会被阻止 - 而 triggerHandler('click') 只会执行一次。

这可以通过使用检查器单步执行 jQuery.event.trigger 方法并查看选择器打开然后再次关闭来验证。

问题是这是否是我们通常所期望的;在仅 DOM react 的情况下,正常工作的事件触发器会导致双重触发器,这似乎很奇怪。

关于javascript - 为什么 jQuery的triggerHandler()可以工作,而trigger()却不行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17103090/

相关文章:

javascript - 自定义 jQuery 自动完成

javascript - 优化 Three.JS 静态场景的渲染时间

javascript - 每 15 秒向 Rails 方法发出一次 JS 请求有多高效

jquery - 显示表格的边框

javascript - jQuery.noConflict(); 的作用是什么? jquery-1.4.2.min.js 结尾是什么意思?

jquery - jQuery 中 CSS 类更改的触发事件

javascript - 如何根据 obj 标志的状态查找数组长度

javascript - 使用 jquery 更新数据表中的表行

jquery - 使用 jQuery Ajax 请求进行 CORS Amazon S3 文件上传

javascript - 如何在不禁用其子 DOM 对象上的单击事件的情况下禁用父 DOM 对象上的单击事件?