Javascript 如何覆盖Ctrl+;N在firefox中启动AJAX

Javascript 如何覆盖Ctrl+;N在firefox中启动AJAX,javascript,ajax,firefox,Javascript,Ajax,Firefox,注意:胡安·门德斯的答案是被选中的答案,因为它对我的情况做出了最有用的回应。虽然AxGryndr也有一些有用的信息。阅读两个答案,它们都适用于不同的情况。谢谢你们两位的帮助 我已经问了一个类似的问题,这个问题解决了我问题的第一部分,现在我有了另一个问题。我希望Ctrl+N启动一个包含AJAX的脚本,但一旦我运行.get函数,它就会启动默认脚本。有人知道这方面的解决办法吗 这把小提琴有一些代码显示了我的问题。下面是一些代码 function checkkey(e) { if(e.ctrlK

注意:胡安·门德斯的答案是被选中的答案,因为它对我的情况做出了最有用的回应。虽然AxGryndr也有一些有用的信息。阅读两个答案,它们都适用于不同的情况。谢谢你们两位的帮助

我已经问了一个类似的问题,这个问题解决了我问题的第一部分,现在我有了另一个问题。我希望Ctrl+N启动一个包含AJAX的脚本,但一旦我运行.get函数,它就会启动默认脚本。有人知道这方面的解决办法吗

这把小提琴有一些代码显示了我的问题。下面是一些代码

function checkkey(e)
{
    if(e.ctrlKey && e.keyCode == 'N'.charCodeAt(0) && !e.shiftKey && !e.altKey)
    {
        try{e.preventDefault();}catch(ex){}
        var m_objXMLHttpReqObj = new XMLHttpRequest();
        m_objXMLHttpReqObj.open("GET", "", false);
        m_objXMLHttpReqObj.send();
    }
}

我认为您的问题在于您正在检查按键,并且在按键后执行操作太晚。如果您将代码更改为绑定到Ctrl+N的向下键,我认为您将能够获得所需的结果。比如:

var pKey
$(function() {
$(window).keydown(function(e) {
    if(e.which == 17) {
        pKey = e.keyCode;
    }
    else {
        if(pKey == 17 && e.keyCode == 78) {
            e.preventDefault();
            console.log(e);
        }
    }
});
});
我添加了全局变量来捕获Ctrl键down,即keycode 17。然后,我在第二个keydown上捕获了keycode 78,这是N.previor e.preventDefault()不足以阻止新窗口,因此我必须为e.stopPropagation()、e.stopImmediatePropagation()和console.log(e)添加额外的行。正如Juan M所提到的,其他的已经不需要了,所以我已经更新了代码,不包含它们


注意:Firefox更改了密钥竞价优先级。以前是System>Website>Firefox,但人们似乎在抱怨网站劫持了捷径,因此优先级已更改为System>Firefox>Website,这意味着即使您的网站绑定了Ctrl+N,Firefox对于新windows的优先级也会接管。

您的代码没有阻止默认行为

function checkkey(e) {
    if(e.ctrlKey && e.keyCode == 'N'.charCodeAt(0) && !e.shiftKey && !e.altKey) {
        e.preventDefault();
        // Now send your AJAX
AJAX似乎还干扰了停止默认行为的能力。您试图发送一个同步AJAX请求(永远不要这样做,它会停止浏览器),但您没有给它一个URL(触发错误)。只要您更改设置以正确地为其提供URL并使其异步,那么它就可以在FF中工作

这是工作代码

function checkkey(e) {
    if(e.ctrlKey && e.keyCode == 'N'.charCodeAt(0) && !e.shiftKey && !e.altKey){
        e.preventDefault();
        var m_objXMLHttpReqObj = new XMLHttpRequest();
        m_objXMLHttpReqObj.open("GET", 
                // URL to go to
                "/echo/html/", 
                // Asynchronous
                true);
        m_objXMLHttpReqObj.send("");
    }
}
然而,在Chrome中(它可能对您没有用处,但对阅读此答案的其他人有用),您将看到处理程序永远不会得到。因此,Chrome甚至不允许您看到
CTRL+N
组合,您对此无能为力。就像Windows应用程序不会收到
CTRL+ALT+DEL


如果应用程序必须适用于多个浏览器,我的建议是使用不同的组合,如
ALT+SHIFT+N
,你真的不想接管基本的浏览器快捷方式。

我刚刚尝试过,在添加AJAX后,这里是不起作用的。谢谢你的尝试。我试了一会儿,我想我有一些有效的方法。我已经更新了代码。Fiddle似乎没有意识到这一点,但当我将其添加到记事本中创建的快速HTML页面时,当我点击Ctrl+T时,Firefox没有打开新选项卡。但是,由于您试图仅阻止一个Ctrl事件,因此可能还需要做一些工作。您说您有一些可能工作。你能把它寄给我吗?我想看看。我编辑的代码将阻止所有按键事件。我正在阅读.keypress并不总是对CTRL、ALT、SHIFT等做出响应,所以我尝试了.keypdown,得到了相同的结果。然后我发现Firefox改变了密钥竞价的优先级。它过去是系统>网站>火狐,但人们似乎在抱怨网站劫持了捷径,因此优先级已更改为系统>火狐>网站,这意味着即使您的网站绑定了Ctrl+N,Firefox对于新windows的优先级也将接管。你必须重写Ctrl+N吗?我已经试过了,它在我的JSFIDLE中,在firefox中不起作用。这也是我问题第一部分的答案检查链接我可以问一下,当这个问题仅限于Firefox时,你为什么要谈论chrome吗???@wolfcall我不敢相信我错过了你谈论Firefox的事实。。。正在进行更多的修改…请留下操作系统保留语言更改快捷方式的
Alt+Shift