IE9 - 添加和删除 DOM 元素会破坏父 keydown 事件

Posted

技术标签:

【中文标题】IE9 - 添加和删除 DOM 元素会破坏父 keydown 事件【英文标题】:IE9 - adding and removing DOM element breaks parent keydown event 【发布时间】:2012-08-29 14:58:01 【问题描述】:

我们正在构建一个相当复杂的 UI 控件(实际上是一个数据网格),并在用户滚动网格时从 DOM 树中动态添加/删除节点(并尝试以尽可能高的性能进行操作)。

我们在 IE9 和 IE10 中注意到,当我们从节点添加/删除子元素时,它会停止触发其 keydown 事件:

看这个小提琴: http://jsfiddle.net/T2Lt8/13/

您可以看到,在两个左右的 keydown 事件之后,父级停止触发。但是,如果我在 keydown 处理程序中取消注释 $(child).focus() 行 - 一切正常。

发生了什么,这是解决此问题的最佳方法吗?

【问题讨论】:

【参考方案1】:

在玩了一会儿例子之后,我发现了以下几点:

    如果您添加 child.style.border = "1px solid red";,您会看到创建了第二个孩子,因为第一个孩子没有被删除。这是因为有whitespace in the parent。

    孩子比父母大。如果您将父级设置为 150 像素 x 150 像素并且只单击父级而不是子级,则关键事件会正确且重复地工作。看来 IE9 确实保留了绑定。

    如果孩子是像textarea 这样“不透明”的东西,它似乎会使 Firefox 的行为类似于我们在 IE9 中看到的行为。

【讨论】:

以上是关于IE9 - 添加和删除 DOM 元素会破坏父 keydown 事件的主要内容,如果未能解决你的问题,请参考以下文章

js之DOM元素遍历

DOM操作基础

jQuery_2操作dom元素

IE9 未删除 :hover 样式更改 DOM

原生js操作DOM元素的一些使用

销毁父组件时,UIkit 模态元素不会从 DOM 中删除(Vue.js)