检查在加载新页面(JavaScript)时是否已按下键
我目前正在建立一个网站,通过JavaScript使用自定义快速导航 如果用户按向右键,他将被导航到“我的页面列表”中的下一页,通过按ALT+向右键或向左键,他可以在浏览器历史记录中前后导航 这是我当前的代码:检查在加载新页面(JavaScript)时是否已按下键,javascript,jquery,keypress,keylistener,keydown,Javascript,Jquery,Keypress,Keylistener,Keydown,我目前正在建立一个网站,通过JavaScript使用自定义快速导航 如果用户按向右键,他将被导航到“我的页面列表”中的下一页,通过按ALT+向右键或向左键,他可以在浏览器历史记录中前后导航 这是我当前的代码: var map = []; window.onkeydown = window.onkeyup = function(e){ e = e || event; // to deal with IE map[e.keyCode] = e.type ==
var map = [];
window.onkeydown = window.onkeyup = function(e){
e = e || event; // to deal with IE
map[e.keyCode] = e.type == 'keydown';
if (map[18] && map[39]) { // ALT + Right
window.history.forward();
}
else if (map[18] && map[37]) { // ALT + Left
window.history.back();
}
else if (map[39]) { // Right Key
window.location.href = "{{ path('sctn_findsong') }}";
}
if (map[38]){ // Up Key
//
}
if (map[40]){ // Down Key
//
}
}
除了一个小问题外,一切正常:
假设我想返回三页-如果我是一个有逻辑思维的人,我会先按ALT+Left返回一个站点,然后当我在上一个站点上时,只需按住ALT,然后再按Left返回一个站点。然而,当我返回一个站点并按住ALT键时,它并没有显示ALT仍然被按下,所以每次到达前一个站点时我都必须再次按下ALT键,这非常烦人。
我如何让它以我想要的方式工作?
感谢您的帮助。您应该查找e.altKey==true以查看alt键是否已关闭
var map = [];
window.onkeydown = window.onkeyup = function(e){
e = e || event; // to deal with IE
map[e.keyCode] = e.type == 'keydown';
if(e.altKey==true){ // ALT down
if (map[39]) { // + Right
window.history.forward();
//console.log("forward");
}
else if (map[37]) { // + Left
window.history.back();
//console.log("back");
}
}
else if (map[39]) { // Right Key
window.location.href = "{{ path('sctn_findsong') }}";
}
if (map[38]){ // Up Key
//
}
if (map[40]){ // Down Key
//
}
}
这是不可能的。您需要一个事件keyup或keydown,以便能够在加载新页面后了解ALT键的状态。但是,例如,您可以将状态布尔值向下或向上存储在localStorage中。加载新页面时,您可以读取该值。但是,这可能不可靠,尤其是如果在加载页面之前在页面加载期间释放该键。您还需要在每个加载的页面中包含处理keyevents/localStorage的javascript
您是否考虑过更改Web应用程序的设计,以便通过异步ajax请求加载页面内容?这样,您实际上就不会离开主页面,并且可以跟踪触发的事件。缺点是您需要创建自己的历史记录,因为您实际上没有从浏览器的角度留下页面。一个很好的方法是使用window.location.hash。如果你不想使用AJAX,可以将页面加载到IFRAME我在第一个if语句的正前方添加了这一点:if e.AltKey==true{map[18]=true;}-这就是你的想法吗?e.AltKey与map[18]不一样,请参见更新谢谢。我有一个解决问题的B计划,这基本上就是你在第二段中提到的,但我只是希望我忽略了一些明显的东西,这将是一个一行。