Как отменить событие click, используя jQuery, на основе результатов функции в вызове ajax? - PullRequest
0 голосов
/ 04 мая 2011

Моя цель - записать все события кликов на моем веб-сайте, убедиться, что пользователь все еще вошел в систему, а затем разрешить им продолжить или отменить запрошенное действие на основе результатов вызова 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 " просто определяет, является ли илине запущен скрипт пользователя, вышедшего из системы.Я пытался получить доступ к protectDefault напрямую из вызова ajax, но я переместил его для тестирования.

Я думаю, что моя проблема связана с синхронизацией ... если я добавлю предупреждение на шаге 4 перед оператором if,команда warnDefault работает, но в противном случае - нет.Как будто событие завершается до моего вызова ajax, но я не уверен, что это проблема.

Любая помощь будет высоко ценится ... Спасибо!

Ответы [ 3 ]

1 голос
/ 04 мая 2011

Единственный способ увидеть эту работу - использовать async: false.

Но учтите, что при использовании async: false вызов ajax будет зависать в браузере до тех пор, пока он не вернется.

1 голос
/ 04 мая 2011

AJAX означает асинхронный Javascript и XML. Вызовы AJAX по умолчанию не блокируются, они выполняются в фоновом режиме, в то время как остальная часть кода продолжается. Таким образом, вы правы, что ваше мероприятие завершается до завершения вашего вызова AJAX.

Метод jQuery ajax () позволяет вам указать async: false в качестве одного из параметров, чтобы изменить это поведение, что должно дать вам то, что вы хотите.

0 голосов
/ 04 мая 2011

использовать делегирование события jquery .вместе с async:false.Но, как советовал kingjiv, async: false имеет свои недостатки, используйте необходимые парадигмы пользовательского интерфейса (курсор на «песочные часы» или «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; });
...