var isPressed =0;
document.body.onkeypress = function(evt)
{
evt = evt || window.event;
if (evt.keyCode!=='undefined') {
// Do your stuff here
isPressed = 1;
console.log(isPressed);//Here it gives 1
}
//return isPressed;
}
result = navigator.appVersion +"|"+n+"|"+getStyle(mydiv,'opacity')+"|"+history.length+"|"+metarefesh+"|"+hasFocus+"|"+navigator.platform+"|"+parent.top.document.referrer+"|"+activexenable+"|"+javaEnabled+"|"+hasFlash+"|"+navigator.plugins.length+"|"+ hasMouseMoved+"|"+isClicked +"|"+**isPressed**+"|"+isresized+"|"+isScrolled+"|"+getStyle(mydiv,'zIndex');
的console.log(结果); console.log(isPressed)//即使我按下一个键并且它已经变为1,它也会给出零。
如果我在if循环中执行console.log(isPressed),它就可以工作。这是一个我不知道的范围问题。请帮忙。
提前致谢
答案 0 :(得分:1)
问题是同步问题。您的代码读作:
按下某个键时,将
isPressed
设置为一个显示
的值isPressed
第一条指令只说明将在稍后发生的事情并完成。在按下任何键之前,第二条指令立即跟随,因此它显示0.如果您要执行第三条指令:
window.setTimeout(function(){console.log(isPressed)}, 3000);
并在页面加载后立即按一个键(在3秒后通过),您将看到isPressed
设置为1的日志。
如果您在按下某个键后需要执行其他逻辑,则需要将其放在注释“Do your stuff here”。
答案 1 :(得分:1)
以下是console.log
输出原因的核心答案:
Javascript具有异步处理的事件概念。您可以在使用onkeypress
事件时利用此功能。
JS文件的其余部分完成了它需要做的事情(包括设置事件),然后当事件被触发时(按下一个键)它运行里面的代码。
实际上JS文件正在这样做:
isPressed
设置为0
。onkeypress
。isPressed
记录到控制台。onkeypress
实际发生时,让我们运行我们在步骤2中设置的匿名函数。当您到达第3步时,您实际上没有对isPressed
变量做任何事情,因此它将其记录为0
。
稍后,当您点击onkeypressed
时,您实际上正在更改isPressed
的值,因此它会记录为1
。
您还应该注意绑定到onkeypress
的匿名函数没有专门返回isPressed
。您需要将return isPressed
添加到底部(评论所在的位置)。
由于这是一个绑定到事件的匿名函数,因此没有充分的理由这样做。该值不会出现在任何地方,如果您想操纵isPressed
变量,那么您设置的范围是理想的。