加载新页面时检查是否已按下键 (JavaScript)

Check if key is already pressed when loading new page (JavaScript)

我目前正在构建一个网站,该网站通过 JavaScript 使用自定义快速导航。

如果用户按右键,他将被导航到我的页面列表中的下一页,并且通过按 ALT + 右键或左键,他可以在浏览器历史记录中向前和向后导航。

这是我当前的代码:

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) 请求加载页面内容?这样您实际上不会离开主页并且可以跟踪触发的事件。缺点是您需要创建自己的 "history",因为从浏览器的角度来看您实际上并没有离开页面。做到这一点的一个好方法是利用 window.location.hash.

如果您不想使用 AJAX

,您可以将页面加载到 IFRAME