【问题标题】:jQuery: Bind onClick to all anchors pointing to other pages with target=_selfjQuery:将 onClick 绑定到指向具有 target=_self 的其他页面的所有锚点
【发布时间】:2016-01-29 22:57:19
【问题描述】:

每当用户点击任何a 不在新窗口中打开 并且具有href 属性不为空不以#开头不以javascript:

基本上,我需要所有那些如果点击会导致当前页面被卸载的链接。但应排除所有其他链接,如#point1javascript:alert(''); 等(因为如果单击,用户仍将留在页面上)。什么是合适的 jQuery?

理想情况下应该与旧的 jQuery - 1.7.2 版兼容

【问题讨论】:

    标签: javascript jquery html


    【解决方案1】:

    试试这个:

    $(document).on('click', 'a[href][href!=""]:not([href^="#"],[href^="javascript:"],[target="_blank"])', function() {
        // do something
    })
    

    但是,您必须考虑到它不是一个可读性很强的代码来维护。传递过滤器函数(如@Rory McCrossan 的答案)可能更具可读性。

    Fiddle

    P.S 您是否考虑过使用 beforeunload 事件来代替?

    【讨论】:

    • +1 用于使用委托处理程序,带有选择器。仅供参考,您应该习惯性地使用$(document) 而不是body 用于委托处理程序。 body 有一个与样式有关的错误。
    • @TrueBlueAussie,谢谢。已更新。
    • 所以我应该使用 [href^="#"] 来表示不以条件开头,还应该附加 [href^="javascript:"]?
    • @FitDev,我用#的正确处理更新了答案
    • 哦,我看到你刚刚通过编辑回答了这个问题。谢谢!
    【解决方案2】:

    因为这是一组相当复杂的规则,您可以使用filter()

    $('a').filter(function() {
        var href = $(this).attr('href');
        return href != '' && href != '#someanchor' && this.target != '_blank';
    }).click(function() {
        // do your thing here...
    });
    

    【讨论】:

    • 单个委托处理程序,无论 jQuery 选择器多么复杂,总是比加载单个单击处理程序的性能更好。
    • 我同意,尽管@haim770 声称该答案:)
    • @RoryMcCrossan,+1 但是,您有什么理由坚持使用attr('href') 而不是this.href
    • @Haim770 感谢您的编辑,但我通过attr() 专门使用了href,因为它为您提供了来自DOM 的属性值。使用this.href 意味着URL 是绝对的,这可能会导致差异。示例:jsfiddle.net/zcgrpdum
    • @RoryMcCrossan,我明白了
    【解决方案3】:

    您可以使用 jQuery 的 .not() 方法。见:http://api.jquery.com/not/

    $('a')
       .not('[target=_blank]')
       .not('[href=""]')
       .not('[href=#someanchor]')
       .on('click', function() {
          //code here
       });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-08
      • 1970-01-01
      • 2017-04-20
      相关资源
      最近更新 更多