使用window.onbeforeunload事件中的window.event.keyCode在javascript中捕获f5按键事件始终为0,而不是116

使用window.onbeforeunload事件中的window.event.keyCode在javascript中捕获f5按键事件始终为0,而不是116,javascript,jquery,Javascript,Jquery,我正在创建一个MVC应用程序。在关闭应用程序(即窗口/选项卡)时,有必要将会话中的变量设置为null,但在刷新应用程序时不必设置。 我通过以下代码进行了尝试 <script type="text/javascript"> window.onbeforeunload = function (e) { e = e || window.event; if (window.event.keyCode == 11

我正在创建一个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>

window.onbeforeunload=函数(e){
e=e | | window.event;
if(window.event.keyCode==116){
警报(“按下f5”);
}
否则{
警报(“窗口关闭”);
//调用我的c#代码使我的变量为null,例如:Session[“myVariable”]=null;
}  
};
但当按下F5时,“window.event.keyCode”总是0而不是116。 因此,即使按F5键,我的变量也会变为null,这不是我的要求

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

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


有人能告诉我哪里错了吗?

如果你想让它工作,你必须听不同的事件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");
        }
 }
下面是一个演示:


但是,如果您只是想知道用户是否退出该页面,您可以简单地使用
窗口。onbeforeunload

我同意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函数。

您可以这样编写:

$(document.body).on("keydown", this, function (event) {
    if (event.keyCode == 116) {
        alert('F5 pressed!');
    }
});

不要使用e.keyCode==166使用e.code==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。如果您单独使用keycode,那么如果用户按“t”键,您的页面将刷新

修改版本并在按下“t”后工作

84后按116键自动

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;
}
不要使用(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>

document.onkeydown=capturekey;
document.onkeypress=capturekey;
document.onkeyup=capturekey;
功能捕获键(e){
e=e | | window.event;
//调试器
如果(e.code==“F5”){
if(确认('u想刷新吗??)){
//允许刷新
} 
否则{
//避免刷新
e、 预防默认值()
e、 停止传播()
}
}
}

您正在将事件存储到变量e中。你为什么不试试
e.keyCode
;)你应该听的是按键事件。你好,我已经试过了,但是我得到了同样的结果。然后我尝试了上面提到的代码,但仍然没有成功。你不能在javascript中设置会话变量…如果你想在客户端执行会话,也许你应该看看sessvars.js不
e.keyCode
只应用于键盘事件?(另外,即使它确实适用,您也应该在
if
语句中测试
e.keyCode
,而不是
window.event.keyCode
)您好,谢谢您的回答,它在一些修改方面帮助了我。:)我在Oracle ADF中使用了此修改。谢谢。当我使用我的Firefox浏览器进入并按下F5时,我没有看到任何警报或其他东西…不要使用(e.keyCode==116)来检查F5;不要使用thisif(e.code='F5'){//your code here}这绝对不是事实。F5是116。T是84。@在某些浏览器和系统F5上,Adowrath和'T'100%返回116作为键码。
<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>