无法通过编程方式触发jQuery的点击事件

8

如果我理解正确,要以编程方式触发一个附有css类my-button的对象所附加的jQuery点击事件,你只需要这样做:

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

由于某些原因,此代码未能触发附加到该元素的点击事件。 代码中的$('.my-button')部分正在工作并返回一个元素。 我们知道事件处理程序已附加到该元素,因为单击该元素确实会触发其事件处理程序的代码。 处理程序使用以下简单代码附加:
$('<a class="my-button"/>')
    .click(function() { /* code here */ })
    .appendTo(parent);

有没有一些情况会导致事件触发无法正常工作?当访问的元素是通过jQuery小部件创建的,小部件代码是通过跨域JSONP调用检索并通过eval运行时,可能会出现这种情况。


首先,你的处理程序附加代码存在语法错误... - Eric
我记得在 jQuery 1.4.3 上遇到过类似的问题。 - John Strickler
9个回答

6
这实际上是两个jQuery脚本被加载的情况。通过JSONP检索到的脚本包括jQuery的加载,而该jQuery对象用于附加事件处理程序。同时,在我的同事的网页中,他加载了自己的jQuery。因此,这第二个jQuery对象没有了解第一个的事件处理程序,无法以编程方式调用处理程序。

天啊!我一直在为同样的问题苦苦挣扎。在我的情况下,我也有多个jQuery实例。 - Rakesh Juyal
谢谢,我这里也有同样的问题。我不明白原因,处理程序已经设置在一个DOM节点上了,那应该是一个并且可访问的。 - dar0x

5

您应该使用:

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

3
我们尝试使用.trigger('click'),但仍然没有起作用。无论如何它们做的事情都是一样的。 - Jacob

3
我不确定跨域JSONP是否与此有关,但我必须说,对与HTML链接相关的选择器进行编程触发点击事件是无效的。
我怀疑这可能是某种浏览器策略,以阻止弹出窗口。请考虑浏览器有一种机制来跟踪和阻止弹出窗口,并且通常允许用户在新链接出现之前授权点击操作。
如果您可以通过jQuery编程地单击链接,则重定向、弹出窗口等所有内容都将更容易实现,因此这是不可能的。只是为了明确: Link1 你不能触发那个。 Link2 这里你可以触发onclick,因为它不包含href标签。

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

2

我曾经遇到过同样的问题,改变将事件绑定到函数的方式解决了它。

  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

1

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

请尝试:

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

myButtons.click();

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


我有同样的想法,但编程触发显然是在处理程序被绑定之后发生的。 触发发生在页面上另一个“a”的“click”事件中。 - Jacob
@Jacob:它们是彼此的后代吗? - Eric

1

奇怪。你试过.trigger('click')吗?理论上,它们应该是相同的(现在正在查看jQuery代码以找出答案)。编辑:看起来.click()只是.trigger('click')的代理,所以它可能没有帮助。

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


尝试在小部件加载并进行评估时,在页面上绑定一个.live('click', ...)事件,以查看是否存在加载小部件的问题。 - simshaun
click 事件处理程序正常工作。单击链接有效,但以编程方式触发它则无效。 - Jacob
文档中说:“尽管 .trigger() 模拟了事件的激活,包括合成的事件对象,但它并不能完美地复制自然发生的事件。” 我正在努力弄清楚这究竟意味着什么,但也许与此有关。 - simshaun
是的,我正在尝试在<li>内部调用.trigger('click')来触发<img>,但是我收到了一个错误:“TypeError:Object #<an HTMLImageElement> has no method 'trigger'”。 - IgorGanapolsky

0
如果它没有回忆起事件,特别是自定义事件,这些事件被正确记录,那么很可能是在分配事件处理程序之后重新加载了jQuery库。
使用以下代码检查您的代码:
jQuery (document).ready (function () {
    // Test your code here
});

0

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

通过阅读这里的答案,我意识到这是由于执行顺序的原因。我在几行代码后绑定了事件处理程序,而在点击时调用函数。

这是一个“哎呀!”的时刻...


-1
回到 DOM 并使用以下方法:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接