jQuery:将 onClick 绑定到指向具有 target=_self 的其他页面的所有锚点

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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
   );

【讨论】:

以上是关于jQuery:将 onClick 绑定到指向具有 target=_self 的其他页面的所有锚点的主要内容,如果未能解决你的问题,请参考以下文章

jquery移除onclick绑定重新绑定别的函数来执行onclick事件

将 onclick/ng-click 事件附加到网格数据绑定事件中的元素

Jquery 移除 html中绑定的onClick事件

jQuery 选择器可以选择所有具有“onclick”属性的元素吗?

JQuery 绑定页面所有input的onclick事件

jQuery-事件