0

だから私はここで何が悪いのかを理解しようとしています!

私は Ajax を使用してユーザーのログインとログアウトを行い、ドキュメントの一部を更新しています。すべて正常に動作していますが、ログアウトするときに、変更を確認するためにリンクを 2 回クリックする必要があります。

すべての指示が完了した後、セッションを破棄しているように見えます。

これがどのように機能するかです(またはほぼ!)

ドキュメント html/php

   <div id="top">  
<?php 
$top = new top();
$top->display();
?>
</div>

したがって、ドキュメントの上部のコンテンツを作成するクラスを呼び出すだけで、これは正常に機能しています。

ログインすると、上部にログアウトオプションと次のjquery/ajax呼び出しがあります

 $("#unlog").live("click",function(){
     req_content("top","user","logout","goodbye");
       });

したがって、ログアウトをクリックすると req_content() 関数が実行され、これはすべてうまく機能しています

クリックすると、ちょっとした ajax_query レスポンダーが実行されます

if($ajax_action=='logout'){

     unset($_SESSION['user']);
     session_destroy();

require('class.php');

$top=new top();
$top->display();

 }

今何が起こったのかというと、クエリを実行しましたが、セッション変数が実際に破棄される前にページがちょっと更新されました。もう一度クリックすると、セッションが既に破棄されているため、期待どおりに機能します。

誰でもこれを説明できますか?プロセスは私のログインと同じであり、正常に機能しています。

req_content() 関数

function req_content(box,user,action,query) {

    var xhr = getXMLHttpRequest();
    document.getElementById(box).innerHTML="<img src='img/load.gif' alt'Loading....'>";
    xhr.onreadystatechange = function() {

        if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
            document.getElementById(box).innerHTML=xhr.responseText;
        }





    };

    var sVar1 = encodeURIComponent(box);     /* Endroit ou on demande le contenu*/
    var sVar2 = encodeURIComponent(user);    /* Qui demande le contenu(facultatif)*/
    var sVar3 = encodeURIComponent(action);  /* Quel action veut-on effectuer*/
    var sVar4 = encodeURIComponent(query);   /* La requete pour efectuer l'action*/

    xhr.open("GET", "ajax_http.php?box=" + sVar1 + "&user=" + sVar2 + "&action=" + sVar3 +"&query=" + sVar4, true);
    xhr.send(null);

}
4

2 に答える 2

1

あなたの説明は、あなたがリンクをクリックしていることです。AJAX が完了する前にページが更新される可能性があります。

試す:

$("#unlog").live("click", function() {
    req_content("top", "user", "logout", "goodbye");
    /* prevent browser default event on element such as link being followed, or form being submmitted*/
    return false;
});

通常のコンテンツを送り返す代わりに、php から返すこともできます。

 print_r( $_SESSION);

AJAX の応答として、何が返されるかを確認します。期待されるコンテンツが配置されるページに配置されます。

于 2012-11-05T00:02:13.377 に答える
1

このスクリプトにリダイレクトを入れてみてください:

    if($ajax_action=='logout'){

         unset($_SESSION['user']);
         session_destroy();

/* HERE INSERT A REDIRECT like header("location: someurl");*/

    require('class.php');

    $top=new top();
    $top->display();

     }
于 2012-11-04T23:53:18.990 に答える