2014-03-26 111 views
0

我们放在我们的网站(在标签内的某处)一段代码调用外部的CGI文件外部JavaScript停止页面加载

<script language="JavaScript" type="text/javascript" src="http://www.externaldomain.com/cgi-bin/file.cgi?foo=bar"></script> 

这个脚本记录了一些数据,然后输出以下代码

document.write('<a href="http://www.link.com/" target="_blank"><img src="http://www.externaldomain.com/image/banner.jpg" height=60 width=468 alt="foobar"/></a>'); 

这反过来显示图像。

我们遇到的问题是file.cgi在外部服务器上,无法移动到我们的服务器。如果该服务器发生停机,我们会发现它停止了其余的页面加载。有没有办法解决?

编辑 - 更多信息阅读评论

的服务器的CGI文件是超时,当我们有这个问题之前就挂了。

我也尝试添加异步的JavaScript调用,但得到的dubugging控制台

A call to document.write() from an asynchronously-loaded external script was ignored. 

问候以下警告

+0

如果该图像是动态编号。如果该请求失败,您可以提供一个占位符img fallback。 –

+0

为什么它会阻止页面的其余部分加载?当然会返回一个404代码,并且该页面将继续加载。 – Curt

+0

这就是我认为的Curt,但显然不是,我没有目睹我遇到的问题我正在通过我被告知的信息 – pjknight

回答

0

当外部服务器宕机,也许他们的主机发送停机通知及不正确的200响应码。

也许脚本返回这样的:

<script type="text/javascript"> 
    <html> 
    <head> 
    <title>Downtime!</title> 
    </head> 
    <body> 
    <p>sorry, cheap-ass hosting is experiencing some downtime. Cheerio!</p> 
    </body> 
    </html> 
</script> 

当然,这是一个语法错误,并会造成一些浏览器炸毁。


眼看外部服务将如何挂起几分钟,你应该异步加载脚本是这样的:

<script async language="JavaScript" type="text/javascript" src="http://www.externaldomain.com/cgi-bin/file.cgi?foo=bar"></script> 

async属性告诉浏览器保持加载下一个脚本,而无需等待此一个先完成。

有关异步的信息,请参见a broswer compatibility chart


要做的最后一件事就是编写自己的代理服务。在node.js中很容易:http://www.catonmat.net/http-proxy-in-nodejs/

您可以对其进行修改,以便它向external_domain.com发送请求,剥离document.write并将其替换为有用的内容。

+0

有问题的服务器会在暂停之前挂起 – pjknight

+0

A ha!坚持我正在编辑我的答案。 –

+0

我早些时候尝试过,但在调试控制台中得到以下消息: - '从异步加载的外部脚本调用document.write()时被忽略。“# – pjknight