Переопределение window.location в веб-браузере - PullRequest
2 голосов
/ 10 ноября 2010

Это может показаться странным вопросом, но есть ли способ переопределить window.location, не заставляя браузер перейти к нему?Проблема, с которой я столкнулся, заключается в том, что я внедряю HTML-код в элемент управления, а window.location примерно так: пробел - вызывает ошибки в некоторых кодах JavaScript.Попытка заставить их думать, что они находятся в URL, отличном от about: blank

Ответы [ 3 ]

2 голосов
/ 02 января 2015

У меня был успех с Object.defineProperty () , когда document.documentMode >= 9 (IE9 +).

Чтобы получить элемент управления WebBrowser в режиме IE9 +, я сначала загружаю следующий URL:

about:<!doctype html><meta http-equiv="X-UA-Compatible" content="IE=edge">

Это дает в основном пустой документ в режиме последней версии документа.

Затем, чтобы переопределить window.location, я выполняю некоторый скрипт через eval () или document.write ():

Object.defineProperty(window, 'location', {value: {href: 'fubar'}});

Полная последовательность выглядит следующим образом:

  • Загрузить элемент управления.
  • Ожидание WebBrowser.ReadyState == 4 или события DocumentComplete.
  • Звоните document.open() (важно).
  • Оцените или напишите скрипт, переопределяющий location .
  • Напишите содержание HTML.
  • Call document.close() (обеспечивает вызов onload).

Примечание. Я использую элемент управления ActiveX WebBrowser , а не компонент .NET, являющийся оболочкой для этого элемента управления. Это, вероятно, будет работать так же в .NET.

0 голосов
/ 13 декабря 2013

Невозможно заменить свойство window.location. window.location является ненастраиваемым свойством, что означает, что его нельзя изменить.

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

0 голосов
/ 10 ноября 2010

Черновики HTML5 включают window.history.pushState + window.onpopstate, но это не поддерживается Trident (MSHTML) и не позволяет перемещаться по доменам, не обращая внимания на схемы URL.

Некоторые реализации JavaScript также поддерживают определяемые пользователем геттеры и сеттеры, так что вы можете сделать window.__defineGetter__('location', function() { return fakeLocation }), но, опять же, я верю, что это не сработает с управлением IE.комментаторы: что ты делаешь?

...