如何根据ajax调用中的函数结果使用jQuery取消单击事件?

时间:2011-05-03 20:50:44

标签: jquery ajax preventdefault

我的目标是捕获我网站上的所有点击事件,检查用户是否仍然登录,然后让他们根据确定当前登录状态的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调用之前完成的,但我并不认为这是问题所在。

非常感谢任何帮助......谢谢!

3 个答案:

答案 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; });