2013-02-27 61 views
7

當您包含外部JavaScript文件時,iOS上的Chrome似乎會創建一個XMLHttpRequest對象。它似乎將此對象分配給標識爲a的全局變量,覆蓋您可能已經擁有的任何內容。我可以阻止Chrome瀏覽器侵入我的全球媒體資源嗎?

測試用例:

  • HTML文件(的test.html):

    <!-- ... --> 
    <script> 
        var a = 1; // Value is not important for this demonstration 
    </script> 
    <script src="test.js"></script> 
    <!-- ... --> 
    
  • 外部JavaScript文件(test.js):

    setTimeout(function() { 
        document.write(a); // [object XMLHttpRequest] 
        a.onreadystatechange = function() { 
         document.write(a.readyState); // Alternates between "1" and "4" 
        }; 
    }, 100); 
    

XMLHttpRequest似乎反覆發出請求(到某處...通過代理路由設備連接,並且監視請求不會顯示任何內容),並且重複執行事件處理程序onreadystatechange

一些更多的意見:

  • 這似乎只發生頁面加載後的一段時間(因此setTimeout
  • 當它發生,也有一個window.__gchrome_CachedRequest財產
  • __gchrome_CachedRequest === a
  • 它似乎沒有發生在舊版本的iOS Chrome(不知道它首次發生在哪個版本)

有沒有人遇到過這個?有沒有辦法阻止它發生(注意...我不能重命名a)?如果有人知道爲什麼它這樣做,我很想知道。


更新

我剛剛注意到,這實際上內嵌腳本發生過,不只是當你有一個外部腳本。我最初沒有注意到這一點,因爲我沒有在那裏撥打setTimeout。所以它看起來實際上只是總是發生在頁面加載後的一段時間。

+1

注 - 「document.write」調用只是在那裏輕鬆輸出到頁面。如果你喜歡,可以將它們改爲'alert',或'innerHTML'或其他任何東西。效果是一樣的。 – 2013-02-27 14:25:02

+0

這是一個非常奇怪的行爲,我似乎無法複製到我的本地。我建議的一件事就是在網絡外的Chrome上測試給定的網站(某些插件會中斷js的「正常」工作,即Skype,並且一些網絡提供商也會添加它們的內容)。 – eithed 2013-02-27 14:34:42

+0

@eithed - 我已經在3種不同設備(運行iOS 5的iPhone 3,以及運行iOS 6的iPad 2和iPod Touch)上進行了全新的Chrome安裝測試。他們都是測試設備,沒有不必要的插件。但是,這是所有最新版本的Chrome(23)。 – 2013-02-27 14:36:40

回答

2

根據我們在評論中的討論,Chrome看起來像使用with語句對window屬性頂部的某些內容進行了分層。它可能會這樣做,因爲這些屬性通常不會被覆蓋。這種延遲最可能發生在Chrome開始加載頁面後,Chrome可以在UIWebView中注入自己的腳本(iOS上的瀏覽器被迫使用底層的UIWebView對象而不是自己的引擎)。

如果所有這些猜測其實是正確的,那麼很簡單的解決方案,除了訪問的window.a代替a或採取電源背部和使用自己的with聲明:

with (window) 
    eval(myScript); 

幾乎沒有一個解決方案的人會津津樂道實施,但可能是你唯一的選擇。

+1

我認爲我們的猜測可能是這種情況,所以我會將此標記爲已接受。我提出了[Chromium問題](http://code.google.com/p/chromium/issues/detail?id=178737),以便我們看看是否有任何「官方」回覆。謝謝你的幫助。 – 2013-02-27 15:11:42

+0

@JamesAllardice:一點問題都沒有,我希望它能儘快解決。 – 2013-02-27 15:27:47

相關問題