如果我还没有使用绑定或单击将事件处理程序绑定到<a>链接,我可以调用jQuery的click()来跟踪它吗?

2022-08-30 01:57:27

我的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


答案 1

另一种选择当然是只使用vanilla JavaScript:

document.getElementById("a_link").click()

答案 2

有趣的是,这可能是jQuery的“功能请求”(即bug)。如果将 jQuery 事件绑定到元素,则 jQuery 单击事件仅触发元素上的单击操作(在 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 事件的一部分,而是在浏览器中进行硬编码的。