【发布时间】:2011-08-02 07:11:14
【问题描述】:
我正在尝试模拟 contentEditable 元素的(不存在的)更改事件(但我猜对于输入元素来说这是同样的问题)。不幸的是,当用户选择一些文本并从浏览器的上下文菜单中选择“删除”时,我不知道如何获取事件。
有什么建议吗?
【问题讨论】:
标签: javascript javascript-events
我正在尝试模拟 contentEditable 元素的(不存在的)更改事件(但我猜对于输入元素来说这是同样的问题)。不幸的是,当用户选择一些文本并从浏览器的上下文菜单中选择“删除”时,我不知道如何获取事件。
有什么建议吗?
【问题讨论】:
标签: javascript javascript-events
修订后的答案,2012 年 6 月 8 日
你想要的是HTML5 input event。然而,这目前仅适用于 contenteditable 元素的 WebKit,但希望也能在其他浏览器中实现:Firefox 14 will apparently have it。我是already implemented in all major browsers for text inputs and textareas。
演示:http://jsfiddle.net/timdown/5e5E5/1/
HTML:
<div id="test" contenteditable="true">...</div>
JS:
var editableDiv = document.getElementById("test");
editableDiv.addEventListener("input", function(evt) {
alert("Editable content changed");
}, false);
对于跨浏览器解决方案,您可以使用一些将被触发的各种DOM mutation events(另请参阅MDN)。我建议DOMCharacterDataModified 和DOMNodeRemoved 可能是用于此目的的有用的。
请注意,这些事件在 IE 这些事件已弃用,取而代之的是 DOM4 Mutation Observers。然而,在撰写本文时(2012 年 6 月),只有最近的 WebKit 浏览器支持这一点,因此在中短期内,我们至少会使用突变事件作为后备。
editableDiv.addEventListener("DOMCharacterDataModified", function(evt) {
if (evt.newValue.length < evt.prevValue.length) {
alert("Characters deleted");
}
}, false);
【讨论】:
contenteditable 元素上的 input 事件。别的什么都没有。见jsfiddle.net/upbNW
input 事件正是 i 所追求的(OP 考虑到了contenteditable),所以这对我来说真的很成功。您的承诺和愿意提供帮助(以及彻底的研究)让我想起了 stackoverflow 的全部内容。非常感谢。