javascript-停止全局功能

javascript-停止全局功能,javascript,Javascript,我正在开发一个遗留应用程序,发现了以下javascript片段: function keypress(e) { var evt = (e) ? e : window.event; switch (evt.keyCode) { case 9:case 13: { ... } 这一直很有效,但是我使用了一个从的onKeyPress调用的特定函数,为应用程序添加了新功能,让我们将其称为函数xyz()。除按下回车键外,此功能工作正常。在

我正在开发一个遗留应用程序,发现了以下javascript片段:

function keypress(e) {
    var evt = (e) ? e : window.event; 
    switch (evt.keyCode) {
        case 9:case 13: {
        ...
        }
这一直很有效,但是我使用了一个从
onKeyPress
调用的特定函数,为应用程序添加了新功能,让我们将其称为
函数xyz()
。除按下回车键外,此功能工作正常。在我的新函数中,我可以捕获keycode13(回车键),但我无法阻止它转到上面的函数。在“我的新功能”中按Enter键时,上面的代码会导致出错

我需要一种方法来防止Enter键进入
按键(e)
功能(如上)。有没有办法阻止它这样做

function xyz(event)
{
   if(event.keyCode == 13){
      //  I need to stop the process of the Enter key here
      ...
   }
}

只需让事件侦听器先侦听您的函数,然后调用
按键

我可能误解了您的要求,您应该能够在语句中分隔“Enter”大小写,如图所示:

function keypress(e) {
    var evt = (e) ? e : window.event; 
    switch (evt.keyCode) {
        case 9:
            //Tab Key Pressed
             break;

        case 13: 
            //Enter Key Pressed
            break;
     }
}
为了停止按键执行,您可以检查在switch语句之前按下的键,或者只在case 13中返回false

function keypress(e) {
        var evt = (e) ? e : window.event; 
        if(evt.keyCode != 13)
        {
            switch (evt.keyCode) {
                case 9:
                    //Tab Key Pressed
                    break;

                case 13: 
                    //Enter Key Pressed
                    break;
            }
        }
   }


我想你应该这样:

function keypress(e) {
    var evt = (e) ? e : window.event; 
    switch (evt.keyCode) {
        case 9: {
        ...}
        break;
        case 13: ...//your code
        break;
        }

这个解决方案应该完全不引人注目,只是测试了一些类似的东西:

new function() {
    var old_kp = window.keypress;
    delete window.keypress;
    window.keypress = function(e) {
        switch (evt.keyCode) {
            case 13: /* do your thing */
            default: {
                return old_kp(e);
            }
        }
    }
}();
您可以像以前一样调用函数,它包装旧函数,在“13”以外的情况下,您只需委托给旧实现


编辑:

要取消“Enter”键事件的传播,请查看部分。它将告诉您如何以跨浏览器兼容的方式防止传播:

function xyz(e) {
    if(event.keyCode == 13) {
       if (!e) var e = window.event;
       e.cancelBubble = true;
       if (e.stopPropagation) e.stopPropagation();
    }
}

旧版本的IE不会将事件传递给事件处理程序,您需要检索window.event。这就是为什么我们首先检查是否分配了e,如果没有,我们将window.event分配给e。cancelBubble属性也是IE特有的,设置它可以让IE和其他浏览器不会抱怨,他们只是忽略了该属性。最后一项检查是该事件是否存在stopPropagation方法。stopPropagation是W3C事件模型推荐的解决方案。所有现代浏览器都支持这一点(包括IE9)。使用此代码,您将涵盖在所有或多或少现代浏览器中停止事件传播的所有现有可能性。

可能重复@Marc-我看了这个问题,我不确定这是一个类似的问题。您的问题不是很清楚,您能澄清一下吗?为什么你不能改变引用的代码?@JeffV:你说的是“覆盖”,对我来说就是用新的东西替换原来的函数。因此,“重新定义”。@Marc-我明白你的意思了。基本上,我仍然需要旧功能,但我还需要添加新功能,这就是我使用override的原因(在.Net中,您可以使用override关键字,允许使用不同的签名调用相同的函数名)。这就是为什么我使用了override这个词。我需要旧代码来让enter键以同样的方式工作,但是,我需要enter键以不同的方式来实现这个新功能。我如何重写这个函数?我重写了这个问题,以便更好地阐明我在寻找的东西的需要。你从事件切换到e。这有什么原因吗?对不起,没有,只是想保存一些输入:)那么e应该是事件吗?因为我的函数是xyz(event,foo),一旦我找到了变量名,它就工作了!非常感谢。你能解释一下这个解决方案到底在做什么吗?举个例子,你做了什么!什么事?我假设window.event是当前的按键。如果你能更新你的答案,这将有助于我和其他人更好地理解它。谢谢你留下来帮助我。我补充了几句话,但我几乎可以肯定原文章在解释细节方面做得更好。
function xyz(e) {
    if(event.keyCode == 13) {
       if (!e) var e = window.event;
       e.cancelBubble = true;
       if (e.stopPropagation) e.stopPropagation();
    }
}