Измените document.location, чтобы открыть новую вкладку/окно вместо навигации на текущей вкладке
Я хочу написать букмарклет, который будет изменять любую веб-страницу, так что, когда код JavaScript на этой странице сделает что-то вроде document.location = 'http://site.tld'
или document.location.href = 'http://site.tld'
, страница откроет новую вкладку или окно вместо изменения местоположения; так же, как если бы код был window.open('http://site.tld')
;
Могу ли я каким-либо образом модифицировать прототип для достижения этой цели? (Я использую это слово небрежно, потому что, хотя я читал об изменении прототипов несколько раз, я никогда не делал этого.) Или есть какой-то другой способ?
Ответы
Ответ 1
Вы не сказали, какой браузер вы используете, но единственный способ, которым я могу это сделать, - использовать Firefox Object.watch
.
document.watch('location', function(prop, oldval, newval) {
window.open(newval);
return '#';
});
Это будет вмешиваться в любую попытку установить document.location
, вместо этого открыть окно с тем же аргументом, а затем вместо этого изменить назначение на '#'
(что обычно ничего не будет делать).
В форме букмарклета и расширена для покрытия как document.location
, так и window.location
:
javascript:(function(){var handle=function(prop, oldval, newval){window.open(newval); return '#';};document.watch('location',handle);window.watch('location',handle);})();
Но даже это не будет работать против назначения document.location.href
; объект местоположения - это особая вещь, с которой Object.watch
отказывается работать.
Если этого недостаточно, вы можете использовать onbeforeunload
, чтобы просить вас, когда вы пытаетесь перемещаться и отменить его (если это ваша цель здесь).
Лучший, у меня есть, извините!
Ответ 2
Я собирался предложить использовать ES5 Object.defineProperty, но, как и должно быть, document.location - это "настраиваемый: false" объект, что означает, что он не может быть изменен. Для любопытных, если бы вы могли его изменить, код был бы таким:
Object.defineProperty(document.location, 'href', {
get: function() { return this.href },
set: function(value) { this.href = value; window.open(value); return false} //Not sure about this part, but anyways...
});
Изменить: отвечая на ваш вопрос, я не думаю, что это возможно с помощью букмаркета.
Ответ 3
Я пробовал разные методы, но почти невозможно отследить href целевого окна.
Используя
window.onbeforeunload = function(e) {
window.open(document.location.href);
};
откроет ваше текущее окно на другой вкладке и цели в текущем окне. Проблема в том, что onbeforeunload запускается не только при изменении местоположения окна, даже при закрытии окна или его обновлении. Зависит от того, где вы хотите его использовать.
PS:
window.onunload = function() {
document.location = document.location;
}
если вы проверите это, когда вы измените местоположение страницы, вы сможете увидеть новый URL-адрес в адресной строке на некоторое время, после чего вы будете перенаправлены на вашу текущую страницу. Мне не удалось получить новую цель. Удачи!
Ответ 4
Вы могли бы сделать что-то только с прототипом, если бы это был вызов функции, а не назначение. Например, в случае document.write
document.write = function(txt) {
alert("txt");
};
document.write("test");
Ответ 5
FWIW: это работает с последним браузером для поиска выделенного текста на новой вкладке:
javascript: Qr = document.getSelection(); if (! Qr) {void (Qr = prompt ('Ключевые слова...', ''))}; if (Qr) window.open( " http://google.com/search?query=" + escape (Qr)); void (0)