CKEditor对话框选择框动态填充

2024-02-20

我在对话框中有两个选择框。我想知道是否可以根据第一个框的选择设置第二个选择框的内容。即,如果选择框 1 选择了 x,则选择框 2 的内容为 a、b , c..如果 select box1 选择了 y,则 select box2 内容为 d, e, f.. 这可以实现吗?

Thanks


我猜测您提到的带有两个选择框的对话框是您正在创建的自定义插件的一部分。所以我的答案显示了您可以在作为插件的一部分创建的对话框文件中使用的代码。

选择器一的 onChange 函数使用以下方法创建对选择器二的引用:

dialog.getContentElement( 'general', 'selectorTwo' )

'general' 是包含选择器的对话框面板的 ID。
'selectorTwo' 是第二个选择器的 id。

我修改了 cksource.com 上托管的 SimpleLink 教程的源代码:
创建带有自定义对话框窗口的 CKEditor 插件
http://docs.cksource.com/CKEditor_3.x/Tutorials/SimpleLink_Plugin_Part_1 http://docs.cksource.com/CKEditor_3.x/Tutorials/SimpleLink_Plugin_Part_1

在此处下载 SimpleLink 源代码:
http://docs.cksource.com/images/a/a8/SimpleLink.zip http://docs.cksource.com/images/a/a8/SimpleLink.zip

解压缩并将 simpleLink 文件夹添加到您的 ckeditor/plugins 目录中。

通过将 simpleLink 插件添加到您的 extraplugins 列表来更新您的配置文件:
config.extraPlugins = 'onchange,insertsnippet,resconfinearea,resiframe,simpleLink',

或者当您执行 CKEDITOR.replace 时使用:
extraPlugins : 'onchange,insertsnippet,resconfinearea,resiframe,simpleLink',

还将按钮添加到工具栏 - 'SimpleLink'

您将将此消息底部的代码片段插入到 ckeditor/plugins/simpleLink/plugin.js 文件中。

为了使插入点易于定位,代码片段的前十二行与 simpleLink/plugin.js 文件的行 ( 111 - 122 ) 重叠。

插入代码片段后,打开 ckeditor/_source/plugins/forms/dialogs/select.js。 从 select.js 文件顶部复制以下三个函数,并将它们添加到 simpleLink/plugin.js 文件顶部:
添加选项()
删除所有选项()
获取选择()


打开使用 CKEditor 的页面,然后单击您添加的 SimpleLink 按钮,您将在对话框窗口的底部看到选择器一和二。当您更改选择器一时,选择器二也会更新。您应该能够修改代码以适合您的应用程序。

这些页面有一些有用的信息,您在查看我发布的代码时可以参考:

创建带有自定义对话框窗口的 CKEditor 插件
http://docs.cksource.com/CKEditor_3.x/Tutorials/SimpleLink_Plugin_Part_1 http://docs.cksource.com/CKEditor_3.x/Tutorials/SimpleLink_Plugin_Part_1

类 CKEDITOR.dialog
http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.dialog.html http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.dialog.html

类 CKEDITOR.dialog.definition
http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.dialog.definition.html http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.dialog.definition.html

以下是要插入 ckeditor/plugins/simpleLink/plugin.js 文件中的代码片段。
只需选择行 ( 111 - 122 ) 并将其粘贴到:

{
  type : 'checkbox',
  id : 'newPage',
  label : 'Opens in a new page',
  // Default value.
  // http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.ui.dialog.checkbox.html#constructor
  'default' : true,
  commit : function( data )
  {
    data.newPage = this.getValue();
  }
},
{
  type : 'select',
  id : 'selectorOne',
  label : 'Selector One',
  items :
  [
    [ '<none>', '' ],
    [ 'Set 1', 1],
    [ 'Set 2', 2 ],
    [ 'Set 3', 3 ]
  ],
  onChange : function()
  {
    var dialog = this.getDialog(),
      values = dialog.getContentElement( 'general', 'selectorTwo' ), // 'general' is the id of the dialog panel.
      selectedSet = parseInt(this.getValue());

    switch(selectedSet)
    {
    case 1:
      optionsNames = new Array("Set One <none>","Set One A","Set One B","Set One C"),
      optionsValues = new Array("","setOneA","setOneB","setOneC");
      break;
    case 2:
      optionsNames = new Array("Set Two <none>","Set Two A","Set Two B","Set Two C"),
      optionsValues = new Array("","setTwoA","setTwoB","setTwoC");
      break;
    case 3:
      optionsNames = new Array("Set Three <none>","Set Three A","Set Three B","Set Three C"),
      optionsValues = new Array("","setThreeA","setThreeB","setThreeC");
      break;
    default:
      optionsNames = new Array("<none>"),
      optionsValues = new Array("");
    }

    removeAllOptions( values );

    for ( var i = 0 ; i < optionsNames.length ; i++ )
    {
      var oOption = addOption( values, optionsNames[ i ],
        optionsValues[ i ], dialog.getParentEditor().document );
      if ( i == 0 )
      {
        oOption.setAttribute( 'selected', 'selected' );
        oOption.selected = true;
      }
    }
  },
  commit : function( data )
  {
    data.selectorOne = this.getValue();
  }
},
{
  type : 'select',
  id : 'selectorTwo',
  label : 'Selector Two',
  items :
  [
    [ '<none>', '' ]
  ],
  commit : function( data )
  {
    data.selectorTwo = this.getValue();
  }
},

