触发点击 JQuery 不起作用。

23
我正在弄清楚为什么这个简单的脚本不起作用:
jQuery.noConflict();
jQuery(document).ready(function() {
    jQuery('.next_button a').trigger('click');
});

noConflict是必要的,因为我在这个页面上还加载了prototype/scriptaculous。

如果我用另一个函数(比如:.css(...))替换.trigger('click'),它可以正常工作。似乎只有触发事件有问题。


你的问题如果没有展示出问题的测试用例,就是不完整的。请参考jsFiddle - mekwall
抱歉,我无法公开发布网站链接,只能在私下分享。 - Riccardo
Gary Green所回答的可能是你正在寻找的,但如果没有其他代码,就无法确定。 - mekwall
我理解,但我不能再发布更多了,无论如何还是谢谢。 - Riccardo
4个回答

67

9
[0] 获取第一个(DOM)元素。.click()函数调用的是浏览器内置的“click”函数(而非jquery的)。 - Tahir Hassan
7
这个答案应该被接受,因为它提供了一个解决方案,即 [0] - tim peterson
1
太好了!没有错误地运行。我把它放在 $('a.sliderLinks').trigger('click'); 但是不起作用。然后我使用了你的代码。太棒了!再次感谢。 - Sumith Harshan
http://jsfiddle.net/YHx2d/ 这个 fiddle 上运行良好,没有 [0]... 但是在我的实际页面上却不行... - ah-shiang han
是的,使用[0]后我的页面可以工作,我的问题是为什么 Fiddle 不使用[0]也能工作,但我的页面需要使用[0]。我有点困惑。提前感谢您的解释。 - ah-shiang han
显示剩余5条评论

50

您只能触发 jQuery 创建的点击事件。这是 jQuery 的一个有趣小特点。


4
好的建议是,在确立了点击监听器之后再使用触发器方法。 - Doug Molineux
1
不仅如此,Pete,这也意味着默认的锚标签使用。 - Brandt Solovij
1
+1 你了!这让我免去了打破桌子和扔电脑的烦恼!提醒那些可能正在使用backbone + requirejs的人们,如果你的UI元素的触发事件不起作用,你可能需要在调用时正确处理jquery对象。 - JohnP
监听器之后触发。在我发现这一点之前浪费了很多时间。+1 @PeteHerbertPenito - khany
那很有帮助。谢谢。 - arshad

12

正如Gary所回答的那样,下面的代码将无法工作。

$('#border_wrap').trigger('click');    
$('#border_wrap').click(function(e){
    console.log("clicked1");
});

但这会……:)

$('#border_wrap').click(function(e){
    console.log("clicked1");
});
$('#border_wrap').trigger('click'); 

谢谢@keithics,我犯了一个你上面解释的错误。 - Mahesh.D

0

我原本以为this demo不会起作用,但它确实可以(Chrome 12)。它将alert两个消息,一个是由jQuery创建的,另一个是本地的,但我认为只有jQuery事件才能被触发。

编辑:是的,click不遵循href

编辑2:所以你想要手动触发的事件实际上是由Prototype轮播插件创建的事件。对于下面的代码,我假设它是this one。如果是这样,为什么不能使用Prototype或本地方式fire the event触发事件,就像这样:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Title</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <style type="text/css">
        #carousel-wrapper {
            width:100px;
            height:100px;
            overflow:hidden;
            border:1px dashed red;
        }
        #carousel-content {
            width:500px;
        }
        #carousel-content .slide {
            float:left;
            width:100px;
            height:100px;
        }
    </style>

    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/prototype/1.7.0.0/prototype.js"></script>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/scriptaculous/1.8.3/scriptaculous.js"></script>
    <script type="text/javascript" src="http://prototype-carousel.googlecode.com/files/carousel-min.js"></script>
    <script type="text/javascript" src="https://github.com/kangax/protolicious/raw/5b56fdafcd7d7662c9d648534225039b2e78e371/event.simulate.js"></script>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
        jQuery.noConflict();

        function fakeClick(event, anchorObj) {
          if (anchorObj.click) {
            anchorObj.click()
          } else if(document.createEvent) {
            if(event.target !== anchorObj) {
              var evt = document.createEvent("MouseEvents");
              evt.initMouseEvent("click", true, true, window,
                  0, 0, 0, 0, 0, false, false, false, false, 0, null);
              var allowDefault = anchorObj.dispatchEvent(evt);
              // you can check allowDefault for false to see if
              // any handler called evt.preventDefault().
              // Firefox will *not* redirect to anchorObj.href
              // for you. However every other browser will.
            }
          }
        }
    </script>
</head>
<body>
<div id="carousel-wrapper">
    <div id="carousel-content">
        <div class="slide">1</div>
        <div class="slide">2</div>
        <div class="slide">3</div>
    </div>
</div>
<div>
    <a href="javascript:" class="carousel-jumper" rel="slide-1">Jump to slide 1</a>
    <a href="javascript:" class="carousel-control" rel="prev">Previous slide</a>
    <a href="javascript:" class="carousel-control" id="next" rel="next">Next slide</a>
</div>
<script type="text/javascript">
    new Carousel('carousel-wrapper', $$('#carousel-content .slide'), $$('a.carousel-control', 'a.carousel-jumper'));

    document.observe("dom:loaded", function() {
//        $$('a[rel="next"]')[0].simulate('click');
        fakeClick(event, document.getElementById('next'));
    });
</script>
</body>
</html>

在这个演示中有两个事件触发的例子(其中一个被注释掉,但您可以切换以获得相同的结果)。一个是来自 Trigger an event with Prototype,它使用 event.simulate.js,另一个使用 How can I simulate a click to an anchor tag? 中的 fakeClick() 函数。其中任何一个都适用于我在 Chrome 12 中。

感谢大家,但即使我尝试了你们提供的各种解决方案,还是无法工作。我真的不知道。如果可以帮忙的话..我正在尝试自动点击scriptaculous旋转木马的下一个按钮..可能由于设计原因被禁用了自动点击??嗯嗯.. - Riccardo
你使用的是哪个走马灯? - andyb
这不是我做的,它是从carousel.js调用的,它被命名为“HP carousel”... - Riccardo
如果它是原型轮播,为什么需要使用jQuery?假设您正在使用prototype-carousel,我已更新我的答案并提供了一个潜在的解决方案。 - andyb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接