Per CKEditor, initialize widget added with insertElement,我们正在执行insertElement(),然后使用initOn()进行初始化。问题是我们插入的一些元素不应该是小部件,initOn()使它们成为小部件,上下文菜单不能正常工作。我在找到item / element中的任何属性时都无法判断某些东西是否是一个小部件,所以我可以调用initOn()。
在Drupal.org上向下游交叉发布https://www.drupal.org/node/2466297
答案 0 :(得分:2)
(注意:在本节中,我假设小部件已正确完全初始化。)
小部件显然可以包含许多元素。其中一个称为“widget element”,这是您“upcasted”的元素,您可以稍后通过widget.element
访问该元素。
从CKEditor 4.5.0开始,会有这样的方法:
Widget.isDomWidgetElement = function( node ) {
return node.type == CKEDITOR.NODE_ELEMENT && node.hasAttribute( 'data-widget' );
};
您当然可以使用此代码来检查给定节点是否为小部件元素。
第二个重要元素是小部件的包装器。它是在数据处理期间创建的,如果小部件元素被标记为要上传,或者如果小部件元素尚未被包装则调用initOn()
。您可以通过widget.wrapper
属性访问此元素。
从CKEditor 4.5.0开始,将有以下方法可用:
Widget.isDomWidgetWrapper = function( node ) {
return node.type == CKEDITOR.NODE_ELEMENT && node.hasAttribute( 'data-cke-widget-wrapper' );
};
再次 - 您已经可以使用此代码了。
此处有重要提示 - 因为您在提问时提到了insertElemet()
。正如我在CKEditor, initialize widget added with insertElement editor#insertElement()
中解释的那样,不会触发数据处理。因此,插入的元素按原样插入。这意味着在插入期间不会创建窗口小部件包装器,并且在您调用initOn()
时将创建它。
很多时候,您希望通过某个元素(可以在窗口小部件中的任何元素)找到窗口小部件实例。有一个有用的方法:getByElement()
。
editor.insertElement()
?您提到您使用editor.insertElement()
并且您不知道哪些元素应该是小部件。这绝不应该发生。 editor.insertElement()
是一种非常低级别的方法,它不会执行editor.insertHtml()
所做的所有数据处理和上传魔术。这意味着它应该在不同的情况下使用 - 当你想要准确插入你拥有的元素时。
例如,您的表插件正在构建一个要插入编辑器的表结构。你知道表是空的,所以你控制它的每一点(其他插件不应该干扰这里)。同样重要的是它是表的插件决定,而不是例如模板的插件决定。表的插件控制表功能,而模板插件仅使用表。因此,在这种情况下,当您拥有完全控制权时,可以使用editor.insertElement()
。然后你总是知道你插入了什么以及应该成为一个小部件。
在所有其他场景中,您应该使用editor.insertHtml()
,以便触发整个数据处理层。由于它的其他功能,如小部件系统,链接插件(将空锚定为虚假对象)等,可以准备您插入的数据,使其完全可编辑和集成。
如果您的插件知道它的作用,它可以使用editor.insertElement()
,但由于它知道它的作用,它将知道哪个插入的元素必须成为一个小部件。
如果您的插件无法完全控制情况,那么您应该使用更加自动化的editor.isertHtml()
方法,并根据最高回调将适当的元素转换为小部件。