情况如下。我在phonegap / jquerymobile中有一个应用程序。我想根据json数据更改页面。
当用户启动应用但当前版本不是最新版本时,需要更改内容。这是start.html页面中的代码片段。
<script type="text/javascript" charset="utf-8">
var versionValue = ServerSettings.versionCheck();
if(versionValue == true){
$("#loginPage").removeClass("hidden");
$("#updatePage").addClass("hidden");
}
else{
$("#loginPage").addClass("hidden");
$("#updatePage").removeClass("hidden");
}
</script>
ServerSettings.versionCheck()函数位于下方。
versionCheck : function() {
var localAppVersion = 0.8;
var response = false;
$.ajax({
async: false,
type: "GET",
contentType: "application/json; charset=utf-8",
dataType: "json",
url: "http://xxx/service/version.php",
success: function(jsonData) {
var currentAppVersion = jsonData.version;
if(localAppVersion == currentAppVersion){
response = true;
}
else{
response = false;
}
}
});
return response;
}
我已经用toast验证了json调用的响应。它确实得到了正确的反应。(版本:0.9)我很确定我犯了最愚蠢的错误,但我似乎无法找到它。
答案 0 :(得分:1)
您正在尝试同步,但config参数评估为true,因为它是一个字符串
async: "false"
将其更改为async: false
,但我建议您切换到异步以避免阻止用户界面。
此外,您的成功回调不会返回到外部方法,因此您将始终未定义。
versionCheck : function() {
var localAppVersion = 0.8;
var response = false;
$.ajax({
// WARNING: I don't recommend setting this to false in production code
// While the browser is waiting for the response the page/browser will not respond!!
async: false,
type: "GET",
contentType: "application/json; charset=utf-8",
dataType: "json",
url: "http://xxx/service/version.php",
success: function(jsonData) {
var currentAppVersion = jsonData.version;
response = localAppVersion == currentAppVersion;
}
});
return response;
}
使其异步(推荐方法)
versionCheck : function(checkCompleteCallback) {
var localAppVersion = 0.8;
$.ajax({
contentType: "application/json; charset=utf-8",
dataType: "json",
url: "http://xxx/service/version.php",
success: function(jsonData) {
var currentAppVersion = jsonData.version;
checkCompleteCallback(localAppVersion == currentAppVersion);
}
});
}
// Now the check accepts a callback function that executes when the request completes without blocking the UI
ServerSettings.versionCheck(function(versionValue) {
if(versionValue){
$("#loginPage").removeClass("hidden");
$("#updatePage").addClass("hidden");
}
else {
$("#loginPage").addClass("hidden");
$("#updatePage").removeClass("hidden");
}
});
答案 1 :(得分:0)
Ajax以异步方式工作,因此当您进行检查时,实际上还没有到达响应。将依赖于该值的逻辑放在ajax回调中。
versionCheck : function() {
var localAppVersion = 0.8;
$.ajax({
type: "GET",
contentType: "application/json; charset=utf-8",
dataType: "json",
url: "http://xxx/service/version.php",
success: function(jsonData) {
var currentAppVersion = jsonData.version;
if(localAppVersion == currentAppVersion){
$("#loginPage").removeClass("hidden");
$("#updatePage").addClass("hidden");
}
else {
$("#loginPage").addClass("hidden");
$("#updatePage").removeClass("hidden");
}
}
});
}
答案 2 :(得分:0)
版本检查是异步调用。所以,它不会返回真或假。您的versionValue
不会是真或假。最好使用promises进行异步调用。
像这样更改你的versionCheck功能
versionCheck : function() {
var localAppVersion = 0.8;
var response = false;
$.ajax({
async: "false",
type: "GET",
contentType: "application/json; charset=utf-8",
dataType: "json",
url: "http://xxx/service/version.php",
success: function(jsonData) {
var currentAppVersion = jsonData.version;
if(localAppVersion == currentAppVersion){
return true;
}
else{
return false;
}
}
}).done(function(){
if(versionValue == true){
$("#loginPage").removeClass("hidden");
$("#updatePage").addClass("hidden");
}
else{
$("#loginPage").addClass("hidden");
$("#updatePage").removeClass("hidden");
}
});
}
jQuery.promise
版本&gt; 1.6
答案 3 :(得分:0)
这是因为您尝试访问尚未从服务器返回的值,因为您正在使用异步。
您可以重构版本检查以获取类似的回调参数。
<script type="text/javascript" charset="utf-8">
var localAppVersion = 0.8,
versionValue =false;
var versionValue = ServerSettings.versionCheck(function(jsonData){
var currentAppVersion = jsonData.version;
if(localAppVersion == currentAppVersion){
versionValue = true;
}
else{
versionValue = false;
}
if(versionValue == true){
$("#loginPage").removeClass("hidden");
$("#updatePage").addClass("hidden");
}else{
$("#loginPage").addClass("hidden");
$("#updatePage").removeClass("hidden");
}
});
versionCheck : function(callback) {
var localAppVersion = 0.8;
var response = false;
$.ajax({
async: "false",
type: "GET",
contentType: "application/json; charset=utf-8",
dataType: "json",
url: "http://xxx/service/version.php",
success: callback
});
}