JSONP和DOCTYPE错误

3

我遇到了一个奇怪的问题。

我正在使用AJAX与我的服务器通信。(我的Web应用程序运行在localhost上)。 服务器位于,比如说,http://www.example.com

为了绕过同源策略,我使用JSONP。我动态创建一个<script>标签,并从我的服务器加载数据。

到目前为止一切顺利。

然后我决定将我的Web应用程序上传到这个子域:http://m.example.com

这时我遇到了疯狂的错误。有时页面会加载,有时不会。当它无法加载时,Firebug会抛出一个DOCTYPE错误。

我做了一些研究,并发现了这篇stackoverflow帖子:firebug returns syntax error in doctype?

引用此链接中的一个答案:

这通常是因为你正在将HTML文档作为脚本加载。这通常是由于<script src=""></script>(即指向当前HTML文档的相对URI)或指向404错误的脚本之一引起的。

非常有帮助的信息。基于以上所有内容,我得出结论,每当我的服务器响应缓慢时,<script>标签的src属性为null。由于这会抛出一个404错误,所以我在Firebug中会得到一个DOCTYPE错误。每当我的服务器响应快速时,就没有问题,一切正常。

我该如何解决这个问题?我可以设置一个手动超时或其他东西,但那并不是很完美和优雅的解决方案。

有什么帮助吗?

编辑:

下面是一些代码:

这个函数用于动态创建script标签:

function appendScriptToHead() {
    var element = document.createElement("script");  
    element.src = 'http://www.example.com/?data&callback=callfunction'; 
    document.getElementsByTagName("head")[0].appendChild(element) 
}

当包含JSONP数据的上述url被加载时,将调用此回调函数:

function callfunction(response) {  
    alert(response);  
}

你需要提供一些代码。 - RoToRa
解决什么问题?如果你想解决src为空的情况,可以在插入脚本标签之前添加一个检查null的条件。如果你想要能够"捕捉"错误,超时是一个不错的选择。 - Matt
嗨 @RoToRa。我已经编辑了我的问题,并包括了我目前正在使用的代码来从服务器检索JSONP数据。谢谢! - wiseindy
你的实际代码中URL也缺少"http://"吗? - RoToRa
1
appendScriptToHead() 函数是在什么时候被调用的? - Tomer
显示剩余3条评论
1个回答

1

我认为这里有一些误解。您的script元素将始终设置其src属性,但其内容取决于服务器的响应。我怀疑它不会是错误404(因为它指的是未找到元素,这几乎不可能重复出现),但它可能有500种不同的味道。

我建议您按原样调试查询(即使用浏览器或某些脚本化的HTTP UserAgent打开http://www.example.com/?data&callback=%callfunction%,如果您感到勤奋),以查看选择要加载的脚本的逻辑可能出了什么问题。


嗨@raina77wow。我明白你的意思。我尝试直接在浏览器中打开http://www.example.com/?data&callback=%callfunction%。它确实返回了一个JSONP字符串。但服务器响应是不确定的。有时会立即打开,有时需要一段时间。我该如何在代码中避免这种不确定性? - wiseindy
我建议使用这个回答中描述的方法。不需要定义额外的变量,你可以直接检查你想要加载的函数。 - raina77ow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接