2010-11-09 31 views
2

這看起來可能是一個奇怪的問題,但有沒有一種方法可以在不使瀏覽器控件導航的情況下重寫window.location?我遇到的問題是我在控件中注入了html代碼,而window.location是關於:blank - 在一些javascript代碼上導致錯誤。試圖讓他們覺得他們是在一個網址以外約:空白在Webbrowser控件上覆蓋window.location

+1

顯示一些來源。 – zzzzBov 2010-11-09 21:07:33

+1

你想完成什麼? – Matt 2010-11-09 21:47:41

回答

0

HTML5草案包括window.history.pushState + window.onpopstate,但這不是三叉戟(MSHTML)的支持,並不允許跨多個域,請不要介意URL方案導航。一些JavaScript實現也支持用戶定義的getter和setter,所以你也許可以做window.__defineGetter__('location', function() { return fakeLocation }),但是我相信我不會在IE的控制下工作。

迴應評論者:你在做什麼?

+0

有點難以在公共論壇上解釋,但非常黑客控制顯示某些代碼,我想顯示和監控。問題是他們有JavaScript檢查window.location - 哪個中斷。當然,答案可能是不注入瀏覽器,導航到一個URL - 但我試圖避免這一點。 – timeitquery 2010-11-10 15:26:52

+0

不起作用。'未處理的錯誤:__defineGetter__:無法修改不可配置的屬性' – XP1 2013-12-13 06:08:06

0

不可能取代window.location屬性。 window.location是一個不可配置的屬性,這意味着它不能被修改。

我可以使用的唯一混亂的解決方法是在執行腳本文本之前執行查找和替換(用空字符串替換window.location行)。

1

我已經成功使用Object.defineProperty()document.documentMode >= 9(IE9 +)。

要獲得IE9 +模式WebBrowser控件,我第一次加載以下網址:

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 == 4DocumentComplete事件。
  • 致電document.open()(重要)。
  • 評估或編寫腳本重新定義位置
  • 編寫HTML內容。
  • 致電document.close()(確保onload被調用)。

注意:我使用ActiveX WebBrowser控件,而不是.NET控件的封裝。它可能會在.NET中工作。