如果还没有将事件处理程序绑定到jQueryclick(),我可以调用jQueryclick()来跟随

如果还没有将事件处理程序绑定到jQueryclick(),我可以调用jQueryclick()来跟随<a>链接,或者已经单击了吗?

我的JavaScript中有一个计时器,它需要模拟单击一个链接,以便在时间流逝后转到另一个页面。为此,我使用jQuery的click()功能。我用过$().trigger()window.location而且,我可以让它像预期的那样工作在这三种情况下。

我观察到一些奇怪的行为click()我想弄清楚发生了什么以及为什么。

我在这个问题中所描述的一切都使用Firefox,但我也对其他浏览器会如何处理这个问题感兴趣。

如果我没有用$('a').bind('click',fn)$('a').click(fn)设置事件处理程序,然后调用$('a').click()好像什么都没做。它不为此事件调用浏览器的默认处理程序,因为浏览器不加载新页。

但是,如果我首先设置了一个事件处理程序,那么它将按预期的方式工作,即使事件处理程序什么也不做。

$('a').click(function(){return true;}).click();

这会加载新页面,就像我自己单击了a一样。

所以我的问题有两个:这是因为我在哪里做错了什么行为吗?为什么打电话click()如果我没有创建自己的处理程序,那么对默认行为不做什么?

编辑:

正如霍夫曼在试图复制我的结果时所确定的那样,我上面描述的结果实际上并没有发生。我不知道是什么导致了我昨天观察到的事件,但我确信今天不是我在问题中描述的那样。

因此,答案是您不能在浏览器中“伪造”单击,而jQuery所做的一切就是调用您的事件处理程序。你还可以用window.location改变页面,这对我来说很好。


HUH函数
浏览 397回答 3
3回答

幕布斯6054654

如果您查看$.click函数,我敢打赌有一个条件语句,它检查元素是否有为click事件进行之前发生。为什么不直接得到href属性并手动更改页面位置?&nbsp;window.location.href&nbsp;=&nbsp;$('a').attr('href');编辑:这就是为什么它不点击,从trigger函数,版本1.3.2的jQuery源代码:&nbsp;//&nbsp;Handle&nbsp;triggering&nbsp;native&nbsp;.onfoo&nbsp;handlers&nbsp;(and&nbsp;on&nbsp;links&nbsp;since&nbsp;we&nbsp;don't&nbsp;call&nbsp;.click()&nbsp;for&nbsp;links) &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;(!elem[type]&nbsp;||&nbsp;(jQuery.nodeName(elem,&nbsp;'a')&nbsp;&&&nbsp;type&nbsp;==&nbsp;"click"))&nbsp;&&&nbsp;elem["on"+type]&nbsp;&&&nbsp;elem["on"+type].apply(&nbsp;elem,&nbsp;data&nbsp;)&nbsp;===&nbsp;false&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.result&nbsp;=&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Trigger&nbsp;the&nbsp;native&nbsp;events&nbsp;(except&nbsp;for&nbsp;clicks&nbsp;on&nbsp;links) &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;!bubbling&nbsp;&&&nbsp;elem[type]&nbsp;&&&nbsp;!event.isDefaultPrevented()&nbsp;&&&nbsp;!(jQuery.nodeName(elem,&nbsp;'a')&nbsp;&&&nbsp;type&nbsp;==&nbsp;"click")&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.triggered&nbsp;=&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elem[&nbsp;type&nbsp;](); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;prevent&nbsp;IE&nbsp;from&nbsp;throwing&nbsp;an&nbsp;error&nbsp;for&nbsp;some&nbsp;hidden&nbsp;elements &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(e)&nbsp;{} &nbsp;&nbsp;&nbsp;&nbsp;}在调用处理程序(如果有的话)之后,jQuery将触发对象上的一个事件。但是,只有当元素不是链接时,它才会为单击事件调用本机处理程序。我想这是出于某种原因。这应该是正确的,尽管是否定义了事件处理程序,因此我不确定为什么在您的示例中附加事件处理程序会导致本机onClick将被调用的处理程序。您将不得不执行我所做的工作,并逐步执行以查看调用它的位置。
打开App,查看更多内容
随时随地看视频慕课网APP