16

我正在创建一个 MVC 应用程序。有必要在关闭应用程序(即窗口/选项卡)时使会话中的变量为空,但在刷新应用程序时不需要。我通过以下代码进行了尝试。

<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”总是 0 而不是 116。因此,即使按下 F5 键,我的变量也会变为空,这不是我的要求。

即使应用程序(即网页)关闭,即使它是 0(这可能是正确的)。

请注意,上述部分代码位于 .cshtml 文件中。

谁能告诉我哪里错了?

4

7 回答 7

25

如果你想让它在crossborwser中工作,你必须听不同的事件+你必须在每次按下按键事件时听,而不是在加载时:

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.onbeforeunloadhttps ://developer.mozilla.org/en-US/docs/DOM/window.onbeforeunload

于 2013-02-05T12:49:13.707 回答
10

不要使用e.keyCode == 116usee.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 回答
4
document.onkeydown = disableF5;
document.onkeypress = disableF5
document.onkeyup = disableF5;    
function disableF5(e) { if ((e.which || e.keyCode) == 116) e.preventDefault(); };
于 2019-01-10T08:19:18.550 回答
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 回答
1

不要使用 (e.keyCode == 116) 来检查 F5 ;而不是使用这个

<script>
    document.onkeydown = capturekey;
    document.onkeypress = capturekey;
    document.onkeyup = capturekey;

    function capturekey(e) {
        e = e || window.event;
        //debugger
        if (e.code == 'F5') {
            if (confirm('do u wanna to refresh??')) {
                //allow to refresh
            } 
            else {
                //avoid from refresh
                e.preventDefault()
                e.stopPropagation()
            }
        }
    }
</script>
于 2019-12-15T08:29:23.597 回答
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 回答