jQuery Ajax在cordova iOS应用程序上发送之前成功
Posted
技术标签:
【中文标题】jQuery Ajax在cordova iOS应用程序上发送之前成功【英文标题】:jQuery Ajax Firing success before beforesend on cordova iOS app 【发布时间】:2014-08-12 12:17:12 【问题描述】:以下摘录会更改登录按钮的 html,直到收到来自服务器的响应。
在使用 Cordova 构建的应用程序中在我的 iPhone 上进行测试时。在更新登录按钮的 html 之前触发警报。在桌面浏览器中,它按预期工作。
我尝试将缓存和异步设置为 false,但没有任何区别。
除了不同的 ajax 库,我想不出还有什么可以尝试的?
有没有更好的库可用于带有 cordova 的 AJAX?
$.ajax(
data: $data,
cache: false,
async: false,
beforeSend: function()
$('#btn-login').html('Logging In...');
,
success: function(r, status)
if (r.status == 'success')
getUser();
initNavSwipeGestures();
$('#page-index').removeClass('active');
else
alert(r.message);
,
error: function(data, status)
alert(status);
);
【问题讨论】:
哪个警报被触发,成功还是错误? 成功正在被解雇。 那么警报中会显示什么? 来自服务器的响应消息 - 登录详细信息不正确 “登录...”将异步执行。很可能会立即调用成功,因此肉眼看不到“登录..”更新。您可以使用 setTimeout(约 5 秒) 调用成功回调,并在更新之前检查状态“正在登录..”是否正在显示。 【参考方案1】:成功时调用Success - http://api.jquery.com/jquery.ajax/:
成功 类型:函数(PlainObject 数据,字符串 textStatus,jqXHR jqXHR) 请求成功时调用的函数。该函数获得三个参数: 从服务器返回的数据,根据 dataType 参数格式化;描述状态的字符串;和 jqXHR(在 jQuery 1.4.x 中,XMLHttpRequest)对象。从 jQuery 1.5 开始,success 设置可以接受一个函数数组。每个函数都会被依次调用。这是一个 Ajax 事件。
如果要检查返回的数据,请使用“成功”...否则应使用“完整”。
这样的事情应该可以工作:
$.ajax(
data: $data,
cache: false,
async: false,
beforeSend: function()
$('#btn-login').html('Logging In...');
,
success: callback()
,
complete : function()
getUser();
initNavSwipeGestures();
$('#page-index').removeClass('active');
,
error: function(data, status)
alert(status);
);
var callback = function(response)
///stuff to do after success here
;
【讨论】:
是的,我的 json 响应中也返回了成功|错误,表示登录是否成功。我在成功回调中检查。 你试过在 safari 中测试它吗?对于我发现的 ios 混合应用来说,这是一个更好的测试平台。 感谢您的提示。我还没有找到调试我的应用程序的方法。我只用了几天 Cordova。 它是无价的... 检查元素 - 用于 console.log("") 的控制台 - 检查元素窗口顶部的资源选项卡将允许您查看本地存储或 webSQL 数据库。您还可以在 UI 方面更接近您将在手机上看到的最终结果。真是无价之宝!【参考方案2】:这就是我最终得到的结果:
$('#form-login').on('submit', function(e)
e.preventDefault();
if ($.trim($('#email').val()) === '' || $.trim($('#password').val()) === '')
return;
var loginBtn = Ladda.create( document.querySelector('#btn-login') );
$data = $('#form-login').serializeArray();
$.ajax(
data: $data,
beforeSend: function()
$('#btn-login').addClass('isloading');
loginBtn.start();
,
success: function(r, status)
setTimeout(loginResponse(r, loginBtn), 500);
,
error: function(data, status)
if (PLATFORM == 'desktop')
alert(status);
else
loginBtn.stop();
$('#btn-login').removeClass('isloading');
navigator.notification.alert(status, false, false);
);
);
function loginResponse(r, loginBtn)
if ($('#btn-login').hasClass('isloading'))
if (r.status == 'success')
getUser();
$('#page-index').removeClass('active');
else
if (PLATFORM == 'desktop')
alert(r.message);
else
navigator.notification.alert(r.message, false, false);
loginBtn.stop();
$('#btn-login').removeClass('isloading');
else
setTimeout(loginResponse(r, loginBtn), 500);
【讨论】:
以上是关于jQuery Ajax在cordova iOS应用程序上发送之前成功的主要内容,如果未能解决你的问题,请参考以下文章
ajax 请求上的 Cordova 升级和 jQuery 错误
Ajax Call 无法在 android 上运行,但在 ios Cordova 上运行良好
SAPUI5 Cordova iOS 应用程序 Ajax 调用不起作用(无限挂起)
Ajax 请求通过浏览器工作,而不是通过 iOS 或 Android 模拟器中的 Cordova 应用程序
Cordova/jQuery - 识别您的应用程序是在 Web/移动浏览器还是移动应用程序 (Android/iOS) 上运行