javascript - Phonegap AJAX 请求未定义

标签 javascript android jquery ajax cordova

我在处理来自网页的 cordova/phonegap/ajax 请求时遇到问题。由于该应用程序与在手机上运行的 phonegap 开发人员应用程序配合使用,并且完美地发送 ajax 请求。我认为这与权限/插件或其他东西有关。但是,当我使用 cordova 安装应用程序时,它不会发送任何内容,并且整个 ajax 请求 返回:

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

config.xml中我设置了

<access origin="*" />

并在AndroidManifest.xml中设置

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

这是ajax请求本身

$.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;

最佳答案

如果您运行的是 Cordova 5 或更高版本,则需要在 HTML 中添加内容安全策略元标记,以便向外部服务器发出 Ajax 请求。如果您从较旧的 Cordova 版本开始并升级到 5 或 6,则您的 index.html 中可能没有其中之一。如果您从 CLI 启动了新的 Cordova 5 或 6 应用程序,则模板“Cordova is Ready”应用程序将有一个,但提供的示例不允许向其他服务器发出 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">

或者查看如何配置 connect-src content-security-policy.com或我的博客文章here配置更严格的 CSP 来满足您的需求。

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

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

或者在调用之后执行的内容中,表明 Cordova 已准备就绪。

关于javascript - Phonegap AJAX 请求未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35269384/

相关文章:

javascript - 如何在隐藏容器(选项卡式布局)中使用 Javascript Infovis Toolkit

android - Android源码编译Helloworld的方法

javascript - 甲骨文 APEX |如何以表格形式聚焦最后添加的行

javascript - JQuery Deferred如何使用resolve和promise来判断函数结束

javascript - 如何为下一页/上一页获取 Page Flipper 动画

从java中生成html报告时的javascript问题

javascript - JS 不适用于 FireFox,但适用于 Chrome 和 I.E

javascript - 使用 HTML 修复轮播中的图像大小

android - 未找到连接的设备;请连接设备

java - 将数据保存在对象的 ArrayList 中