从Phonegap和jQuery中调用JSONP时出现未知错误
我有以下html代码:从Phonegap和jQuery中调用JSONP时出现未知错误,jquery,jquery-mobile,cordova,Jquery,Jquery Mobile,Cordova,我有以下html代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <meta name="viewport" content="width=device-width, initial-scale=1"> <sc
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="js/jq.js"></script>
<script src="js/jqm.js"></script>
<script src="js/jstore.js"></script>
<script src="js/progressbar.js"></script>
<script src="js/sql.js"></script>
<script src="js/phonegap-1.4.1.js"></script>
<script src="js/sha512.js"></script>
</head>
<body>
<!-- Start of first page: #one -->
<div data-role="page">
<!-- header -->
<div data-role="header">
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
</td>
<td>
</td>
</tr>
</table>
</div>
<!-- /header -->
<div data-role="content" data-theme="a">
<center>
<span class="progressBar" id="pb1"></span>
<br />
Initial Syncronisation in progress!
</center>
</div>
<!-- footer -->
<div data-role="footer">
</div>
<!-- /footer -->
<script lang="text/javascript">
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
$("#pb1").progressBar();
$("#pb1").progressBar(5);
$.ajax({
url: 'https://url/user/'+$.jStorage.get("username","false")+'/modeSet/'+$.jStorage.get("password","false")+'/subSequence/'+hex_md5(new Date().getTime())+'.html',
dataType:'jsonp',
jsonp:'jsonp_callback',
jsonpCallback:'infoData',
success: function (data) {
alert('success');
},
error:function (xhr, ajaxOptions, thrownError){
alert(xhr.status);
alert(thrownError);
}
});
}
</script>
</div>
</body>
</html>
它运行在真正的三星Galaxy S2上,搭载Android 4.0.4。我有网络连接,但我不知道哪里出了问题
服务器返回的文档:
infoData({"validJsonDocument":"yes"});
我正在将Phonegap 1.4.1与jQuery 1.7.1和jQuery mobile一起使用
其他库实际上没有被使用。JSONP代表带填充的JSON。填充表示将JSON响应发送回客户端时,围绕JSON响应的函数名 当接收到结果时,它实际上被当作普通JavaScript处理,并被这样处理。因此,将调用围绕JSON的函数 这意味着为了让JSONP正常工作,DOM中必须存在一个与封装JSON响应的函数名匹配的函数 此外,您还使用以下命令指定了“infoData”作为回调函数的名称: 指定JSONP请求的回调函数名。将使用此值代替jQuery自动生成的随机名称。最好让jQuery生成一个唯一的名称,因为这样可以更容易地管理请求并提供回调和错误处理。当您希望对GET请求启用更好的浏览器缓存时,可能需要指定回调。从jQuery1.5开始,您还可以使用函数进行此设置,在这种情况下,jsonpCallback的值被设置为该函数的返回值 尝试在页面上定义一个名为“infoData”的函数,该函数只接受一个参数,这将使您克服此错误
function infoData(jsonObj) {
alert(JSON.stringify(jsonObj)); // print the raw JSON object
alert(jsonObj.validJsonDocument); // access the property in your JSON object.
}
或者,您可以采纳jQuery文档的建议,完全删除jsonpCallback选项,并依赖您已经定义的成功回调。JSONP代表带填充的JSON。填充表示将JSON响应发送回客户端时,围绕JSON响应的函数名 当接收到结果时,它实际上被当作普通JavaScript处理,并被这样处理。因此,将调用围绕JSON的函数 这意味着为了让JSONP正常工作,DOM中必须存在一个与封装JSON响应的函数名匹配的函数 此外,您还使用以下命令指定了“infoData”作为回调函数的名称: 指定JSONP请求的回调函数名。将使用此值代替jQuery自动生成的随机名称。最好让jQuery生成一个唯一的名称,因为这样可以更容易地管理请求并提供回调和错误处理。当您希望对GET请求启用更好的浏览器缓存时,可能需要指定回调。从jQuery1.5开始,您还可以使用函数进行此设置,在这种情况下,jsonpCallback的值被设置为该函数的返回值 尝试在页面上定义一个名为“infoData”的函数,该函数只接受一个参数,这将使您克服此错误
function infoData(jsonObj) {
alert(JSON.stringify(jsonObj)); // print the raw JSON object
alert(jsonObj.validJsonDocument); // access the property in your JSON object.
}
或者,您可以采纳jQuery文档的建议,完全删除jsonpCallback选项,并依赖您已经定义的成功回调。我将代码修改为以下内容:
<script lang="text/javascript">
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
$("#pb1").progressBar(5);
$.ajax({
url: 'http:url/jsonp.html',
dataType: 'jsonp',
jsonp: 'callback',
jsonpCallback: 'jsonpCallback',
success: function (data) {
$("#pb1").progressBar(25);
alert(data.version);
},
error:function (xhr, ajaxOptions, thrownError){
alert(xhr.status);
alert(thrownError);
}
});
}
function jsonpCallback(data){
alert(data.message);
}
</script>
文件。添加的监听器(“deviceready”,OnDeviceraddy,false);
函数ondevicerady(){
$(#pb1”)。进度条(5);
$.ajax({
url:'http:url/jsonp.html',
数据类型:“jsonp”,
jsonp:“回调”,
jsonpCallback:'jsonpCallback',
成功:功能(数据){
美元(pb1).progressBar(25);;
警报(data.version);
},
错误:函数(xhr、ajaxOptions、thrownError){
警报(xhr.状态);
警报(thrownError);
}
});
}
函数jsonpCallback(数据){
警报(数据、消息);
}
如果我在Google Chrome中打开页面,它就可以正常工作。
如果我在android浏览器中打开它,它也会做同样的事情。
给我一个错误200,并说没有调用jsonpCallback。
我真的不知道为什么剧本会让我这么难受。
Chris我将代码修改为:
<script lang="text/javascript">
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
$("#pb1").progressBar(5);
$.ajax({
url: 'http:url/jsonp.html',
dataType: 'jsonp',
jsonp: 'callback',
jsonpCallback: 'jsonpCallback',
success: function (data) {
$("#pb1").progressBar(25);
alert(data.version);
},
error:function (xhr, ajaxOptions, thrownError){
alert(xhr.status);
alert(thrownError);
}
});
}
function jsonpCallback(data){
alert(data.message);
}
</script>
文件。添加的监听器(“deviceready”,OnDeviceraddy,false);
函数ondevicerady(){
$(#pb1”)。进度条(5);
$.ajax({
url:'http:url/jsonp.html',
数据类型:“jsonp”,
jsonp:“回调”,
jsonpCallback:'jsonpCallback',
成功:功能(数据){
美元(pb1).progressBar(25);;
警报(data.version);
},
错误:函数(xhr、ajaxOptions、thrownError){
警报(xhr.状态);
警报(thrownError);
}
});
}
函数jsonpCallback(数据){
警报(数据、消息);
}
如果我在Google Chrome中打开页面,它就可以正常工作。
如果我在android浏览器中打开它,它也会做同样的事情。
给我一个错误200,并说没有调用jsonpCallback。
我真的不知道为什么剧本会让我这么难受。
Chris您是否忘记在问题中包含infoData函数的函数定义?我在代码中看不到这一点。我认为您没有在代码中声明
infoData
函数。您是否忘记包含infoData函数的函数定义