1 Вопрос: Перехватить новый URL перед выгрузкой страницы

вопрос создан в Sat, Mar 16, 2019 12:00 AM

Проблема : я - пользователь, которому нужно использовать веб-приложение со списком якорей с 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, потому что это все равно будет лучшим решением

0
  1. Можете ли вы просто отредактировать код JS и открыть его в новом окне? Я бы также предложил события кликов за javascript://.
    2019-03-16 19: 14: 52Z
  2. @ JBis это сложная часть. Новый URL-адрес является результатом вызова нескольких функций, действительно трудно определить, что такое URL-адрес, и в этом лабиринте функций одна из них заставляет страницу перейти к новому URL-адресу, но я не могу найти, какой это , Веб-приложение плохо закодировано, но я не его разработчик, и я должен его использовать
    2019-03-16 19: 17: 08Z
  3. Ищите window.open
    2019-03-16 19: 19: 43Z
  4. Подождите. Посмотрите здесь: stackoverflow. ком /вопросы /9172505 /...
    2019-03-16 19: 38: 03Z
  5. Некоторыми распространенными способами обновления истории браузера являются методы window.history.pushState, window.history.replaceState. Или браузер может отправлять что-то на сервер для принятия окончательного решения, например, обычный запрос httpRequest или что-то вроде window.location.search. (Объект window может быть или не иметь явного имени в любом случае, браузеры предполагают, что это тот объект, который вам нужен, если вы используете неквалифицированное имя метода или свойства.) Вы также можете проверить, не установлен ли где-нибудь href, хотя это кажется менее вероятным. Это может дать вам еще как минимум несколько потенциальных клиентов.
    2019-03-16 20: 18: 54Z
1 ответ                              1                         

Поскольку вы изолировали проблему (очевидно) для экземпляров 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, но если вам нужно зайти так далеко, написание небольшого расширения для браузера для автоматического дублирования и удаления дополнительных вкладок по мере необходимости может оказаться более простым обходным путем.

    
1
2019-03-16 22: 13: 26Z
  1. Большое спасибо за ваши попытки решить эту проблему! Извините, но если я что-то упустил, я не думаю, что location настраивается таким образом (невозможно присвоить ему что-то еще, например, location = {}). Я прочитал пост, на который вы ссылались, но я не смог заставить его работать, по крайней мере, через консоль (браузеры изменили эти правила сейчас?). Я всего лишь пользователь, и я изменяю страницу через консоль браузера, я не могу ничего изменить в бэк-энде. Я также подумал, что мог бы написать оболочку для window или location, но она не работает
    2019-03-16 22: 51: 53Z
  2. Может быть, расширение браузера будет работать, но тогда для меня это будет слишком проблематично, мне также придется научиться делать расширение. Возможно, мне придется довольствоваться предложенным вами обходным путем использования ALT + D & ALT + ENTER каждый раз (с этим тоже возникают другие проблемы, сначала я должен нажать, чтобы отсортировать список, но не обращать на это внимания)
    2019-03-16 22: 56: 27Z
  3. О, хромой. Извините, я должен был проверить, что location назначается, прежде чем предлагать его. Отсутствие доступа к серверу делает его намного сложнее. Если вы решили пойти по маршруту расширения, это, вероятно, не так сложноТед, как вы думаете, если вы уже знаете некоторый JavaScript (см. developer.chrome.com/extensions/getstarted). Если у вас нет доступа к серверу или расширению, как вы планируете выполнить свой код для захвата URL? Просто в консоли ?? Или скрипт тампера или еще что-нибудь?
    2019-03-17 00: 04: 22Z
  4. Я был настроен оптимистично и думал, что консоль подойдет ... tampermonkey - самый близкий, я думаю, без расширения. Я на самом деле запускаю дополнительный код в консоли, просто потому, что веб-приложение настолько плохое, что не может даже отсортировать список, я должен все перестроить. Спасибо за ссылку, хотя!
    2019-03-17 02: 53: 44Z
источник размещен Вот