【问题标题】:Cannot programmatically trigger jQuery click event无法以编程方式触发 jQuery 点击事件
【发布时间】:2020-12-20 12:37:25
【问题描述】:

如果我理解正确,以编程方式触发附加到具有my-button 的 css 类的对象的 jQuery 单击事件,您应该可以这样做:

$('.my-button').click();

由于某种原因,此代码未能触发附加到元素的点击事件。代码的$('.my-button') 部分正在运行并返回一个元素。我们知道事件处理程序附加到该元素,因为单击该元素会触发其事件处理程序的代码。处理程序附有以下简单代码:

$('<a class="my-button"/>')
    .click(function() { /* code here */ })
    .appendTo(parent);

是否存在事件触发不起作用的情况?被访问的元素是通过 jQuery 小部件创建的,小部件代码通过跨域 JSONP 调用检索并通过eval 运行(我怀疑的因素)。

【问题讨论】:

  • 首先,您的处理程序附加代码有语法错误...
  • 感谢您指出错误,@Eric。
  • 我记得在 jQuery 1.4.3 上遇到过这样的问题

标签: javascript cross-domain eval jquery


【解决方案1】:

你应该使用:

$('.my-button').trigger("click");

【讨论】:

  • 我们尝试使用.trigger('click');那也没有用。无论如何,他们做同样的事情。
【解决方案2】:

结果证明这是加载了两个 jQuery 脚本的情况。通过 JSONP 检索的脚本包括 jQuery 的加载,并且该 jQuery 对象用于附加事件处理程序。同时,在我同事的网页中,他加载了自己的 jQuery。因此,第二个 jQuery 对象不知道第一个的事件处理程序,无法以编程方式调用该处理程序。

【讨论】:

  • 天哪!我在同样的问题上苦苦挣扎。在我的情况下,我也有多个 jQuery 实例。
【解决方案3】:

我不知道跨域 JSONP 是否与它有关,但是我必须说,以编程方式触发与 html 链接有关的选择器上的单击事件 (&lt;a href='...'&gt;...&lt;/a&gt;) 不起作用.

我怀疑它必须是某种浏览器策略,以阻止弹出窗口。考虑到浏览器具有跟踪和阻止弹出窗口的机制,并且大多数情况下允许用户在新链接出现之前授权点击操作。

如果您可以通过 jQuery 以编程方式单击链接,重定向、弹出窗口和所有这些东西会更容易做到,因此这是不可能的。明确一点:

&lt;a class='test' href='http://www.example.com'&gt;Link1&lt;a/&gt;你不能触发它。

&lt;a class='test2'&gt;Link2&lt;/a&gt;你可以在这里触发onclick,因为它不包含href。

【讨论】:

  • 谢谢。这是帮助我的解决方案。我正在执行相同的过程,其中一个触发了有效的 AJAX 调用,而在另一个页面上我不需要 AJAX,并将其设置为常规链接。那没有用。为了让我的工作并重新加载整个页面,我必须将 document.location 设置为等于链接的 href 属性。
【解决方案4】:

我遇到了同样的问题,并更改了将事件绑定到修复它的函数的方式

  var f=function() { .... }
  $('input.radioDomande').click(f);
  ...
  $(s+data.domanda[i].valore).trigger("click");
  //WRONG: It won't trigger the event

然后根据http://api.jquery.com/trigger/中的示例更改绑定

  var f=function() { .... }
  $('input.radioDomande').bind('click', f);
  ...
  $(s+data.domanda[i].valore).trigger("click");
  //IT DOES TRIGGER THE EVENT

【讨论】:

    【解决方案5】:

    奇怪。你试过.trigger('click')吗?从理论上讲,它们应该是相同的(现在查看 jQuery 代码以找出答案)。 编辑:看来 .click() 只是 .trigger('click') 的代理,所以它可能无济于事。

    为了调试,尝试在加载小部件的页面上绑定一个实时点击事件。

    【讨论】:

    • 尝试在加载小部件的页面上绑定.live('click', ...) 事件,以查看加载和评估小部件是否存在问题。
    • click 事件处理程序正在查找。单击链接有效。以编程方式触发它不会。
    • 文档说 “虽然 .trigger() 模拟了一个事件激活,完成了一个合成的事件对象,但它并不能完美地复制一个自然发生的事件。” 试图弄清楚弄清楚这到底是什么意思,但也许是相关的。
    • 是的,我正在尝试在
    • 内的 img 上调用 .trigger('click'),但出现错误:“TypeError: Object # has no method '触发'”。
    【解决方案6】:

    我最好的猜测是在您尝试触发事件后绑定了处理程序。

    试试:

    var myButtons = $('<a class="my-button"/>)
                        .click(function() { /* code here */ })
                        .appendTo(parent);
    
    myButtons.click();
    

    或使用您的原始代码 - 在 JSONP 请求的回调中触发事件。

    【讨论】:

    • 我也有同样的想法,但是程序化的触发肯定是在处理程序绑定之后发生的。触发发生在页面中另一个aclick 事件中。
    • @Jacob:他们是彼此的后代吗?
    【解决方案7】:

    如果它不记得正确记录的事件,尤其是自定义事件,则很可能在您分配事件处理程序后再次加载 jQuery 库。

    使用以下方法检查您的代码:

    jQuery (document).ready (function () {
        // Test your code here
    });
    

    【讨论】:

      【解决方案8】:

      我也遇到过这个问题,但我没有多个 jQuery。

      阅读这里的答案,我意识到这是因为执行顺序。在我拥有调用点击的函数后,我正在绑定事件处理程序几行。

      这是一个 DOH!瞬间……

      【讨论】:

        【解决方案9】:

        回到 dom 并使用:

        $("abutton")[0].click();

        【讨论】:

          猜你喜欢
          相关资源
          最近更新 更多
          热门标签