Ckeditor 如何判断元素是否是小部件?(编辑)

Ckeditor 如何判断元素是否是小部件?(编辑),ckeditor,Ckeditor,根据,我们正在执行insertElement(),然后使用initOn()初始化。问题是,我们插入的一些元素不应该是小部件,initOn()使它们成为小部件,上下文菜单不能正常工作。我很难在item/元素中找到任何属性来判断某物是否是小部件,这样我就可以调用initOn() 首先,在Drupal.org的下游交叉发布你指的是哪一个元素? (注意:在本节中,我假设小部件已正确且完全初始化。) 小部件元素 一个小部件显然可以由许多元素组成。其中一个称为“”,这是您“”的元素,您可以稍后通过widge

根据,我们正在执行insertElement(),然后使用initOn()初始化。问题是,我们插入的一些元素不应该是小部件,initOn()使它们成为小部件,上下文菜单不能正常工作。我很难在item/元素中找到任何属性来判断某物是否是小部件,这样我就可以调用initOn()

首先,在Drupal.org的下游交叉发布

你指的是哪一个元素? (注意:在本节中,我假设小部件已正确且完全初始化。)

小部件元素 一个小部件显然可以由许多元素组成。其中一个称为“”,这是您“”的元素,您可以稍后通过
widget.element
访问该元素

自CKEditor 4.5.0以来,将提供以下方法:

Widget.isDomWidgetElement = function( node ) {
    return node.type == CKEDITOR.NODE_ELEMENT && node.hasAttribute( 'data-widget' );
};
Widget.isDomWidgetWrapper = function( node ) {
    return node.type == CKEDITOR.NODE_ELEMENT && node.hasAttribute( 'data-cke-widget-wrapper' );
};
当然,您已经可以使用此代码来检查给定节点是否是小部件元素

小部件包装器 第二个重要元素是小部件的包装器。它是在数据处理期间创建的,如果小部件元素被标记为向上浇铸,或者如果小部件元素尚未包装,则在调用时创建。您可以通过属性访问此元素

自CKEditor 4.5.0以来,将有以下可用方法:

Widget.isDomWidgetElement = function( node ) {
    return node.type == CKEDITOR.NODE_ELEMENT && node.hasAttribute( 'data-widget' );
};
Widget.isDomWidgetWrapper = function( node ) {
    return node.type == CKEDITOR.NODE_ELEMENT && node.hasAttribute( 'data-cke-widget-wrapper' );
};
再说一遍,您已经可以使用此代码了

这里有一个重要提示-因为您在问题中提到了
insertElemet()
。正如我在
编辑器中所解释的那样,insertElement()
不会触发数据处理。因此,插入的元素将按原样插入。这意味着在插入过程中不会创建小部件包装,而是在调用
initOn()
后创建

通过任何元素查找小部件 很多时候,您希望通过您拥有的某个元素(可以位于小部件内部的任何元素)来查找小部件实例。有一个很有用的方法:

什么应该成为小部件?Aka-如何处理
编辑器.insertElement()
? 您提到您使用了
editor.insertElement()
,并且不知道哪些元素应该是小部件。这永远不应该发生
editor.insertElement()
是一种非常低级的方法,它不会像
editor.insertHtml()
那样进行所有的数据处理和向上转换。这意味着它应该在不同的情况下使用-当您想要插入您所拥有的元素时

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

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

Tl;博士 如果你的插件知道它做什么,它可以使用
editor.insertElement()
,但由于它知道它做什么,它将知道插入的元素必须成为小部件

如果你的插件不能完全控制这种情况,那么你应该使用
editor.isertHtml()
方法,这种方法自动化程度更高,可以根据向上投射的回调将适当的元素转换为小部件。

我推荐一个官方的方法。您可能应该为您的小部件定义一个正确的函数(这是一个自定义小部件,不是吗?)。