2013-02-27 53 views
7

当您包含外部JavaScript文件时,iOS上的Chrome似乎会创建一个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'或其他任何东西。效果是一样的。 – 2013-02-27 14:25:02

+0

这是一个非常奇怪的行为,我似乎无法复制到我的本地。我建议的一件事就是在网络外的Chrome上测试给定的网站(某些插件会中断js的“正常”工作,即Skype,并且一些网络提供商也会添加它们的内容)。 – eithed 2013-02-27 14:34:42

+0

@eithed - 我已经在3种不同设备(运行iOS 5的iPhone 3,以及运行iOS 6的iPad 2和iPod Touch)上进行了全新的Chrome安装测试。他们都是测试设备,没有不必要的插件。但是,这是所有最新版本的Chrome(23)。 – 2013-02-27 14:36:40

回答

2

根据我们在评论中的讨论,Chrome看起来像使用with语句对window属性顶部的某些内容进行了分层。它可能会这样做,因为这些属性通常不会被覆盖。这种延迟最可能发生在Chrome开始加载页面后,Chrome可以在UIWebView中注入自己的脚本(iOS上的浏览器被迫使用底层的UIWebView对象而不是自己的引擎)。

如果所有这些猜测其实是正确的,那么很简单的解决方案,除了访问的window.a代替a或采取电源背部和使用自己的with声明:

with (window) 
    eval(myScript); 

几乎没有一个解决方案的人会津津乐道实施,但可能是你唯一的选择。

+1

我认为我们的猜测可能是这种情况,所以我会将此标记为已接受。我提出了[Chromium问题](http://code.google.com/p/chromium/issues/detail?id=178737),以便我们看看是否有任何“官方”回复。谢谢你的帮助。 – 2013-02-27 15:11:42

+0

@JamesAllardice:一点问题都没有,我希望它能尽快解决。 – 2013-02-27 15:27:47

相关问题