我的 JavaScript 中有一个计时器,它需要模拟单击链接以在时间过去后转到另一个页面。为此,我使用了 jQuery 的click()函数。我也使用过,$().trigger()并且window.location我可以使它与所有三个一起按预期工作。
click()
$().trigger()
window.location
我观察到一些奇怪的行为,click()我试图了解发生了什么以及为什么。
我在这个问题中描述的所有内容都使用 Firefox,但我也对其他浏览器将对此做什么感兴趣。
如果我没有使用$('a').bind('click',fn)或$('a').click(fn)设置事件处理程序,那么调用$('a').click()似乎什么都不做。它不会为此事件调用浏览器的默认处理程序,因为浏览器不会加载新页面。
$('a').bind('click',fn)
$('a').click(fn)
$('a').click()
但是,如果我先设置一个事件处理程序,那么即使事件处理程序什么也不做,它也会按预期工作。
$('a').click(function(){return true;}).click();
这会加载新页面,就好像我自己单击了 a 一样。
所以我的问题是双重的:这种奇怪的行为是因为我在某处做错了什么吗?click()如果我没有创建自己的处理程序,为什么调用对默认行为没有任何作用?
正如霍夫曼在试图复制我的结果时所确定的那样,我上面描述的结果实际上并没有发生。我不确定是什么导致了我昨天观察到的事件,但我今天确定这不是我在问题中描述的。
所以答案是你不能在浏览器中“伪造”点击,而 jQuery 所做的只是调用你的事件处理程序。您仍然可以使用window.location来更改页面,这对我来说很好。
有趣的是,这可能是 jQuery 的“功能请求”(即错误)。如果您将 jQuery 事件绑定到元素,则 jQuery click 事件只会触发元素上的单击操作(在 DOM 上称为 onClick 事件)。你应该去 jQuery 邮件列表 ( http://forum.jquery.com/ ) 并报告这个。这可能是想要的行为,但我不这么认为。
编辑:
我做了一些测试,你说的是错误的,即使你将一个函数绑定到一个’a’标签,它仍然不会带你到 href 属性指定的网站。试试下面的代码:
<html> <head> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script> <script> $(document).ready(function() { /* Try to dis-comment this: $('#a').click(function () { alert('jQuery.click()'); return true; }); */ }); function button_onClick() { $('#a').click(); } function a_onClick() { alert('a_onClick'); } </script> </head> <body> <input type="button" onclick="button_onClick()"> <br> <a id='a' href='http://www.google.com' onClick="a_onClick()"> aaa </a> </body> </html>
除非您直接单击链接(带有或不带有注释代码),否则它永远不会进入 google.com。另请注意,即使您将单击事件绑定到链接,单击按钮后它仍然不会变为紫色。如果您直接单击链接,它只会变成紫色。
我做了一些研究,似乎 .click 不应该与“a”标签一起使用,因为浏览器不支持使用 javascript 进行“假点击”。我的意思是,你不能用javascript“点击”一个元素。使用“a”标签,您可以触发其 onClick 事件,但链接不会更改颜色(更改为访问的链接颜色,在大多数浏览器中默认为紫色)。因此,让 $().click 事件与 ‘a’ 标签一起工作是没有意义的,因为转到 href 属性的行为不是 onClick 事件的一部分,而是在浏览器中硬编码。