ceb*_*lay 2 javascript google-chrome
我正在开发一个javascript键盘,试图让用户输入各种非洲语言.目前,这在IE8和Firefox中运行良好但不是谷歌浏览器,我实际上只是坚持这个.我想要完成的是例如,键入(在我的物理键盘上)' q '(keyCode = 113)并获得' ɛ '(keyCode = 603)作为输出,但目前,我的代码在谷歌浏览器中没有任何作用.我的代码的相关部分如下:
var k_layouts = {};
k_layouts.Akan = {88:390,113:603};//keyCode mappings for Akan language
k_layouts.Ga = {120:596,81:400};//keyCode mappings for Ga language
var current_layout = "";
//function that maps the keyCode of a **typed** key to that of the **expected** key
function map_key_code(keycode){
if(k_layouts[current_layout] && k_layouts[current_layout][keycode])
return k_layouts[current_layout][keycode];
return keycode;
}
//function that actually changes the keyCode of a **typed** key to the **expected** value
function handle_keypress(ev){
var ev = ev || window.event;
if(ev.bubbles != null ||!ev.bubbles)
return true;
var target = ev.target || ev.srcElement;
var keyCode = window.event? ev.keyCode: ev.which;
if(keyCode == 0)
return true;
var newKeyCode = map_key_code(keyCode);
if(newKeyCode == keyCode)
return true;
if(target.addEventListener){ //for chrome and firefox
//cancel event
ev.preventDefault();
ev.stopPropagation();
//create new event with the keycode changed
var evt = document.createEvent("KeyboardEvent");
try{//for firefox(works fine)
evt.initKeyEvent("keypress",false,true,document.defaultView,ev.ctrlKey,ev.altKey,ev.shiftKey,ev.metaKey,newKeyCode,newKeyCode);
}
catch(e){// for google chrome(does not work as expected)
evt.initKeyboardEvent("keydown",false,true,document.defaultView,ev.ctrlKey,ev.altKey,ev.shiftKey,ev.metaKey,newKeyCode,newKeyCode);
}
//dispatch new event
target.dispatchEvent(evt);
}
else if(target.attachEvent){// works for IE
ev.keyCode = newKeyCode;
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法实现我在chrome中所做的事情?或者,我的方法中是否有一些我缺少的东西?我会很高兴得到任何帮助和任何想法.
如果您没有普遍支持,则更容易创建新事件,而是取消事件并插入与键入的字符对应的映射字符.
假设用户输入到一个文本ID为"TA",下面将处理键盘输入在所有主要的浏览器是textarea的,映射q到?所有其他字符"X"用于说明目的.
请注意,IE <= 8中存在一些问题,其中包含用于查找与换行符相关的选择的代码,以下代码为简洁起见而无法处理.你可以在这里正确处理我的跨浏览器功能:是否有Internet Explorer批准替代selectionStart和selectionEnd?
var charMap = {
"q": "?"
};
document.getElementById("ta").onkeypress = function(evt) {
var val = this.value;
evt = evt || window.event;
// Ensure we only handle printable keys, excluding enter and space
var charCode = typeof evt.which == "number" ? evt.which : evt.keyCode;
if (charCode && charCode != 13 && charCode != 32) {
var keyChar = String.fromCharCode(charCode);
// Get the mapped character (default to "X" for illustration purposes)
var mappedChar = charMap[keyChar] || "X";
var start, end;
if (typeof this.selectionStart == "number" && typeof this.selectionEnd == "number") {
// Non-IE browsers and IE 9
start = this.selectionStart;
end = this.selectionEnd;
this.value = val.slice(0, start) + mappedChar + val.slice(end);
// Move the caret
this.selectionStart = this.selectionEnd = start + 1;
} else if (document.selection && document.selection.createRange) {
// For IE up to version 8
var selectionRange = document.selection.createRange();
var textInputRange = this.createTextRange();
var precedingRange = this.createTextRange();
var bookmark = selectionRange.getBookmark();
textInputRange.moveToBookmark(bookmark);
precedingRange.setEndPoint("EndToStart", textInputRange);
start = precedingRange.text.length;
end = start + selectionRange.text.length;
this.value = val.slice(0, start) + mappedChar + val.slice(end);
start++;
// Move the caret
textInputRange = this.createTextRange();
textInputRange.collapse(true);
textInputRange.move("character", start - (this.value.slice(0, start).split("\r\n").length - 1));
textInputRange.select();
}
return false;
}
};
Run Code Online (Sandbox Code Playgroud)