16

私は MVC アプリケーションを作成しています。アプリケーション (つまり、ウィンドウ/タブ) を閉じるときに、セッション内の変数を null にする必要がありましたが、アプリケーションを更新するときではありませんでした。以下のコードで試してみました。

<script type="text/javascript">
           window.onbeforeunload = function (e) {
               e = e || window.event;
               if (window.event.keyCode == 116) {
                   alert("f5 pressed");
               }
               else {
                   alert("Window closed");
                   //call my c# code to make my variable null, eg:Session["myVariable"] = null;
               }  
           };
</script>

しかし、F5 キーを押すと、「window.event.keyCode」は 116 ではなく常に 0 になります。そのため、私の要件ではない F5 キーを押しても変数が null になります。

アプリケーション (つまり Web ページ) が閉じられている場合でも、その 0 (おそらく正しい) です。

コードの上記の部分は .cshtml ファイルにあることに注意してください。

誰がどこが間違っているか教えてもらえますか?

4

7 に答える 7

25

これをクロスボーザーで動作させたい場合は、さまざまなイベントをリッスンする必要があります + ロード時ではなく、キーイベントが押されるたびにリッスンする必要があります。

document.onkeydown = fkey;
document.onkeypress = fkey
document.onkeyup = fkey;

var wasPressed = false;

function fkey(e){
        e = e || window.event;
       if( wasPressed ) return; 

        if (e.keyCode == 116) {
             alert("f5 pressed");
            wasPressed = true;
        }else {
            alert("Window closed");
        }
 }

ここにデモがあります:http://jsfiddle.net/FSrgV/1/embedded/result/

ただし、ユーザーがページを終了したかどうかを知りたいだけの場合は、次のように使用できますwindow.onbeforeunload: https://developer.mozilla.org/en-US/docs/DOM/window.onbeforeunload

于 2013-02-05T12:49:13.707 に答える
10

代わりに使用e.keyCode == 116しないでください。e.keyCode == 'F5'

 function fkey(e){
    e = e || window.event;
   if( wasPressed ) return; 

    function fkey(e){
        e = e || window.event;
        if (e.code === 'F5') {
            alert("f5 pressed");
            wasPressed = true;
        }else {
            alert("Window closed");
        }
    }

これは、't' と 'F5' の両方がキーコード番号 116 を使用するためです。キーコードだけを使用すると、ユーザーが 't' キーを押すと、ページが更新されます。

于 2016-06-10T07:19:18.657 に答える
4

次のように記述できます。

$(document.body).on("keydown", this, function (event) {
    if (event.keyCode == 116) {
        alert('F5 pressed!');
    }
});
于 2015-04-10T10:48:08.540 に答える
1

変更されたバージョンで、「t」を押した後も機能します。

キー 116 が押される 84 の後に自動

document.onkeydown = fkey;
document.onkeypress = fkey
document.onkeyup = fkey;

var wasPressed = false;

function fkey(e){
    e = e || window.event;
   if( wasPressed ) return; 

    if (e.keyCode == 116) {
         alert("f5 pressed");

    }else {
        alert("Window closed");
    }
    wasPressed = true;
}
于 2017-10-31T09:48:45.557 に答える
0

私はmeoの解決策に同意しますが、いくつかの変更を加えます。

document.onkeydown = fkey; を使用する場合。たとえば、ページには document.onkeydown に影響を与える別のメソッドがあり、ブラウザは最後のイベントのみを検出します。ただし、使用する場合: jQuery(document).on("keydown",fkey); keydown イベントを処理する別の関数がある場合でも、すべての関数がトリガーされます。

理解を深めるために、次の例を参照してください。

var wasPressed = false;
document.onkeydown = f1;
document.onkeydown = f2;

jQuery(document).on("keydown",f3); 
jQuery(document).on("keydown",f4); 
function f1(e){
e = e || window.event;
if( wasPressed ) return; 

        if (e.keyCode == 116) {
             alert("f5 pressed");
            wasPressed = true;
        }else {
            alert("Window closed");
        }
}
function f2(){
    alert('f2');
}
function f3(){
    alert('f3');
}
function f4(){
    alert('f4');
}

ここに表示される内容: 3 つのアラートのみ: f2、f3、および f4。この例では f1 関数はトリガーされません。

于 2014-05-21T16:32:43.850 に答える