在PhoneGap / Cordova的网络工作者中是否允许XHR?

时间:2013-07-05 20:12:24

标签: cordova xmlhttprequest web-worker

环境:Cordova 2.9.0,iOS(运行iOS 6.1.3的Xcode 4.6.3 iPad 6.1模拟器和iPad 3)

我正在尝试将另一个文件加载到web-worker中。我加载的文件是应用程序的一部分(意味着它在同一个域中)。

以下代码在不在web-worker中运行时工作正常:( 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时, status 始终为0。不使用cordova时,状态为200。

当我将此代码分隔为Web工作者时,responseText将返回空白状态。

我删除了phoneGap,并确认上面的代码无论是否有网络工作者都可以使用。

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

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分: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);

答案 2 :(得分:0)

是XHR适用于本地文件,其中包含cordova版本6.0.0(cordova-ios版本3.x) in workers ,默认iOS 9.2 UIWebView和(奇怪的)XMLHttpRequests适用于{{ 1}}协议(与其他所有浏览器不同)。 虽然我认为在所有的cordova实现中都是如此,但我还没有尝试过它们。如上所述file:status = 0和{{1}处理程序触发并load影响error(xhr2)所有预期。遗憾的是,所有文件系统API都无法访问,因此这使得访问本地文件(related bug)的方式变得特殊/繁琐。

注意:尝试更新cordova-ios版本到4.0和WKWebView版本1.0.2-dev(仍然是cordova版本6.0)和responseType网址不再有效。