Ajax 不能在 phonegap 上工作
Posted
技术标签:
【中文标题】Ajax 不能在 phonegap 上工作【英文标题】:Ajax not working on phonegap 【发布时间】:2015-01-02 20:49:45 【问题描述】:我正在从 phonegap 制作原生应用程序。
首先我在 mvc 中创建了 rest api,我的所有函数都返回 json 行为并允许获取。
然后我制作了一个像 index.html 这样的 html 文件,然后这个文件在 firefox 中运行并出现第三方跨域错误之类的错误,我已经修复了这个错误,在我的 web.config 中制作了一些代码,现在可以正常工作了我在浏览器中的 ajax 代码
然后这个 html 页面我是简单的复制粘贴到 eclips 并在模拟器中运行我的应用程序,看起来不错,但是 我的 ajax 调用总是错误。
我遵循如下步骤:
1) <access origin="*" /><access origin="http://www.testsite.com:8090/Controller/Actionname" />
在 config.xml 文件中
2) <uses-permission android:name="android.permission.INTERNET" />
在 androidMenifest.xml 文件中
但仍然 ajax 失败
HTML 代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Unable to zooming device-->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css">
<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap-theme.min.css">
<script src="js/jquery-2.1.1.min.js" ></script>
<!-- Latest compiled and minified javascript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>
</head>
<body>
<section id="login">
<div class="container">
<div class="row">
<div class="col-xs-12">
<div class="form-wrap">
<h1>Log in with your email account</h1>
<!-- <form role="form" action="javascript:;" method="post" id="login-form" autocomplete="off">-->
<div class="form-group">
<label for="email" class="sr-only">Email</label>
<input type="email" name="email" id="email" class="form-control" placeholder="somebody@example.com">
</div>
<div class="form-group">
<label for="key" class="sr-only">Password</label>
<input type="password" name="key" id="key" class="form-control" placeholder="Password">
</div>
<input type="button" id="btn-login" class="btn btn-custom btn-lg btn-block" value="Log in">
<!--</form>-->
<a href="javascript:;" class="forget" data-toggle="modal" data-target=".forget-modal">Forgot your password?</a>
<hr>
</div>
</div> <!-- /.col-xs-12 -->
</div> <!-- /.row -->
</div> <!-- /.container -->
</section>
</body>
</html>
Ajax 代码如下:
<script charset="utf−8" type="text/javascript">
$(document).bind("mobileinit", function()
$.support.cors = true;
$.mobile.allowCrossDomainPages = true;
);
$(document).ready(function()
$("#btn-login").click(function()
var email = $("#email").val();
var pwd = $("#key").val();
var URL = "http://www.testsite.com:8090/Controller/ActionName?email=abc@abc.com&password=123123&apiToken=45retw54fgw45fgq345fg"; //iis url
var URL1 = "http://localhost:15536/Controller/ActionName?email=abc@abc.com&password=123123&apiToken=45retw54fgw45fgq345fg";
$.ajax(
url: URL,
type:"POST",
datatype:"json",
success: function (data)
console.log(data.data);
window.location.href="welcome.html";
,
error : function(xhr, ajaxOptions, thrownError)
alert(xhr.status);
alert(thrownError);
);
);
);
</script>
【问题讨论】:
尝试在您的 ajax 调用之前放置一个日志/警报,以确保您的点击事件通过电子邮件和密码正确处理。顺便说一句,您应该使用 deviceready 事件来确保 cordova 已准备就绪 (cordova.apache.org/docs/en/4.0.0/…) 我确定我的 ajax 调用正在工作,因为我收到了这两个警报(xhr.status);警报(抛出错误);点击按钮后 那你为什么不分享错误呢? 因为我在警报中没有收到正确的错误。看到我的第一个警报显示“0”,第二个是空的,我认为在 phonegap 中的页面时无法检查控制台日志。 您可以使用控制台插件检查带有phonegap的控制台日志。 【参考方案1】:您得到的零是您的服务器响应代码。您的请求作为跨域请求被阻止。您的桌面浏览器允许这样做,但 phonegap 不允许。尝试使用 jsonp 和 ajax get 请求来解决这个跨域拒绝..
修改它以满足您的需要并修改您的脚本以获取输入:
$.ajax(timeout: 5000,
url: 'http://yoursite.com/yourscript.php',
dataType: "jsonp",
callback: 'callback',
jsonpCallback: 'yourcallback',
type: "GET",
crossDomain: true,
data: 'scriptinput':'data string you send'
);
function yourcallback(response)
console.log(response);
请务必将您的响应包装为函数调用 yourcallback(yourjsonstring)
中的 json 字符串。
这是一个示例,说明这如何在 PHP 的服务器端为我工作。希望您能从中了解如何修改您的 iis 服务器端脚本。
function SendAnswer($response)
// Allow from any origin
if (isset($_SERVER['HTTP_ORIGIN']))
header("Access-Control-Allow-Origin: $_SERVER['HTTP_ORIGIN']");
header('Access-Control-Allow-Credentials: true');
// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS')
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
header("Access-Control-Allow-Methods: GET, OPTIONS");
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
header("Access-Control-Allow-Headers: $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']");
header("content-type: application/json");
$callback = filter_input(INPUT_GET, 'callback', FILTER_SANITIZE_SPECIAL_CHARS);
echo "$callback(" . json_encode($response) . ")";
祝你好运。
【讨论】:
以上是关于Ajax 不能在 phonegap 上工作的主要内容,如果未能解决你的问题,请参考以下文章
Phonegap:ajax + jsonp 在 PC 上工作但在 Android 上不工作
使用 Phonegap、AJAX、PHP 和 mySQL 登录不工作
Phonegap Cordova Ajax 请求 404(未找到)错误
PhoneGap App 在模拟器上工作,但在 iPhone 设备上不能正常工作