0

我的目标是捕获我网站上的所有点击事件,检查用户是否仍然登录,然后让他们根据决定他们当前登录状态的 ajax 调用的结果继续或取消他们请求的操作。

我这样做是因为用户经常打开窗口并进行多项选择,运行报告并打开内部选项卡......允许超时的默认行为导致用户丢失他们的工作。

所以,第一步:(拦截所有点击事件)

 $(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 调用之前完成,但我并不肯定这就是问题所在。

任何帮助将不胜感激......谢谢!

4

3 回答 3

1

AJAX 代表异步Javascript 和 XML。默认情况下,AJAX 调用不会阻塞,它们在后台运行,而其余代码继续运行。因此,您的事件在 AJAX 调用完成之前完成是正确的。

jQuery 的 ajax() 方法允许您指定 async: false 作为参数之一来更改此行为,这应该可以得到您想要的。

于 2011-05-03T20:55:20.533 回答
1

我能看到这个工作的唯一方法是使用 async:false。

但是,请注意,使用 async:false 时,“ajax”调用将挂起浏览器,直到它返回。

于 2011-05-03T20:56:26.340 回答
0

使用jquery 事件委托。连同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; });
于 2011-05-04T13:46:12.207 回答