我找到了适用于 Chrome 和 Firefox 的解决方案。我已经在用户脚本中实现了代码,不要跟踪我 Google。
演示(在 Firefox 9 和 Chrome 17 中测试):http: //jsfiddle.net/RxHw5/
Webkit (Chrome, ..) 和 Firefox 37+ (33+*) 的引用隐藏
基于 Webkit 的浏览器(例如 Chrome、Safari)支持 <a rel="noreferrer">
规范。
通过将此方法与两个事件侦听器相结合,可以完全实现引用隐藏:
mousedown
- 单击时,中键单击,右键单击上下文菜单,...
keydown
( Tab Tab Tab... Enter)。
代码:
function hideRefer(e) {
var a = e.target;
// The following line is used to deal with nested elements,
// such as: <a href="."> Stack <em>Overflow</em> </a>.
if (a && a.tagName !== 'A') a = a.parentNode;
if (a && a.tagName === 'A') {
a.rel = 'noreferrer';
}
}
window.addEventListener('mousedown', hideRefer, true);
window.addEventListener('keydown', hideRefer, true);
*rel=noreferrer
从 33 开始在 Firefox 中受支持,但支持仅限于页内链接。当用户通过上下文菜单打开选项卡时,仍然会发送推荐人。此错误已在 Firefox 37 [错误 1031264 ]中修复。
隐藏旧 Firefox 版本的引荐来源网址
Firefoxrel="noreferrer"
直到版本 33 ` [ bug 530396 ](或 37,如果您还希望隐藏上下文菜单的引用者)才支持。
data-URI +<meta http-equiv=refresh>
可用于在 Firefox(和 IE)中隐藏引荐来源网址。实现这个特性比较复杂,但也需要两个事件:
click
- 单击时,中键单击时,Enter
contextmenu
- 在右键单击时,Tab Tab...Contextmenu
在 Firefox 中,click
每个事件都会触发mouseup
并点击Enter链接(或表单控件)。该contextmenu
事件是必需的,因为click
对于这种情况,事件触发得太晚了。
基于 data-URIs 和瞬间超时:
当click
事件被触发时,href
属性会临时替换为 data-URI。事件结束,默认行为发生:打开 data-URI,取决于target
属性和 SHIFT/CTRL 修饰符。
同时,href
属性恢复到原来的状态。
当contextmenu
事件被触发时,链接也会在一瞬间发生变化。
- 这些
Open Link in ...
选项将打开 data-URI。
- 该
Copy Link location
选项指的是恢复的原始 URI。
- ☹ 该
Bookmark
选项是指 data-URI。
- ☹
Save Link as
指向 data-URI。
代码:
// Create a data-URI, redirection by <meta http-equiv=refresh content="0;url=..">
function doNotTrack(url) {
// As short as possible. " can potentially break the <meta content> attribute,
// # breaks the data-URI. So, escape both characters.
var url = url.replace(/"/g,'%22').replace(/#/g,'%23');
// In case the server does not respond, or if one wants to bookmark the page,
// also include an anchor. Strictly, only <meta ... > is needed.
url = '<title>Redirect</title>'
+ '<a href="' +url+ '" style="color:blue">' +url+ '</a>'
+ '<meta http-equiv=refresh content="0;url=' +url+ '">';
return 'data:text/html,' + url;
}
function hideRefer(e) {
var a = e.target;
if (a && a.tagName !== 'A') a = a.parentNode;
if (a && a.tagName === 'A') {
if (e.type == 'contextmenu' || e.button < 2) {
var realHref = a.href; // Remember original URI
// Replaces href attribute with data-URI
a.href = doNotTrack(a.href);
// Restore the URI, as soon as possible
setTimeout(function() {a.href = realHref;}, 4);
}
}
}
document.addEventListener('click', hideRefer, true);
document.addEventListener('contextmenu', hideRefer, true);
结合两种方法
不幸的是,没有直接的方法来检测这个特性(更不用说考虑错误了)。因此,您可以选择基于navigator.userAgent
(即 UA 嗅探)的相关代码,也可以使用如何检测 rel="noreferrer" 支持中的一种复杂检测方法?.