我的目标是捕获我网站上的所有点击事件,检查用户是否仍然登录,然后让他们根据确定当前登录状态的ajax调用结果继续或取消他们请求的操作。
我之所以这样,是因为用户经常打开窗口,进行多项选择并运行报告并打开内部标签...允许超时的默认行为导致用户丢失工作。
所以,第1步:(拦截所有点击事件)
$(document).ready(function() {
$(document).click(function(event) { fncCheckLogin(event); });
});
步骤2 :(取消所有可点击对象的事件作为测试)
function fncCheckLogin(objEvent) { objEvent.preventDefault(); }
步骤3 :(检查登录状态)
$.ajax({
type:"POST",
url: "myURL",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType:"json",
complete: function(x){
if(x){
if (!isOpen) {
DoSomeStuff
}
);
isOpen = true;
testMe(objEvent);
}
} else {
if (isOpen) {
isOpen = false;
}
}
}
});
步骤4 :(如果登录已过期,则阻止此操作)
function testMe(objEvent) { if (isOpen) { objEvent.preventDefault(); }}
“ isOpen ”变量只是识别已注销用户脚本是否已运行。我试图直接从ajax调用访问preventDefault,但我移动它来测试东西。
我认为我的问题是时间...如果我在if语句之前的步骤4中发出警报,则preventDefault命令可以正常工作,但是否则不会。好像事件是在我的ajax调用之前完成的,但我并不认为这是问题所在。
非常感谢任何帮助......谢谢!
答案 0 :(得分:1)
AJAX代表异步 Javascript和XML。默认情况下,AJAX调用不会阻塞,它们会在后台运行,而其余代码会继续运行。因此,在完成AJAX调用之前,您的事件正在完成,这是正确的。
jQuery的ajax()方法允许您指定async:false作为更改此行为的参数之一,它可以为您提供所需的内容。
答案 1 :(得分:1)
我能看到这个工作的唯一方法是使用async:false。
但是,请注意,使用async:false时,“ajax”调用会挂起浏览器,直到它返回。
答案 2 :(得分:0)
使用jquery event delegation。与async:false
一起。但正如kingjiv建议的那样,async:false有它的缺点,使用必要的UI范例(光标到沙漏或ajax加载灯箱等)
$("body").delegate("a", "click", function() {
var loggedIn = false; //def treat as not Logged in
$.ajax({
type:"POST",
url: "myURL",
data: "{}",
async:false,
contentType: "application/json; charset=utf-8",
dataType:"json",
complete: function(x){
if(x) loggedIn = true;
}
});
if(loggedIn){
//Call DOSOMETHING here
}
//return local var ajaxRet so the event will only bubble when loggedIn == true
return loggedIn; });