如何判断一个元素是否是一个Widget? (CKEditor)
How to tell if an element is a Widget? (CKEditor)
根据 CKEditor, initialize widget added with insertElement,我们正在执行 insertElement(),然后使用 initOn() 进行初始化。问题是我们插入的一些元素不应该是小部件,并且 initOn() 使它们成为小部件并且上下文菜单无法正常工作。我无法在 item/element 中找到任何属性来判断某些东西是否 is/is 不是小部件,因此我可以调用 initOn()。
在 Drupal.org 此处 https://www.drupal.org/node/2466297
下游交叉发布
首先 - 你指的是哪个元素?
(注意:在本节中,我假设小部件已正确且完全初始化。)
小部件元素
一个小部件显然可以由许多元素组成。其中之一称为“widget element" and this is the element which you "upcasted”,您稍后可以通过 widget.element
.
访问它
从CKEditor 4.5.0开始会有这样的方法:
Widget.isDomWidgetElement = function( node ) {
return node.type == CKEDITOR.NODE_ELEMENT && node.hasAttribute( 'data-widget' );
};
您当然可以使用此代码来检查给定节点是否为小部件元素。
小部件包装器
第二个重要元素是小部件的包装器。如果 widget 元素被标记为向上转换或 initOn()
is called if the widget element wasn't wrapped yet. You can access this element through the 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()
那样进行所有的数据处理和向上转换。这意味着它应该用于不同的情况 - 当您想要准确插入您拥有的元素时。
例如,您的 table 插件正在构建要插入到编辑器中的 table 结构。你知道 table 是空的,所以你控制它的每一点(其他插件不应该在这里干涉)。同样重要的是,它是 table 的插件决定,而不是例如模板的插件决定。 table 的插件控制 table 功能,而模板插件只使用 tables。所以在这种情况下,当你拥有完全控制权时,你可以使用 editor.insertElement()
。然后你总是知道你插入了什么,什么应该成为一个小部件。
在所有其他情况下,您应该使用editor.insertHtml()
,因此会触发整个数据处理层。由于它的其他功能,如小部件系统、link 插件(将空锚点变成假对象)等,可以准备您插入的数据以完全编辑 table 和集成。
Tl;博士
如果您的插件知道它的作用,它可以使用 editor.insertElement()
,但是因为它知道它的作用,所以它会知道哪个插入的元素必须成为小部件。
如果您的插件不能完全控制这种情况,那么您应该使用 editor.isertHtml()
方法,该方法更加自动化,并且会根据向上转换回调将适当的元素转换为小部件。
根据 CKEditor, initialize widget added with insertElement,我们正在执行 insertElement(),然后使用 initOn() 进行初始化。问题是我们插入的一些元素不应该是小部件,并且 initOn() 使它们成为小部件并且上下文菜单无法正常工作。我无法在 item/element 中找到任何属性来判断某些东西是否 is/is 不是小部件,因此我可以调用 initOn()。
在 Drupal.org 此处 https://www.drupal.org/node/2466297
下游交叉发布首先 - 你指的是哪个元素?
(注意:在本节中,我假设小部件已正确且完全初始化。)
小部件元素
一个小部件显然可以由许多元素组成。其中之一称为“widget element" and this is the element which you "upcasted”,您稍后可以通过 widget.element
.
从CKEditor 4.5.0开始会有这样的方法:
Widget.isDomWidgetElement = function( node ) {
return node.type == CKEDITOR.NODE_ELEMENT && node.hasAttribute( 'data-widget' );
};
您当然可以使用此代码来检查给定节点是否为小部件元素。
小部件包装器
第二个重要元素是小部件的包装器。如果 widget 元素被标记为向上转换或 initOn()
is called if the widget element wasn't wrapped yet. You can access this element through the 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()
那样进行所有的数据处理和向上转换。这意味着它应该用于不同的情况 - 当您想要准确插入您拥有的元素时。
例如,您的 table 插件正在构建要插入到编辑器中的 table 结构。你知道 table 是空的,所以你控制它的每一点(其他插件不应该在这里干涉)。同样重要的是,它是 table 的插件决定,而不是例如模板的插件决定。 table 的插件控制 table 功能,而模板插件只使用 tables。所以在这种情况下,当你拥有完全控制权时,你可以使用 editor.insertElement()
。然后你总是知道你插入了什么,什么应该成为一个小部件。
在所有其他情况下,您应该使用editor.insertHtml()
,因此会触发整个数据处理层。由于它的其他功能,如小部件系统、link 插件(将空锚点变成假对象)等,可以准备您插入的数据以完全编辑 table 和集成。
Tl;博士
如果您的插件知道它的作用,它可以使用 editor.insertElement()
,但是因为它知道它的作用,所以它会知道哪个插入的元素必须成为小部件。
如果您的插件不能完全控制这种情况,那么您应该使用 editor.isertHtml()
方法,该方法更加自动化,并且会根据向上转换回调将适当的元素转换为小部件。