【问题标题】:Google chrome is not executing all my <script>s谷歌浏览器没有执行我所有的 <script>
【发布时间】:2015-11-02 10:10:45
【问题描述】:

我正在使用 html5、canvas、node 和 socket.io 制作某种在线游戏。我的游戏的 html 包含一个画布标签,然后是一个标签列表,其中一些是源代码,另一些是内联的。布局是这样的:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>

    <canvas id="myCanvas" width="640" height="640" >
        Your browser does not support the HTML5 canvas tag.
    </canvas>

    <!-- Scripts go here -->

</body>
</html>

在 Firefox 中我的游戏运行良好,但在 chrome 中,它只执行前两个脚本:

<script src="/socket.io/socket.io.js"></script>
<script> 
    if(window.io) {
        var socket = io();
        socket.emit('identify', { client_type : 'game' });
    }
</script>

这两个脚本都被正确执行了,但是在那之后,chrome 只是忽略了所有其他的脚本,这些脚本主要是定义函数和常量。例如,像这样的事情:

<script src="vector2.js" type="text/javascript;version=1.7"></script>
<script src="utils.js" type="text/javascript;version=1.7"></script>

我认为有必要提及我正在使用严格模式和一些 ES6 功能,例如 let,但即使这是问题所在,我也希望在控制台上看到一些输出。相反,我的 console.logs 和任何类型的错误都不会被打印出来。

查看调试器,我可以看到前两个脚本是如何执行的,然后它卡在这段代码的循环中(在用 -> 指向的行中)。

if (this.hasXDR()) {
    xhr.onload = function(){
        self.onLoad();
    };
    xhr.onerror = function(){
        self.onError(xhr.responseText);
    };
} else {
    xhr.onreadystatechange = function(){
->      if (4 != xhr.readyState) return;
        if (200 == xhr.status || 1223 == xhr.status) {
            self.onLoad();
        } else {
            // make sure the `error` event handler that's user-set
            // does not throw in the same tick and gets caught here
            setTimeout(function(){
                self.onError(xhr.status);

请注意,我没有编写此代码,我无法真正识别此库是什么。我只能说它在这个函数中循环运行。

发生了什么事?为什么我的脚本没有被执行?

【问题讨论】:

  • 看起来一个请求没有完成,你能在 chrome 中查看你的network 标签来查看待处理的请求吗?
  • 我可以看到请求到达我的节点服务器并将脚本发回,同样在 chrome 的“网络”选项卡中,我可以看到所有脚本都加载得很好(请注意,我也可以看到它的来源,好像它们已加载,但似乎没有执行任何代码)。
  • @Setzer22 在网络选项卡上确保您正在查看 XHR 请求..
  • @Pogrindis XHR 选项卡上也没有待处理的请求。不过里面有 4 个完成的 socket.io 请求。

标签: javascript html google-chrome socket.io


【解决方案1】:

我终于弄清楚发生了什么。即使到目前为止我还没有找到修复或解决方法。

这与将脚本标记为 javascript 1.7 版有关,这样做会使我的 linux 机器中的 google chrome 和 chromium 完全忽略该脚本。删除该类型属性会使脚本加载。但是浏览器无法正确识别 ES6 功能。

我将其作为答案发布,因为它确实回答了我最初的问题,但是更好的答案以及发生这种情况的原因以及可能的修复是非常受欢迎的。

【讨论】:

  • 可悲的是,我遇到了同样的行为。对我来说,这意味着我的应用程序现在要么在 Firefox 上运行,要么在 chrome 上运行。或者我需要删除所有 ES6 功能......这很愚蠢,因为这个 version=1.7 字符串
  • 可以根据用户的浏览器提供不同版本的 html 页面,以解决该特定问题。但事实仍然是,chrome 还没有正确实现 ES6 标准,因为仍然缺少许多功能......
  • 是的,是的...更多的时间来解决这个问题,我猜这个问题很快就会消失。我现在做了一个后备并删除了 ES6 功能:-P
猜你喜欢
  • 2012-11-29
  • 2017-08-16
  • 1970-01-01
  • 2016-01-22
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
相关资源
最近更新 更多