Dav*_*vid 7 javascript cross-browser internet-explorer-9
我有一个带有onkeydown事件处理程序的文本输入,它通过将事件的keyCode从13更改为9来将<Enter>转换为<Tab>.
<input type="text" onkeydown="enterToTab(event);" onchange="changeEvent(this);"
name="" value="" />
<!-- Other inputs exist as created via the DOM, but they are not sibling elements. -->
Run Code Online (Sandbox Code Playgroud)
使用Javascript:
function enterToTab(myEvent) {
if (myEvent.keyCode == 13) {
myEvent.keyCode = 9;
}
}
function changeEvent(myInput) { var test = "hello"; }
Run Code Online (Sandbox Code Playgroud)
在IE8中,这导致onchange事件触发,但在IE9中不会发生这种情况.相反,输入字段保留焦点.我怎么能做到这一点?(它适用于Firefox 3.6和Chrome 10.0.)如果我将文档模式设置为"IE8标准",这甚至可以在浏览器模式IE9中使用.但它不适用于"IE9标准"的文档模式.(我的DocType是XHTML 1.0 Transitional.)
由于它适用于IE7和8,这可能是IE9中的一个错误,将被修复?
请注意:我不能使用input.blur()或手动设置新的焦点,这是我读过的所有其他解决方案的建议.我已经尝试过onkeypress和onkeyup而没有运气.我需要一个通用的解决方案,它会使Web应用程序表现得像我点击<Tab>一样.另外,我没有jQuery,但Dojo 1.5可供我使用.
另请注意:我知道这是"错误的"行为,并且输入应该提交表单.但是,我的客户工作人员最初来自绿屏环境,其中Enter在字段之间移动它们.我们必须保留相同的UI.就是这样.
更新:我发现IE8和IE9之间存在差异.在IE8中,我的myEvent.keyCode保持设置.在IE9中,它没有.我可以更新window.event.keyCode,它会保留,但这不会影响以后发生的事情.唉...有什么想法吗?
Sha*_*kai 15
看起来IE9事件是不可变的.一旦它们被解雇,你就无法改变它们的属性,只需要使用preventDefault()或取消它们.因此,您最好的选择是取消任何"输入"事件并从文本输入重新分配新的DOM事件.
例
function enterToTab(event){
if(event.keyCode == 13){
var keyEvent = document.createEvent("Event");
// This is a lovely method signature
keyEvent.initKeyboardEvent("onkeydown", true, true, window, 9, event.location, "", event.repeat, event.locale);
event.currentTarget.dispatchEvent(keyEvent);
// you may want to prevent default here
}
}
Run Code Online (Sandbox Code Playgroud)
这是关于IE9 DOM事件的MSDN文档:
事件对象 - http://msdn.microsoft.com/en-us/library/ms535863(v=vs.85).aspx
createEvent - http://msdn.microsoft.com/en-us/library/ff975304(v=vs.85).aspx
初始化键盘事件 - http://msdn.microsoft.com/en-us/library/ff975297(v=vs.85).aspx