Я нашел решение, которое работает в Chrome и Firefox. Я реализовал код в сценарии пользователя, Не отслеживайте меня Google .
Демо (протестировано в Firefox 9 и Chrome 17): http://jsfiddle.net/RxHw5/
Referrer скрывается за Webkit (Chrome, ..) и Firefox 37+ (33 + *)
Браузеры на основе Webkit (такие как Chrome, Safari) Поддержка <a rel="noreferrer">
spec .
Скрытие реферера может быть полностью реализовано путем объединения этого метода с двумя прослушивателями событий:
mousedown
- при щелчке, среднем щелчке, контекстном меню правой кнопкой мыши, ...
keydown
( Tab Tab Tab ... Введите ).
Код:
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
поддерживается в Firefox начиная с 33, но поддержка была ограничена ссылками на странице. Ссылки были по-прежнему отправлены, когда пользователь открыл вкладку через контекстное меню. Эта ошибка была исправлена в Firefox 37 [ ошибка 1031264 ] .
Referrer скрывается для старых версий Firefox
Firefox не поддерживал rel="noreferrer"
до версии 33 ` [ ошибка 530396 ] (или 37, если вы также хотите скрыть источник ссылок для контекстных меню).
data-URI + <meta http-equiv=refresh>
может использоваться для скрытия реферера в Firefox (и IE). Реализация этой функции более сложна, но также требует двух событий:
click
- при щелчке, при среднем нажатии введите
contextmenu
- При щелчке правой кнопкой мыши Tab Tab ... Contextmenu
В Firefox событие click
запускается для каждого mouseup
и , нажимающего Введите для ссылки (или элемента управления формы). Событие contextmenu
является обязательным, поскольку событие click
срабатывает слишком поздно для этого случая.
На основе данных URI и тайм-аутов в доли секунды:
Когда срабатывает событие click
, атрибут href
временно заменяется на URI данных. Событие завершено, и происходит поведение по умолчанию: открытие data-URI, в зависимости от атрибута target
и модификаторов SHIFT / CTRL.
При этом атрибут href
восстанавливается в исходное состояние.
Когда срабатывает событие contextmenu
, ссылка также изменяется на доли секунды.
- Опции
Open Link in ...
откроют data-URI.
- Параметр
Copy Link location
относится к восстановленному исходному URI.
- option Опция
Bookmark
относится к data-URI.
- ☹
Save Link as
указывает на 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"? .