如何在内容可编辑的 div 内的嵌套跨度上触发事件?

Posted

技术标签:

【中文标题】如何在内容可编辑的 div 内的嵌套跨度上触发事件?【英文标题】:How can I trigger an event on a nested span inside a content-editable div? 【发布时间】:2021-06-08 00:33:00 【问题描述】:

我有一个内容可编辑的 <div> 和动态添加的 <span> 元素,当用户通过单击它或使用键盘或者如果里面的文字被改变了。

我已经在使用点击事件,但我无法弄清楚如何处理键盘部分。有什么建议或想法吗?

我尝试过使用“焦点”和“更改”事件,但它们并没有成功。我还应该提到父元素附加了其他事件侦听器,所以我不确定这是否会导致问题。

<div contenteditable="true" id="compose-box">this is some text <span class="myClass" data-index="1">special text</span>&nbsp; more text</div>
    
this.textbox = document.getElementById("compose-box");

this.textbox.addEventListener("click", (e) => 
      if (e.target && e.target.classList.contains("myClass")) 
        this.updateText(e); //Function I need to call
      
);

【问题讨论】:

你考虑过mutationObserver吗? 感谢@RandyCasburn。我以前没有使用过 mutationObserver API,但听起来它可能适合我的目的。我可以将它用于类而不是元素的 ID 吗?这将允许我检查任何这些跨度元素的变化。 当然 - 检查这个接近你想要实现的例子。它监视一个节点,它是整个树的添加和删除。 developer.mozilla.org/en-US/docs/Web/API/MutationObserver/… 【参考方案1】:

我想出了一种使用 Selection 对象的方法。我创建了一个新变量来获取插入符号在内容可编辑 div 中的位置,并使用它来检查 anchorNode 属性是否包含我的目标类。

const sel = window.getSelection();
this.textbox.addEventListener("keydown", (e) => 
      if(sel["anchorNode"] && sel["anchorNode"].parentNode.classList.contains("myClass")
      ) 
        // call method
      
    );

【讨论】:

以上是关于如何在内容可编辑的 div 内的嵌套跨度上触发事件?的主要内容,如果未能解决你的问题,请参考以下文章

在 html div 上粘贴事件,没有可编辑的内容

点击同时触发两个onclick事件[重复]

js 如何实现将div内的内容放到剪切板?

自动删除特定 HTML 元素时如何触发事件?

外部 jquery 可拖动/可调整大小的 div 不允许我选择内部跨度的文本

如何避免jQuery UI可拖动也触发点击事件[重复]