小编典典

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

all

我的 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来更改页面,这对我来说很好。


阅读 59

收藏
2022-08-21

共1个答案

小编典典

有趣的是,这可能是 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 事件的一部分,而是在浏览器中硬编码。

2022-08-21