Могу ли я запретить 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);
Вряд ли это решение, которое кому-либо понравится, но может быть единственным вариантом.