wol*_*ent 3 javascript jquery keydown addeventlistener onkeydown
我正在使用'keydown'事件替换输入文本框中键入的特定字符。
当我使用时:
document.getElementById('inputText').onkeydown = handleInputTextKeydown;
Run Code Online (Sandbox Code Playgroud)
或等效的JQuery:
$('#inputText').on('keydown',handleInputTextKeydown);
Run Code Online (Sandbox Code Playgroud)
我得到了预期的结果-例如,Shift + i键显示为“í”。
但是,如果我使用addEventListner作为keydown钩子:
var tb = document.getElementById('inputText');
tb.addEventListener('keydown', handleInputTextKeydown, false);
Run Code Online (Sandbox Code Playgroud)
输入文本框同时显示我的替代字符(í)和“ I”(大写i)“íI”。
为什么addEventListener方法不同于两个“ onkeydown”钩子?
我的测试浏览器是IE 11。
顺便说一句:我正在使用另一种stackoverflow帖子中的keydown文本替换方法的变体:
newKey = keyMap[keyPressed]; // Look for this key in our list of accented key shortcuts
if (newKey === undefined) {
return true; // Not in our list, let it bubble up as is
} else {
var oldValue, start, end;
oldValue = this.value; // Insert the updated key into the correct position within the edit textbox.
if (typeof this.selectionStart == "number" && typeof this.selectionEnd == "number") {
start = this.selectionStart;
end = this.selectionEnd;
this.value = oldValue.slice(0, start) + newKey + oldValue.slice(end);
}
// Move the caret
this.selectionStart = this.selectionEnd = start + 1;
return false;
Run Code Online (Sandbox Code Playgroud)
因为您必须防止该.addEventListener()版本的默认行为。
在处理程序的末尾返回false以防止默认行为是jQuery特定的功能和.onkeydown属性的功能,但不适用于.addEventListener('keydown')。
您将需要致电e.preventDefault()(对于现代浏览器)或设置e.returnValue = false(对于非标准浏览器)。
这不仅是解决问题所需要的,但在使用纯JavaScript时,我使用跨浏览器事件处理存根,该存根允许我返回false,如下所示:
// refined add event cross browser
function addEvent(elem, event, fn) {
// allow the passing of an element id string instead of the DOM elem
if (typeof elem === "string") {
elem = document.getElementById(elem);
}
function listenHandler(e) {
var ret = fn.apply(this, arguments);
if (ret === false) {
e.stopPropagation();
e.preventDefault();
}
return(ret);
}
function attachHandler() {
// normalize the target of the event
window.event.target = window.event.srcElement;
// make sure the event is passed to the fn also so that works the same too
// set the this pointer same as addEventListener when fn is called
var ret = fn.call(elem, window.event);
// support an optional return false to be cancel propagation and prevent default handling
// like jQuery does
if (ret === false) {
window.event.returnValue = false;
window.event.cancelBubble = true;
}
return(ret);
}
if (elem.addEventListener) {
elem.addEventListener(event, listenHandler, false);
} else {
elem.attachEvent("on" + event, attachHandler);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3086 次 |
| 最近记录: |