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