1

思いがけない方法で機能するコードがあります。最初に詳細を書き留めておきますので、コードは多かれ少なかれ次のようになります。

window.onunload = doUnload;
var unLoadTimer;
var gInvokeOnBeforeUnload = true;
function setInvokeOnBeforeUnload() { gInvokeOnBeforeUnload = false; }

function doUnload() {
if(gInvokeOnBeforeUnload==true){
    setInvokeOnBeforeUnload();
    top.document.location.href = "LogOff";
    clearTimeout(unLoadTimer); 
}
//Function Midpoint
if (top.document.readyState != "complete" && gLogOffClick == false){
    unLoadTimer = setTimeout("doRealUnload("+func_call_count+")", 800); 
    //its just a timeout for the function to be called again
}
}

ロギングも追加しましたが、コードを小さく保つために、例から除外しました。私が直面した問題はtop.document.location.href、「LogOff」に再割り当てされておらず、サイトで開いた最初の開始ページである「LogIn」と同じであるということでした。

window.onunload ヒットしたイベントをトリガーするためにF5(そしてそれは常に発生します)、ログオフはに割り当てられていませんlocation.href。「//FunctionMidpoint」コメントマーカーで単純なものを追加した場合にのみ、alert(1); ログオフがトリガーされます(以下のApacheログに表示されます)が、場所のhrefは以前と同じです-「LogIn」。値が割り当てられたらすぐに変更する必要があると考えるのは間違っていますか?

そして、私はいくつかの点を理解できていません:

  1. location.hrefLOGOFFの値を割り当ててもすぐに変更されないのはなぜですか。
  2. LOCATION.HREF変更されるとすぐに何が起こるべきか
  3. LOCATION.HREFブラウザを開いてログオンすると、どのように初期化されますか

派手なセッション追跡メカニズムはありません。上記のJSが@onunloadを介してトリガーされた単純なHTMLページF5です。

私が達成したいのは、舞台裏で何が起こっているのか、アラートがある場合にリダイレクトが発生する理由を理解することだけです(1)。間にあり、休憩がない場合はありません。私の場合、Apacheは以下を登録しました。

タイムアウトあり:

IP.IP.IP.IP - xxx [28/Oct/2011:10:38:50] "GET /LogOff HTTP/1.1" 200 208
IP.IP.IP.IP - xxx [28/Oct/2011:10:38:50] "GET /LogIn HTTP/1.1" 401 540
IP.IP.IP.IP - xxx [28/Oct/2011:10:38:52] "GET /LogIn HTTP/1.1" 200 2898

タイムアウトなし:

IP.IP.IP.IP - xxx [28/Oct/2011:10:41:04] "GET /LogIn HTTP/1.1" 200 2726

何を読むか/どこを見るかについてのヘルプやガイダンスはありがたいです。誰かが舞台裏で何が起こっているかを詳しく説明できればさらに良いでしょう。不利なことに、私はJSエンジンについて十分な教育を受けていないのではないかと心配しています。コードも実際には私のものではありません:(

私が聞いている追加の質問がある場合は、おそらくそこで重要なものを省略しました:)

IEは私が必要とする唯一のフォーカスグループであるため、他のブラウザでテストしようとはしませんでした...

4

1 に答える 1

0

document.location.hrefページをアンロードするときは読み取り専用です。したがって、ユーザーがページを離れたいときにこのプロパティを変更することはできません。これはセキュリティの「機能」です。

参照:onunloadイベントに応じてFirefoxでwindow.location.hrefを変更する

代わりに、サーバーへの非同期呼び出し、ユーザーのログアウトなどを行うことをお勧めします。これは、jQueryを使用してかなり簡単なAjax呼び出しで行うことができます。

于 2011-11-03T12:15:55.200 に答える