希望这能解决问题,如果有不清楚的地方请告诉我,
Joe


嗨奥吉姆克,

很高兴知道您有机会尝试这些代码并且它很有帮助,这真是太好了。

关于从plugins/forms/dialogs/select.js 文件复制的函数的其他问题的答案。

1)打开对话框时不应调用这三个函数。在我最初的答案中概述的创建的示例中没有发生这种情况。您可能需要在代码中搜索这三个函数名称,以查看它们是否在 除了 selectOne 定义中包含的 ( onChange : function() ) 之外的其他位置调用。

2)我分解了(removeAllOptions()函数)并将其包含在下面。它有类似的代码行。对于您询问的线路:

if (combo && oOption && oOption.getName() == 'option'),

它表示 If (组合存在) AND (oOption 存在) AND (oOption.getName() == 'option') If 语句为 true。
我所说的“存在”,是指它不为 null,也不是计算结果为 false 的值(0 或二进制 Not true)。

3) 是的,在 addOption() 函数的这个特定用法中,没有使用索引变量。您可以删除两个 if 语句,只保留每个 else 子句中的代码语句。

4) obj.getInputElement() 返回 DOM 元素对象,但 obj.getInputElement().$ 只返回 DOM 对象的 HTML 标签。尝试向 getSelect() 函数添加一些 console.log 调用,您将看到差异:

if ( obj && obj.domId && obj.getInputElement().$ ) {        // Dialog element.
  console.log(obj.getInputElement().$); // ADDED CONSOLE.LOG
  console.log(obj.getInputElement()); // ADDED CONSOLE.LOG

返回 obj.getInputElement();

以下是removeAllOptions()函数的流程: 在selectorOne 的onChange() 函数中,我们创建一个代表selectorTwo 的变量“values”。 值 =dialog.getContentElement( '一般', 'selectorTwo' )

在根据selectorOne中选择的选项使用新选项值填充selectorTwo之前,我们从selectorTwo中删除所有现有选项: 删除所有选项(值); // 值代表selectorTwo

在removeAllOptions()函数中,变量“combo”被赋予在函数调用中传递的值,因此: 组合=值=选择器二。

removeAllOptions() 函数调用 getSelect() 函数并将“combo”变量作为参数发送给它。 “combo”变量将被分配 getSelect() 函数返回的值。

在 getSelect() 函数中,变量“obj”被赋予在函数调用中传递的值,因此: obj = 组合 = 值 = 选择器二。

getSelect() 函数可以返回三个值之一:
A) if ( obj && obj.domId && obj.getInputElement().$ )
如果 obj 为 true 并且 obj.domId 为 true 并且 obj.getInputElement().$ 返回 false 或 null 以外的任何值,则它将返回 obj.getInputElement() 的值。
因此,如果 obj 变量存在并且设置了 obj 的 domId 属性,它将在 obj 上运行 getInputElement() 函数并检查 DOM 属性 ($) 是否已设置。 getInputElement() 使用domId 返回与selectorTwo 元素对应的DOM 元素。

B) 如果 A 的三个部分不全部为 true,则 getSelect() 函数会尝试:
if ( obj && obj.$ )
因此,如果 obj 变量存在并且它已经是 DOM 元素 ($),它只会发送回 obj。

C) 如果步骤 B 失败,则 getSelect() 返回 false,并且选择器Two 没有任何要删除的选项元素。

现在回到removeAllOptions()函数,看看如果getSelect()的步骤A或B返回一些东西会发生什么。 在这两种情况下,“combo”变量都将是带有 DOM 元素 (combo.$) 设置的 selectedTwo 对象。 它对 selecterTwo 内的选项元素数组运行 while 循环并删除它们。 它获取第一个选项元素“getChild( 0 )”并将其删除,位于 Child( 1 ) 位置的选项元素移动到位置 Child( 0 ) 并继续循环,直到没有剩余选项元素为止。

getInputElement() 函数位于 ckeditor_source\plugins\dialogui\plugin.js 的第 ( 1085 ) 行
getInputElement() 函数调用 getElement() 函数。
getElement() 函数位于 ckeditor_source\plugins\dialog\plugin.js 的第 ( 2560 ) 行

function removeAllOptions( combo )
{
  combo = getSelect( combo );
  while ( combo.getChild( 0 ) && combo.getChild( 0 ).remove() )
  { /*jsl:pass*/ }
}

function getSelect( obj )
{
  if ( obj && obj.domId && obj.getInputElement().$ )        // Dialog element.
    return  obj.getInputElement();
  else if ( obj && obj.$ )
    return obj;
  return false;
}

祝你好运, 乔

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CKEditor对话框选择框动态填充 的相关文章