Phonegap AJAX请求未定义

时间:2016-02-08 12:11:28

标签: javascript android jquery ajax cordova

我对来自网页的cordova/phonegap/ajax请求有疑问。由于该应用正在与phonegap开发者应用在手机上运行并完美地发送ajax requests。我认为它与permissions/plugins或其他东西有关。但是,当我使用cordova安装应用时,它不会发送任何内容,整个ajax request会返回:

readyState: 0
responseText: undefined
status: 0
text status: error
error

config.xml我设置了

<access origin="*" />

并在AndroidManifest.xml我设置

<uses-permission android:name="android.permission.INTERNET" />

这是ajax request本身

$.ajax({
    method: "GET",
    crossDomain: true,
    dataType: 'json',
    url: 'http://mywebsite.com/projectname/index.php',
    data: { x: userLocation.latitude, y: userLocation.longitude },
    success: function(data){  
        alert("Success: "+ data);
    },
    error: function(xhr, textStatus, err) { 
        alert("readyState: " + xhr.readyState);
        alert("responseText: "+ xhr.responseText);
        alert("status: " + xhr.status);
        alert("text status: " + textStatus);
        alert("error: " + err);
    }
});

cordova.js纳入项目:

<script type="text/javascript" src="cordova.js"></script>
<script src='js/jquery.js'></script>
<script>
    $(document).bind('mobileinit', function () {
        $.mobile.changePage.defaults.changeHash = false;
        $.mobile.hashListeningEnabled = false;
        $.mobile.pushStateEnabled = false;
    });
</script> 
<script ...here comes js file where ajax is called out

设置这些也不起作用

$.support.cors = true;
$.mobile.allowCrossDomainPages = true;

2 个答案:

答案 0 :(得分:0)

如果您运行的是Cordova 5或更高版本,则需要在HTML中使用内容安全策略元标记,以便向外部服务器发出Ajax请求。如果您从较旧的Cordova版本开始并升级到5或6,那么您的index.html可能没有其中的一个。如果您从CLI启动了一个新的Cordova 5或6应用程序,那么模板“Cordova就绪”应用程序将有一个,但提供的样本不允许向其他服务器发出Ajax请求,除非您明确配置它。

您可以在index.html中添加类似的内容以允许任何地方的Ajax请求:

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; connect-src http://api.fixer.io">

另外,请查看如何在content-security-policy.com或我的博文here配置connect-src,以配置更适合您需求的CSP。

此外,您可能希望使用Cordova“deviceready”事件而不是“mobileinit”,因为您可能在Cordova完全准备好之前过早地进行Ajax调用,因此在(onDeviceReady)回调中进行Ajax调用:

document.addEventListener('deviceready', this.onDeviceReady, false);

或在调用之后执行的某些内容,表示Cordova准备就绪。

答案 1 :(得分:0)

显然我花了很长时间才弄明白,所以我是如何让它工作的: 首先,我从项目中卸载了所有插件,然后删除了文件夹平台/ android。在输入的CMD中:

cordova platform add android

然后再次安装必要的插件。 现在它正在发挥作用。