Перехватить новый URL перед выгрузкой страницы - PullRequest
0 голосов
/ 16 марта 2019

Проблема : я - пользователь, которому нужно использовать веб-приложение со списком якорей с href="javascript://". Когда я щелкаю по любому из них, скрипт выполняет некоторые вещи (не относящиеся к делу) и, наконец, переходит на новую страницу.

Моя проблема в том, что я хочу, чтобы эта новая страница загружалась на новую вкладку вместо того, чтобы моя текущая вкладка переходила на другую страницу. Поскольку ссылка указывает на никуда, я не могу щелкнуть ее правой кнопкой мыши и открыть в новой вкладке.

(причина, по которой я этого хочу, в том, что я всегда должен идти вперед и назад, поэтому, если бы каждый элемент мог быть загружен в отдельную вкладку, это сэкономило бы мне огромное количество времени)

Вопрос : Можно ли перехватить новый URL-адрес, который будет загружен до выгрузки окна? Или это невозможно без расширения браузера, даже если для запуска консоли используется консоль сценарий

Идеи для решения : Если window.onbeforeunload может захватить новый URL-адрес, который будет присвоен window.location, я мог бы window.open(newURL,'_blank'), а затем предотвратить поведение по умолчанию при переходе на новый URL-адрес.


  • ОБНОВЛЕНИЕ : изменение window.open, window.history.pushSate или replaceState, window.location.assign или replace на null не имеет значения, поэтому ни один из них не вызывается , Скорее всего, используется window.location. Можно ли прослушивать любые звонки на window.location? Или я могу добавить что-то к location, чтобы location = newURL или location.href = newURL не перенаправляли, а вместо этого просто открывали новую вкладку с этим newURL?

  • 2-е ОБНОВЛЕНИЕ : Я решил свою проблему, изменив ожидаемое поведение. Вместо того, чтобы открывать каждый элемент на новой вкладке, я делаю каждый щелчок по элементу, открывающему на новой вкладке предыдущий URL, прежде чем перейти на новую страницу. То есть я добавил eventListener к каждому элементу, и когда он щелкает, он запускает это: myNewTab = window.open(originalURL, '_blank'); myScript = document.createElement('script'), myScript.innerHTML = "/*eventual custom script goes here*/"; myNewTab.document.body.appendChild(myScript);. Я все еще хотел бы знать, хотя возможно ли перехватить новый URL, потому что это все еще будет лучшим решением

1 Ответ

1 голос
/ 17 марта 2019

Поскольку вы изолировали проблему (очевидно) для экземпляров location= и location.href=, вы сможете взломать все это из глобального пространства имен.Вы можете начать с определения

var location = {};  

Все ошибочные операторы присваивания теперь должны быть обезврежены.

Если это означает, что другие части вашего унаследованного кода не работают, или если вы просто хотите более тщательныйРешение, вы можете обернуть всю клиентскую кодовую базу (кроме вашего пользовательского объекта location) в функцию, которая реагирует на изменения вашего объекта.Полезно было бы создать тег a с target="_blank" и href=" ${location.href} || ${location} || # или что-то подобное.

В качестве альтернативы, вы можете сделать свой пользовательский объект местоположения неизменным (не проверенным):

const location = {};
Object.defineProperty( location, "href", {
  value: "whatever",
  writable: false,
  enumerable: true,
  configurable: true
});

Теперь любые попытки присвоить location или location.href приведут к ошибке, такой как [Invalid_const_assignment][1].Если ваша функция переноса использует try / catch для выполнения остальной части исходного кода, вы можете перехватить эти ошибки, чтобы приложение продолжало работать в любом случае, посмотреть, на какой URL-адрес пыталось отправить назначение, и, надеюсь, сделать с ним что-нибудь полезное.

Наконец, если оригинальный разработчик использовал window.location явно вместо location, это более крупная рыба, но у вас есть несколько вариантов.

Один из них - найти и заменить все экземпляры первогос последним, чтобы сделать вышеупомянутые предложения применимыми.Одним из способов сделать это было бы с помощью пункта меню «найти в папке» в Sublime Text (после открытия папки src с помощью Sublime.) Очевидно, что вам нужно сделать надежное резервное копирование (например, git commit), прежде чем делать такиебезрассудные глобальные изменения.

Еще одна попытка - взломать объект окна.Это начинает выходить за рамки безрассудного и, вероятно, должно быть предотвращено любым респектабельным браузером, но, возможно, функция имитации (как описано выше), о которой браузер не знает, может имитировать это.

То есть, если выполнениеконтекст для исходного кода вашего приложения представляет собой функцию-обертку со своим собственным «локальным» window объектом, тогда любые взаимодействия с window.someProperty или window.someMethod должны найти вашу пользовательскую версию, которая может выступать в качестве привратника для добавления настраиваемой обработки для некоторых свойств.(например, location) при пересылке всех других назначений и вызовов методов «реальному» объекту окна.

Эта пересылка, вероятно, сложная часть, в зависимости от того, какие конкретные взаимодействия приложение пытается выполнить с window.Если есть несколько взаимодействий, о которых нужно беспокоиться, вы можете превентивно обрабатывать каждый тип в каждом конкретном случае, но мы уже за пределами моих знаний, и для этого случая есть динамическое решение (возможно, с использованием прокси-объекта?) это то, что я даже не собираюсь спекулировать дальше.

Вместо этого вот чьи-то (связанные?) Мысли , работающие с jQuery, но если вам нужно зайти так далеко, напишите небольшое расширение для браузера, которое будет обрабатывать автоматическое дублирование и удалятьдополнительные вкладки по мере необходимости могут быть более простым обходным путем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...