跨浏览器事件处理程序必须捕获[ENTER]

时间:2010-09-20 06:00:43

标签: javascript-events

在函数内部,我有一个事件处理程序。到现在为止还挺好。但是在那个事件处理程序中,我想捕获 Enter ,并将其替换为HTML。

我这样做了:

    CrossBrowserEventHandler(Editor, 'keyup', function(Event) { myFunctionRef(idname, Event) });
    var myFunctionRef = function myFunction(idname, Event)
    {
        var keyCode;
        if (!Event && window.event) {
            Event = window.event;
        }
        if (Event) {
            keyCode = (window.Event) ? Event.which : Event.keyCode;

            if (keyCode == 13) {
                Event.target.ownerDocument.execCommand("inserthtml",false,'<br />');
                Event.returnValue = false;
            }
        }
        PushText(idname); /* pushes the input from a rich text iframe to a textarea */
    }

跨浏览器事件处理函数如下所示:

function CrossBrowserEventHandler(target,eventName,handlerName)
{
    if (target.addEventListener) {
        target.addEventListener(eventName, handlerName, false);
    }
    else if (target.attachEvent) {
        target.attachEvent("on" + eventName, handlerName);
    }
    else {
        target["on" + eventName] = handlerName;
    }
}

在第一部分中,我捕获了键码13(返回)并通过execCommand将其替换为HTML换行符。它做到了,但两次。它不会取消/删除实际的按下返回事件。

任何想法(除了使用JS框架的标准建议,我不能因为多种原因,其中一个是实际学习的过程)?

1 个答案:

答案 0 :(得分:0)

你不应该捕获密钥代码10而不是13吗? 10表示换行符,而13表示回车符。

编辑:您可能会两次获得该事件a)您可能已经注册了两次或者b)事件可能正在冒泡。对于b,我建议您取消冒泡,例如

 ...
       if (keyCode == 13) {
            Event.target.ownerDocument.execCommand("inserthtml",false,'<br />');
            Event.returnValue = false;
            Event.cancelBubble = false;
        }
 ...

然而,另一个建议是从事件处理函数返回false。例如,

 ...
        Event.returnValue = false;
        Event.cancelBubble = false;
        return false;
    }
 ...

并且

CrossBrowserEventHandler(Editor, 'keyup', function(Event) { return myFunctionRef(idname, Event) });