如果我没有使用绑定或单击已绑定事件处理程序,我可以调用jquery click()来跟随<a>链接吗?

Mne*_*quo 175 javascript firefox jquery events click

我的JavaScript中有一个计时器,需要模拟点击一个链接,一旦时间流逝就转到另一个页面.要做到这一点,我正在使用jQuery的click()功能.我已经使用$().trigger()window.location也,我可以作出打算与所有三个它的工作.

我观察到一些奇怪的行为,click()我试图了解发生了什么以及为什么.

我正在使用Firefox来解决这个问题,但我也对其他浏览器会对此做些什么感兴趣.

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

但是,如果我首先设置一个事件处理程序,那么即使事件处理程序什么都不做,它也会按预期工作.

$('a').click(function(){return true;}).click();
Run Code Online (Sandbox Code Playgroud)

这会加载新页面,就像我自己点击了一样.

所以我的问题是双重的:这种奇怪的行为是因为我在某处做错了吗?click()如果我没有创建自己的处理程序,为什么调用对默认行为不起作用?

编辑:

当霍夫曼确定他试图复制我的结果时,我上面描述的结果实际上并没有发生.我不确定是什么原因引起了我昨天观察到的事件,但我今天肯定这不是我在问题中所描述的.

所以答案是你不能在浏览器中"伪造"点击并且所有jQuery都会调用你的事件处理程序.您仍然可以使用window.location更改页面,这对我来说很好.

Pet*_*ter 241

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

document.getElementById("a_link").click()
Run Code Online (Sandbox Code Playgroud)

  • 党!这确实有效!但我必须说它不是"vanilla"javascript,因为它使用的是jquery元素,所以它是类似于jilla jquery javascript ....它适用于Firefox 24和IE 10. (4认同)

Hof*_*ann 89

有趣的是,这可能是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> 
Run Code Online (Sandbox Code Playgroud)

除非您直接点击链接(带或不带注释代码),否则它永远不会进入google.com.另请注意,即使将click事件绑定到链接,单击按钮后它仍然不会变为紫色.如果直接点击链接,它只会变紫.

我做了一些研究,似乎.click不会与'a'标签一起使用,因为浏览器不会使用javascript支持"假点击".我的意思是,你不能用javascript"点击"一个元素.使用'a'标签,您可以触发其onClick事件,但链接不会更改颜色(对于访问过的链接颜色,在大多数浏览器中默认为紫色).因此,将$().click事件与'a'标记一起使用是没有意义的,因为转到href属性的行为不是onClick事件的一部分,而是在浏览器中硬编码.

  • 我尝试了你的代码,它完全像你所说的那样,但是我的代码就像我上面描述的那样.我会做更多的实验,看看我是否可以把你可以尝试的结果的一个简单例子放在一起. (7认同)

Rya*_*nch 64

如果你查看$.click函数的代码我会打赌有一个条件语句,它检查元素是否在click事件发生之前有为该事件注册的侦听器.为什么不直接href从链接获取属性并手动更改页面位置?

 window.location.href = $('a').attr('href');
Run Code Online (Sandbox Code Playgroud)

编辑:这就是为什么它没有点击,从trigger功能,jQuery源1.3.2版:

 // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
    if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
        event.result = false;

    // Trigger the native events (except for clicks on links)
    if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
        this.triggered = true;
        try {
            elem[ type ]();
        // prevent IE from throwing an error for some hidden elements
        } catch (e) {}
    }
Run Code Online (Sandbox Code Playgroud)

在调用处理程序(如果有的话)之后,jQuery会在对象上触发一个事件.但是,如果元素不是链接,它仅调用单击事件的本机处理程序.我想这是出于某种原因有目的地完成的.虽然是否定义了事件处理程序,但这应该是正确的,因此我不确定为什么在您的情况下附加事件处理程序会导致onClick调用本机处理程序.你必须做我做的事情并逐步完成执行以查看它的调用位置.

  • window.location有效,但不能发布HTTP Referrer,并打破后退按钮. (2认同)

