7

XMLHttpRequest外部 JavaScript ファイルを含めると、iOS 上の Chrome はオブジェクトを作成するように見えます。このオブジェクトを識別子を持つグローバル変数に割り当てているようaで、そこに既にあるものはすべて上書きされます。

テストケース:

  • 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そこに電話がかかっていなかったので、最初はこれに気づきませんでした。そのため、ページの読み込み後、実際には常に発生しているように見えます。

4

1 に答える 1

2

コメントで行った議論から、Chrome はステートメントを使用して、プロパティwithの上に独自のものをいくつか重ねているようです。windowこれらのプロパティは通常は上書きできないため、おそらくこれを行います。遅延は、ページの読み込みが開始された後、Chrome が独自のスクリプトを UIWebView に挿入できるまでの時間 (iOS のブラウザーは、独自のエンジンではなく、基になる UIWebView オブジェクトを使用することを余儀なくされる) に起因する可能性が最も高いです。

window.aこのすべての憶測が実際に真実である場合、代わりにアクセスするaか、電源を取り戻して独自のwithステートメントを使用する以外に、簡単な解決策があります。

with (window)
    eval(myScript);

誰もが実装を好むソリューションはほとんどありませんが、唯一の選択肢かもしれません。

于 2013-02-27T15:04:58.780 に答える