我想在用户编辑div
withcontenteditable
属性的内容时运行一个函数。onchange
事件的等价物是什么?
我正在使用 jQuery,所以任何使用 jQuery 的解决方案都是首选。谢谢!
我想在用户编辑div
withcontenteditable
属性的内容时运行一个函数。onchange
事件的等价物是什么?
我正在使用 jQuery,所以任何使用 jQuery 的解决方案都是首选。谢谢!
我建议将侦听器附加到由可编辑元素触发的关键事件,但您需要注意keydown
和keypress
事件是在内容本身更改之前触发的。这不会涵盖更改内容的所有可能方法:用户还可以使用编辑或上下文浏览器菜单中的剪切、复制和粘贴,因此您可能还想处理cut
copy
和paste
事件。此外,用户可以删除文本或其他内容,因此那里有更多事件(mouseup
例如)。您可能希望轮询元素的内容作为后备。
2014 年 10 月 29 日更新
在HTML5input
事件是在长期的答案。在撰写本文时,它支持contenteditable
当前 Mozilla(来自 Firefox 14)和 WebKit/Blink 浏览器中的元素,但不支持 IE。
演示:
document.getElementById("editor").addEventListener("input", function() {
console.log("input event fired");
}, false);
<div contenteditable="true" id="editor">Please type something in here</div>
这是一个更有效的版本,on
用于所有 contenteditables。它基于此处的最佳答案。
$('body').on('focus', '[contenteditable]', function() {
const $this = $(this);
$this.data('before', $this.html());
}).on('blur keyup paste input', '[contenteditable]', function() {
const $this = $(this);
if ($this.data('before') !== $this.html()) {
$this.data('before', $this.html());
$this.trigger('change');
}
});
该项目在这里:https : //github.com/balupton/html5edit
考虑使用MutationObserver。这些观察者旨在对 DOM 中的变化做出react,并作为Mutation Events的高性能替代品。
优点:
缺点:
学到更多:
非 jQuery快速而肮脏的答案:
function setChangeListener (div, listener) {
div.addEventListener("blur", listener);
div.addEventListener("keyup", listener);
div.addEventListener("paste", listener);
div.addEventListener("copy", listener);
div.addEventListener("cut", listener);
div.addEventListener("delete", listener);
div.addEventListener("mouseup", listener);
}
var div = document.querySelector("someDiv");
setChangeListener(div, function(event){
console.log(event);
});
我已经像这样修改了 lawwansin 的答案,这对我有用。我使用 keyup 事件而不是 keypress ,这很好用。
$('#editor').on('focus', function() {
before = $(this).html();
}).on('blur keyup paste', function() {
if (before != $(this).html()) { $(this).trigger('change'); }
});
$('#editor').on('change', function() {alert('changed')});