2013-02-27 6 views
7

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

еще несколько наблюдений:

  • Это только кажется, что произойдет какое-то время после загрузки страницы (отсюда setTimeout)
  • Когда это произойдет, есть также window.__gchrome_CachedRequest свойство
  • __gchrome_CachedRequest === a
  • Это не похоже на старые версии iOS Chrome (не знаю, какая версия в первую очередь имеет место)

Неужели кто-нибудь сталкивался с этим раньше? Есть ли способ, с помощью которого я могу остановить его (Примечание ... Я не могу переименовать a)? Если кто-нибудь знает , почему он делает это, я бы с удовольствием узнал.


Update

Я только заметил, что это на самом деле происходит с встроенными сценариями тоже, а не только когда вы включаете внешний скрипт. Я не заметил этого изначально, потому что у меня не было вызова setTimeout. Так что похоже, что на самом деле просто всегда происходит через некоторое время после загрузки страницы.

+1

Замечание - вызовы 'document.write' находятся там, чтобы легко выводить на страницу. Измените их на 'alert', или' innerHTML', или что-нибудь еще, если хотите. Эффект тот же. –

+0

Это действительно странное поведение, которое я не могу воспроизвести на своем локальном компьютере. Одна вещь, которую я бы рекомендовал, - это тестирование данного сайта на прозрачном Chrome за пределами вашей сети (некоторые плагины прерывают «нормальные» работы js, то есть Skype и некоторые сетевые провайдеры также добавляют свои материалы). – eithed

+0

@eithed - я протестировал его на чистых установках Chrome на трех разных устройствах (iPhone 3 с iOS 5, iPad 2 и iPod Touch с iOS 6). Это все тестовые устройства без лишних плагинов. Однако это все с последней версией Chrome (23). –

ответ

2

Из обсуждения, которое у нас было в комментариях, похоже, что Chrome использует оператор with, чтобы сложить некоторые из его собственных вещей поверх window. Вероятно, это делает это, потому что эти свойства обычно не будут перезаписываться. Задержка, скорее всего, зависит от того, как скоро 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: проблем нет, надеюсь, он скоро исправится. –

 Смежные вопросы

  • Нет связанных вопросов^_^