可以理解的变化事件

我想在用户使用contenteditable属性编辑div的内容时运行函数。 什么是onchange事件的等价物?

我使用jQuery,因此任何使用jQuery的解决方案都是首选。 谢谢!


我建议将侦听器附加到由editable元素触发的关键事件,但您需要知道在更改内容本身之前触发keydownkeypress事件。 这不会涵盖更改内容的所有可能方法:用户还可以使用剪辑,复制和粘贴从编辑或上下文浏览器菜单,因此您可能也想要处理cut copypaste事件。 此外,用户可以放置文本或其他内容,因此在那里有更多事件(例如mouseup )。 您可能需要轮询元素的内容作为后备。

更新2014年10月29日

HTML5 input事件是长期的答案。 在撰写本文时,它支持当前Mozilla(来自Firefox 14)和WebKit / Blink浏览器但不包含IE的可contenteditable元素。

演示:http://jsfiddle.net/ch6yn/


下面是使用更高效的版本on的所有contenteditables。 它基于这里的最佳答案。

在使用jQuery的CoffeeScript中:

$('body')
    .on 'focus', '[contenteditable]', ->
        $this = $(this)
        $this.data 'before', $this.html()
        return $this
    .on 'blur keyup paste input', '[contenteditable]', ->
        $this = $(this)
        if $this.data('before') isnt $this.html()
            $this.data 'before', $this.html()
            $this.trigger('change')
        return $this

在使用jQuery的JavaScript中:

$('body').on('focus', '[contenteditable]', function() {
    var $this = $(this);
    $this.data('before', $this.html());
    return $this;
}).on('blur keyup paste input', '[contenteditable]', function() {
    var $this = $(this);
    if ($this.data('before') !== $this.html()) {
        $this.data('before', $this.html());
        $this.trigger('change');
    }
    return $this;
});

该项目在这里:https://github.com/balupton/html5edit


考虑使用MutationObserver。 这些观察者被设计为对DOM中的变化作出反应,并作为突变事件的高性能替代。

优点:

  • 发生任何变化时触发,通过听其他答案建议的关键事件难以实现。 例如,所有这些工作都很好:通过上下文菜单拖放,斜体,复制/剪切/粘贴。
  • 设计时考虑到性能。
  • 简单,直接的代码。 理解和调试侦听一个事件的代码而不是监听10个事件的代码会容易得多。
  • Google有一个优秀的突变概要库,这使得使用MutationObservers非常简单。
  • 缺点:

  • 需要最新版本的Firefox(14.0+),Chrome(18+)或IE(11+)。
  • 要了解新的API
  • 关于最佳做法或案例研究的信息还不多
  • 学到更多:

  • 我写了一个小片段来比较使用MutationObserer来处理各种事件。 我使用了balupton的代码,因为他的回答是最有价值的。
  • Mozilla在API上有非常好的一页
  • 看看MutationSummary库
  • 链接地址: http://www.djcxy.com/p/74319.html

    上一篇: contenteditable change events

    下一篇: set Cursor / Caret to index