【问题标题】:Get delete event of edited element获取已编辑元素的删除事件
【发布时间】:2011-08-02 07:11:14
【问题描述】:

我正在尝试模拟 contentEditable 元素的(不存在的)更改事件(但我猜对于输入元素来说这是同样的问题)。不幸的是,当用户选择一些文本并从浏览器的上下文菜单中选择“删除”时,我不知道如何获取事件。

有什么建议吗?

【问题讨论】:

    标签: javascript javascript-events


    【解决方案1】:

    修订后的答案,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)。我建议DOMCharacterDataModifiedDOMNodeRemoved 可能是用于此目的的有用的。

    请注意,这些事件在 IE 这些事件已弃用,取而代之的是 DOM4 Mutation Observers。然而,在撰写本文时(2012 年 6 月),只有最近的 WebKit 浏览器支持这一点,因此在中短期内,我们至少会使用突变事件作为后备。

    editableDiv.addEventListener("DOMCharacterDataModified", function(evt) {
        if (evt.newValue.length < evt.prevValue.length) {
            alert("Characters deleted");
        }
    }, false);
    

    【讨论】:

    • @EliranMalka:我一直感兴趣地关注突变观察者规范。但是,当我写这个答案时它还没有得到任何结果,并且 DOM 突变事件在中短期内仍然是唯一可行的选择,因为只有最近的 WebKit 和 Firefox 支持新的突变观察器。我已经更新了我的答案以反映这一点。
    • 是的,也许更新以添加免责声明是一个不错的选择。这是一个很好的答案(因此我投了赞成票),因为它似乎是目前解决这个问题的唯一方法。我正在寻找一个更好的解决方案,希望找到一个足够强大并得到广泛支持的解决方案。 (此通信源自一条已删除的评论,要求避免使用 DOM 突变事件).
    • @EliranMalka:我认为没有更好的选择,尽管 WebKit 支持 contenteditable 元素上的 input 事件。别的什么都没有。见jsfiddle.net/upbNW
    • @EliranMalka:感谢您引起我的注意,并为我最初的防御语气感到抱歉。
    • 顺便说一句,input 事件正是 i 所追求的(OP 考虑到了contenteditable),所以这对我来说真的很成功。您的承诺和愿意提供帮助(以及彻底的研究)让我想起了 stackoverflow 的全部内容。非常感谢。
    猜你喜欢
    • 2012-01-22
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多