Измените document.location, чтобы открыть новую вкладку/окно вместо навигации на текущей вкладке - программирование
Подтвердить что ты не робот

Измените document.location, чтобы открыть новую вкладку/окно вместо навигации на текущей вкладке

Я хочу написать букмарклет, который будет изменять любую веб-страницу, так что, когда код JavaScript на этой странице сделает что-то вроде document.location = 'http://site.tld' или document.location.href = 'http://site.tld', страница откроет новую вкладку или окно вместо изменения местоположения; так же, как если бы код был window.open('http://site.tld');

Могу ли я каким-либо образом модифицировать прототип для достижения этой цели? (Я использую это слово небрежно, потому что, хотя я читал об изменении прототипов несколько раз, я никогда не делал этого.) Или есть какой-то другой способ?

4b9b3361

Ответ 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)