Могу ли я запретить Chrome съесть мою глобальную собственность?

Chrome на iOS, кажется, создает XMLHttpRequest объект, когда вы включаете внешний файл JavaScript. Похоже, что этот объект назначен глобальной переменной с идентификатором. 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 позвони туда. Таким образом, похоже, что на самом деле это всегда происходит через некоторое время после загрузки страницы.

1 ответ

Решение

Из обсуждения, которое мы провели в комментариях, похоже, что Chrome использует with заявление, чтобы наложить некоторые свои собственные вещи поверх window свойства. Вероятно, это происходит потому, что эти свойства обычно не могут быть перезаписаны. Задержка, скорее всего, связана с тем, как скоро Chrome сможет внедрить свой собственный скрипт в UIWebView (браузеры на iOS вынуждены использовать базовый объект UIWebView, а не свои собственные движки) после начала загрузки страницы.

Если все эти предположения на самом деле верны, то есть простое решение, кроме доступа window.a вместо a или возьмите власть обратно и используйте свой собственный with заявление:

with (window)
    eval(myScript);

Вряд ли это решение, которое кому-либо понравится, но может быть единственным вариантом.

Другие вопросы по тегам