0

私の目標は、私のWebサイトですべてのクリックイベントをキャプチャし、ユーザーがまだログインしていることを確認してから、現在のログインステータスを決定する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呼び出しの前にイベントが完了しているようですが、それが問題であるとは確信していません。

どんな助けでも大歓迎です...ありがとう!

4

3 に答える 3

1

AJAXは非同期JavascriptとXMLの略です。AJAX呼び出しはデフォルトではブロックされません。コードの残りの部分が進む間、AJAX呼び出しはバックグラウンドで実行されます。したがって、AJAX呼び出しが完了する前にイベントが完了していることは正しいです。

jQueryのajax()メソッドを使用すると、この動作を変更するパラメーターの1つとして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 に答える