【问题标题】:jquery live return false on A tagsjquery live在A标签上返回false
【发布时间】:2011-11-03 07:25:37
【问题描述】:

我有一个点击绑定到一个元素。处理程序执行后返回false,但是如果元素恰好是A标签,那么链接也没有被跟踪,这是不可接受的......

$('*').live('click', function(){
  // lots of code here
  return false;
});

现在如果被点击的元素有一个类似A>img 的路径并且点击了图片,A 将永远不会被跟随。我不希望点击事件进一步传播。

我该如何做到这一点?

编辑:

我的应用程序必须将事件绑定到 *.此外,可以在任何元素上进行点击,而不仅仅是 A。因此,上述解决方案都不适合我希望实现的目标。

【问题讨论】:

  • 您的代码最后返回 false,因此不会执行任何操作,您正在对所有元素执行它*

标签: javascript jquery click live


【解决方案1】:

你要找的是preventDefault()

$('*').live('click', function(e){
  // lots of code here
  e.preventDefault();
  return false; // Don't think this is necessary
});

我还想说,将事件附加到所有元素可能不是一个好主意。

专门附加到A 标签会更好地为您服务:

$('a').click(function(e){
    // lots of code here
    e.preventDefault();
    return false;
});

【讨论】:

    【解决方案2】:

    我不会将点击函数绑定到*。您可以将其绑定到 body 元素;点击将从被点击的元素传播到body 元素。您可以像这样检查最初点击的元素:

    $("body").live("click", function (e) {
        if ($(e.originalEvent.target).is("a")) {
            return false;
        }
    });
    

    话虽如此,您仍然可以这样做:

    $("*").live("click", function () {
        if ($(this).is("a") == false) {
            return false;
        }
    });
    

    【讨论】:

      【解决方案3】:

      试试:

      if($(this).tagName == 'A')
          return true; // perhaps even { do nothing }
      else
          return false;
      

      这可能不是获取标记名的确切代码,请参阅How to extend jQuery to make it easier to retrieve the tagName

      另见:http://fuelyourcoding.com/jquery-events-stop-misusing-return-false/

      【讨论】:

      • this.tagName 或 this.nodeName 就足够了
      • 查看“那么你真正想要什么?”下的 stopPropagation() 小节。在我放在那里的第二个链接中。我认为这可能是您正在寻找的东西,但正如 Bryan Ross 所说,您可能不想附加到每个 DOM 对象。谢谢你澄清,jerjer。
      猜你喜欢
      • 2013-02-02
      • 1970-01-01
      • 2019-06-02
      • 1970-01-01
      • 2013-11-28
      • 2013-09-06
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      相关资源
      最近更新 更多