当我试图在CKEditor的小部件中完全隐藏控件选择(这就是它们的调用方式)时,我自己花了很多时间。不幸的是,我没有好消息。
方案一
首先,有一个mscontrolselect
事件。当我发现它(以及它的名字有ms
前缀的事实)时,我非常高兴,因为根据 MS 的说法,它应该是可以预防的。
但事实证明,它完全不稳定。有时会被解雇,有时不会。它因 IE 版本、DOM 结构、属性、您单击的元素、它是块元素等而异。通常的 MS 废话。但是你可以试试:
function controlselectHandler(evt) {
evt.preventDefault();
}
document.body.addEventListener('mscontrolselect', controlselectHandler);
但是,这将完全阻止选择(如果有效)。因此,您将完全无法选择这些元素。
解决方案2
然后还有第二个选项,更可靠 - 在单击此类元素后将选择移动到其他地方。有几种方法可以实现。在 CKEditor 中,我们正在修复选择mousedown
...并且mouseup
因为(再次)有时它对 IE 来说还不够,它取决于许多条件。您还可以在selectionchange
那里收听事件并修复选择。
然而,同样,我们也在谈论阻止选择此类元素。
解决方案3
因此,第三个选项不是阻止选择,而是阻止resizestart
事件。CKEditor 将此与enableObjectResizing
命令相结合:https : //github.com/ckeditor/ckeditor-dev/blob/a81e759/plugins/wysiwygarea/plugin.js#L211-L218。此解决方案将阻止调整大小,但当然不会隐藏那些丑陋的边框。
解决方案4
正如我所提到的,我在 CKEditor 中解决了这个问题。我们设法使不可编辑元素在可编辑中成为可能,但在浏览器之间具有完全可控和统一的行为。完整的解决方案太复杂了,无法在 StackOverflow 上解释,我们花了几个月的时间来实现它。我们将此功能称为小部件。在这里查看一些演示。如您所见,选择不可编辑元素时没有控件选择。选择仅在mousedown
和之间的短时间内出现mouseup
,但仅在特定情况下出现。除此之外,一切正常,因为它是原生的(尽管它完全是假的)。
在小部件简介和小部件教程中阅读更多信息。