【问题标题】:Why jQuery cannot trigger native click on an anchor tag?为什么 jQuery 不能触发原生点击锚标签?
【发布时间】:2014-01-13 23:22:11
【问题描述】:

最近发现jQuery在点击其他元素时无法触发锚标签的原生点击事件,下面的例子不起作用:

html

<a class="js-a1" href="new.html" target="_blank">this is a link</a>
<a class="js-a2" href="another.html" target="_blank">this is another link</a>

javascript

$('.js-a1').click(function () {
  $('.js-a2').click();
  return false;
});

这里是jsfiddle - 1。点击第一个链接不会触发第二个链接的原生点击。

经过一番搜索,我找到了解决方案和解释。

解决方案

使用原生 DOM 元素。

$('.js-a1').click(function () {
  $('.js-a2').get(0).click();
  return false;
});

这里是jsfiddle - 2

说明

我在 Learn jQuery 上找到了一篇帖子:Triggering Event Handlers。它告诉我:

.trigger() 函数不能用于模拟原生浏览器事件,例如单击文件输入框或锚标记。这是因为,没有使用与这些事件对应的 jQuery 事件系统附加事件处理程序。

问题

所以我的问题来了:

如何理解'没有使用jQuery的事件系统附加的事件处理程序对应这些事件'

为什么没有对应的事件处理器?

编辑

我更新了我的 jsfiddles,似乎类名有错误。

【问题讨论】:

  • 你试过 event.preventDefault() 吗?
  • @TejasvaDhyani 是的,jQuery 中的return false; 将同时执行e.preventDefault();e.stopPropagation();

标签: javascript jquery


【解决方案1】:

老问题,但这是一个漂亮而简单的解决方案: 通过将 DOM 元素的 onEvent 处理程序分配为本机事件,您基本上可以使用 jQuery“注册”本机 JS 事件。理想情况下,我们会先检查以确保尚未设置 onEvent 处理程序。
例如,“注册”原生 JS 的点击事件,这样它就会被 jQuery 触发:

$('.js-a1').click(function (e) {
  $('.js-a2').click();
  e.preventDefault();
});

var trigger_element = $('.js-a2')[0]; // native DOM element
if (!trigger_element.onclick) {
  trigger_element.onclick = trigger_element.click;
}

这是一个小提琴:http://jsfiddle.net/f9vkd/162/

【讨论】:

    【解决方案2】:

    没有使用与这些事件对应的 jQuery 事件系统附加的事件处理程序

    这意味着,在学习材料的这一点上,没有使用 .click(function() {}.bind('click', function () {}) 等将 jQuery 事件处理程序附加到这些元素。

    无参数.click()用于从jQuery的角度触发(.trigger('click'))一个“click”事件,它将执行jQuery使用.click.bind、@注册的所有“click”事件处理程序987654328@等。这个伪事件不会发送到浏览器。

    .trigger()

    执行所有附加到给定事件类型的匹配元素的处理程序和行为。

    查看updated jsFiddle example,点击两个链接查看区别。希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      你必须使用$("selector").trigger('click')

      【讨论】:

      • .trigger("click").click() 相同。
      【解决方案4】:

      首先你需要防止链接的默认行为

      $('.js-a1').click(function (e) {
        e.preventDefault();
        $('.js-a2').get(0).click();
        return false;
      });
      

      而触发点击事件你也可以使用.trigger('click')更好的方式

      并且事件处理程序是这样使用的:

      $(document).on('click', '.js-a1',function(){//code in here});
      // here now .js-a1 is event handler
      

      【讨论】:

      • .trigger("click").click() 相同。
      • 同意@cookiemonster,$('.js-a2').get(0)会得到一个DOM元素。
      • 另外:return false 在 jQuery 处理程序中同时执行 e.preventDefaulte.stopPropagtion,因此其中一个在您的答案中是多余的。
      【解决方案5】:

      我想你忘记阅读文档了。

      文件说:

      // Triggering a native browser event using the simulate plugin
      $( ".js-a2" ).simulate( "click" );
      

      【讨论】:

      • 什么文档?
      • 是的,它是这么说的。但这只是另一种解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-26
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多