如何判断元素是否为Widget? (CKEditor的)

时间:2015-04-14 20:34:21

标签: ckeditor

Per CKEditor, initialize widget added with insertElement,我们正在执行insertElement(),然后使用initOn()进行初始化。问题是我们插入的一些元素不应该是小部件,initOn()使它们成为小部件,上下文菜单不能正常工作。我在找到item / element中的任何属性时都无法判断某些东西是否是一个小部件,所以我可以调用initOn()。

在Drupal.org上向下游交叉发布https://www.drupal.org/node/2466297

1 个答案:

答案 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()

什么应该成为一个小部件? Aka - 如何处理editor.insertElement()

您提到您使用editor.insertElement()并且您不知道哪些元素应该是小部件。这绝不应该发生。 editor.insertElement()是一种非常低级别的方法,它不会执行editor.insertHtml()所做的所有数据处理和上传魔术。这意味着它应该在不同的情况下使用 - 当你想要准确插入你拥有的元素时。

例如,您的表插件正在构建一个要插入编辑器的表结构。你知道表是空的,所以你控制它的每一点(其他插件不应该干扰这里)。同样重要的是它是表的插件决定,而不是例如模板的插件决定。表的插件控制表功能,而模板插件仅使用表。因此,在这种情况下,当您拥有完全控制权时,可以使用editor.insertElement()。然后你总是知道你插入了什么以及应该成为一个小部件。

在所有其他场景中,您应该使用editor.insertHtml(),以便触发整个数据处理层。由于它的其他功能,如小部件系统,链接插件(将空锚定为虚假对象)等,可以准备您插入的数据,使其完全可编辑和集成。

铊组成; dr

如果您的插件知道它的作用,它可以使用editor.insertElement(),但由于它知道它的作用,它将知道哪个插入的元素必须成为一个小部件。

如果您的插件无法完全控制情况,那么您应该使用更加自动化的editor.isertHtml()方法,并根据最高回调将适当的元素转换为小部件。

相关问题