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:
。
基本上,我需要所有那些如果点击会导致当前页面被卸载的链接。但应排除所有其他链接,如#point1
或javascript: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 事件附加到网格数据绑定事件中的元素