3

环境:Cordova 2.9.0、iOS(Xcode 4.6.3 iPad 6.1 Simulator 和运行 iOS 6.1.3 的 iPad 3)

我正在尝试分离将另一个文件加载到网络工作者中的处理。我正在加载的文件是应用程序的一部分(意味着它在同一个域中)。

以下代码在不在网络工作者中运行时可以正常工作:(url的格式为“/db/file.json”)

function loadXMLDoc(url, successCallback) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState==4 && (xmlhttp.status==200 || xmlhttp.status == 0)) {
        successCallback(xmlhttp.responseText);
    }
}
xmlhttp.open("GET",url,true);
xmlhttp.send();
}

注意:使用 cordova 时状态始终为 0。 不使用cordova时状态为200。

当我将此代码分成网络工作者时,responseText 返回为空。

我删除了 phoneGap 并验证了上面的代码在有和没有网络工作者的情况下都有效。

是否可以在 phoneGap/cordova 中的网络工作者中使用 XHR?

4

3 回答 3

4

您可能需要检查您的服务器是否正确支持跨域资源共享。W3C提供了一些方便的资源,例如CORS Enabled

当您在没有 Cordova 的情况下运行它时,您可能实际上是从服务器加载页面,例如http://www.myserver.com/index.html,但是当您从 Cordova 运行它时,您实际上是在运行file:///somedirectory/www/index.html. 这意味着如果您尝试使用 ajax 请求来访问来自 的信息myserver.com,它位于不同的域中,如果设置不正确,浏览器将拒绝响应。

您可以做的最重要的事情是启用跨域资源共享。这需要添加一个新标头Access-Control-Allow-Origin,其值为*

于 2013-07-06T21:32:00.363 回答
0

对于这种情况,您可以通过更改加载文件的方式来解决它。

  1. 忘记 XMLHttpRequest,因为不使用file://协议。
  2. 将文件的扩展名从 .json 更改为 .js
  3. 将您的 JSON 对象设置为变量。Ej。var myJson = { "a":123,"b":789 };
  4. 将 JS 文件加载到 HTML 中。<script src="db/file.json"></script>
  5. 用 JavaScript 读取数据。Ej。console.log(myJson);
于 2015-04-22T21:52:28.950 回答
0

是的,XHR 确实适用于带有默认 iOS 9.2 UIWebView 和(奇怪的是)XMLHttpRequests 的工作人员中的cordova 版本 6.0.0(cordova-ios 版本 3.x)的本地文件file:(与几乎所有其他浏览器不同)。虽然我认为这在所有科尔多瓦实现中都是正确的,但我自己还没有尝试过。如前所述,status = 0但两者loaderror处理程序都会触发并responseType影响response(xhr2)都如预期的那样。不幸的是,所有文件系统 API 都无法访问,因此这为访问本地文件提供了一种特殊/骇人听闻的方式(相关错误)。

注意:尝试将 cordova-ios 版本更新到 4.0 和 WKWebView 版本 1.0.2-dev(仍然是 cordova 6.0 版)和file:url 不再起作用。

于 2016-02-01T22:08:11.203 回答