提问人:Eli 提问时间:5/28/2009 最后编辑:Eli 更新时间:5/29/2009 访问量:2610
PHP / JavaScript的。浏览器会永远“加载”,即使在所有资源下载完成后也是如此,再加上 Opera/Chrome 问题
PHP / JavaScript. Browser "loads" forever, even after all resources are finished downloading, plus Opera/Chrome Issues
问:
我有一个执行以下操作的页面:
浏览器加载一个非常简单的页面,具有有效的头部和主体,只有脚本/noscript 对作为内容。
在正文中,它有一个脚本(脚本 a),用于运行函数 onLoad。此函数动态包含第二个脚本(脚本 b),并在该脚本可用时运行其中的函数。
第二个脚本是执行各种工作的 .js 文件。
这两个脚本都由 PHP 解析,并使用 application/x-javascript 内容类型。
现在,我让这一切工作得很好,除了几个 JS 打嗝。JavaScript 不是我的强项语言之一,所以我希望这些都是简单的问题,有人可以为我指出正确的方向。
问题 1:如果我做一个简单的警报('你在脚本b中');在第二个脚本中,它按预期工作。但是,如果我做任何其他事情,它都可以正常工作,然后浏览器一直指示它永远加载。这是firefox中的补间颜色,或者IE中的旋转。
我尝试过以不同的方式结束剧本,但似乎没有任何帮助。知道如何向浏览器指示脚本已完全加载吗?这是一个强制通过 PHP 解析的 .js 文件。
问题 2:第二个脚本似乎根本没有包含在 Opera 或 Google Chrome 中。在 FF/IE 中工作正常,除了加载问题。谁能看到我是否使用了与第二个脚本加载不兼容的东西?
谢谢!
更新:
感谢您的回答。我实际上有火虫,这就是为什么我知道一切正常(至少在 FF 中)。我实际上并不知道该脚本在 Opera/Chrome 中不起作用,但什么也没发生。
这是相当多的代码 =o) 我将从 firebug 中复制实际的响应并发布它们,这样您就可以确切地看到代码是什么。至于网络服务器关闭连接,我也在想,但是如果我将脚本 b 变成 alert('whatever'),这似乎很奇怪;它会发出警报,然后停止加载,但我所做的一切都完全相同,但是使脚本 document.write('随便);它将永远加载。
以下是直接从 firebug 的 net 选项卡中更新的脚本:
请注意,discoverfire.net 是一个内部域,因此您将无法从那里加载任何内容......
初始 HTML 页面:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Welcome!</title>
<style>body { font-family:arial; }</style>
<script language="JavaScript" type="text/javascript" src="http://www.discoverfire.net/analytics/l/a.js">
</script>
<script language="JavaScript" type="text/javascript">
document.onload = Start();
function Start(){
TAFKing_version = '1.0';
TAFKing_lkey = '19-8O-KKA8HV';
TAFKing_Lander();
}
</script>
</head>
<body>
<noscript>
Oops! We can't forward you properly because your JavaScript is turned off.<br /><br />
<a href='http://www.discoverfire.net/analytics/l/noscript/19-8O-KKA8HV.html'>Please click here to continue.</a>
<img src='http://www.discoverfire.net/analytics/l/imp/19-8O-KKA8HV.png' border='0' alt='tell a friend' />
</noscript>
</body>
</html>
** 脚本 A (...答.js): http://www.discoverfire.net/analytics/l/a.js **
function TAFKing_Lander(){
version = TAFKing_version;
lkey = TAFKing_lkey;
var scrb = document.createElement('script');
scrb.type = 'text/javascript';
scrb.src = 'http://www.discoverfire.net/analytics/l/b.js?lkey='+lkey+'&version='+version+'&cb=4eohe8e65'
;
document.getElementsByTagName('head')[0].appendChild(scrb);
Interval = setInterval("Waiter()", 10);
return;
}
function Waiter(){
if(window.TAFKing_LanderB) {
clearInterval(Interval);
TAFKing_LanderB();
}
}
脚本 B (...b.js): http://www.discoverfire.net/analytics/l/b.js?lkey=19-8O-KKA8HV&version=1.0&cb=4eohe8e65
function TAFKing_LanderB(){
document.write("there are just a whole bunch of doc.writes here that build a simple table");
}
答:
我敢打赌它与脚本无关,而是与网络服务器有关。您的描述,特别是它影响了许多浏览器,其中一些甚至不运行脚本,这让我相信 Web 服务器没有关闭连接。也许 Web 服务器未正确处理 HTTP/1.1 保持活动状态请求。
尝试在Firefox中使用Firebug。安装它,为您的页面启用它,重新加载页面并检查“网络”选项卡,了解真正保持连接打开的原因。
这需要经历很多代码。你绝对应该让 Firebug 来帮助你诊断它。最新版本甚至会显示加载事件发生的时间/是否发生。
Firebug 还允许您通过编写来测试其值来输出消息。您甚至可以在页面加载后使用控制台测试值,因为您使用的是全局命名空间。console.log('somevar=',var);
在我的头顶上,我会确保连接在 php 中正确关闭。也
document.onload = 开始();
会将 Start() 的结果分配给 onload,而不是稍后定义的 Start。
此外,window.onload 更兼容/标准。
您可能希望将 js 文件的输出保存为 outputphpA.js 和 outputphpB.js,直接获取这些文件并查看加载行为是否不同。这应该有助于诊断它是否是 php 问题。
评论