2013-02-27 7 views
7

iOSのChromeは、外部のJavaScriptファイルを含めると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'などに変更してください。効果は同じです。 –

    +0

    これは本当に奇妙な振る舞いです。私は自分の地域では複製できないようです。私がお勧めするものの1つは、ネットワーク外の明確なクロムで特定のサイトをテストすることです(いくつかのプラグインはjsの「通常の」動作を妨げる、つまりSkypeや一部のネットワークプロバイダも同様です)。 – eithed

    +0

    @eithed - 3種類のデバイス(iOS 5を実行しているiPhone 3、iOS 6を実行しているiPad 2とiPod Touch)でクリーンインストールをテストしました。これらはすべて不要なプラグインのないテストデバイスです。ただし、これはすべて最新バージョンのChrome(23)で行われています。 –

    答えて

    2

    私たちはコメントの中で、windowのプロパティの上にChromeのwithステートメントを使用して独自のものをレイヤーしているようです。これらのプロパティは通常は上書きできないため、おそらくこれを実行します。遅れは、Chromeが独自のスクリプトをUIWebViewにどのくらいすぐに注入できるか(iOSのブラウザは、ページの読み込みが開始された後で、基になるUIWebViewオブジェクトを独自のエンジンで使用することが強制されます)

    すべてこの推測は、実際に真であるならば、そこにアクセスwindow.a以外への簡単な解決策は、代わりにaのだか、電源バックを取り、あなた自身のwithステートメントを使用します。

    with (window) 
        eval(myScript); 
    

    とたんソリューションの誰もが楽しむんでしょうあなたの唯一の選択肢かもしれません。

    +1

    私たちの推測はおそらく当てはまると思うので、これを受け入れたものとしてマークします。 [Chromium issue](http://code.google.com/p/chromium/issues/detail?id=178737)を発行しましたので、「公式」回答があるかどうかを確認します。ご協力いただきありがとうございます。 –

    +0

    @JamesAllardice:まったく問題ありません。すぐに修正されることを願っています。 –

    関連する問題