mar*_*lly 5

锚标签上的点击处理程序是jQuery中的一个特例.

我想你可能会在主播的onclick事件(浏览器已知)和jQuery对象的click事件之间感到困惑,它包含了DOM的锚标记概念.

您可以在此处下载jQuery 1.3.2源代码.

源代码的相关部分是2643-2645行(我已将其拆分为多行,以便更容易理解):

// Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
if (
     (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && 
       elem["on"+type] && 
       elem["on"+type].apply( elem, data ) === false
   )
     event.result = false;
Run Code Online (Sandbox Code Playgroud)


Ric*_*Wit 5

JavaScript/jQuery 不支持以编程方式“点击”链接的默认行为。

相反,您可以创建一个表单并提交它。这样您就不必使用window.locationwindow.open,它们通常被浏览器阻止为不需要的弹出窗口。

该脚本有两种不同的方法:一种尝试打开三个新选项卡/窗口(它只在 Internet Explorer 和 Chrome 中打开一个,更多信息如下),另一种在链接点击时触发自定义事件。

方法如下:

HTML

<html>
<head>
    <script src="jquery-1.9.1.min.js" type="text/javascript"></script>
    <script src="script.js" type="text/javascript"></script>
</head>

<body>
    <button id="testbtn">Test</button><br><br>

    <a href="https://google.nl">Google</a><br>
    <a href="http://en.wikipedia.org/wiki/Main_Page">Wikipedia</a><br>
    <a href="https://stackoverflow.com/">Stack Overflow</a>
</body>

</html>
Run Code Online (Sandbox Code Playgroud)

jQuery(文件script.js

$(function()
{
    // Try to open all three links by pressing the button
    // - Firefox opens all three links
    // - Chrome only opens one of them without a popup warning
    // - Internet Explorer only opens one of them WITH a popup warning
    $("#testbtn").on("click", function()
    {
        $("a").each(function()
        {
            var form = $("<form></form>");
            form.attr(
            {
                id     : "formform",
                action : $(this).attr("href"),
                method : "GET",
                // Open in new window/tab
                target : "_blank"
            });

            $("body").append(form);
            $("#formform").submit();
            $("#formform").remove();
        });
    });

    // Or click the link and fire a custom event
    // (open your own window without following 
    // the link itself)
    $("a").on("click", function()
    {
        var form = $("<form></form>");
        form.attr(
        {
            id     : "formform",
            // The location given in the link itself
            action : $(this).attr("href"),
            method : "GET",
            // Open in new window/tab
            target : "_blank"
        });

        $("body").append(form);
        $("#formform").submit();
        $("#formform").remove();

        // Prevent the link from opening normally
        return false;
    });
});
Run Code Online (Sandbox Code Playgroud)

对于每个链接元素,它:

  1. 创建表单
  2. 赋予它属性
  3. 将其附加到 DOM 以便提交
  4. 提交
  5. 从 DOM 中移除表单,移除所有痕迹 *插入邪恶的笑声*

现在你有一个新的标签/窗口加载"https://google.nl"(或任何你想要的 URL,只需替换它)。不幸的是,当您尝试以这种方式打开多个窗口时,您会Popup blocked在尝试打开第二个窗口时收到一个消息栏(第一个仍然打开)。


有关我如何使用此方法的更多信息,请参见此处:


10G*_*per 5

您可以使用 jQuery 来选择该元素的 jQuery 对象。然后,获取底层 DOM 元素并调用其click()方法。

按 ID:

$("#my-link").each(function (index) { $(this).get(0).click() });
Run Code Online (Sandbox Code Playgroud)

或者使用 jQuery 通过 CSS 类点击一堆链接:

$(".my-link-class").each(function (index) { $(this).get(0).click() });
Run Code Online (Sandbox Code Playgroud)