Javascript CKeditor:如何在保存时平衡HTML标记?(它们在负载上保持平衡)

Javascript CKeditor:如何在保存时平衡HTML标记?(它们在负载上保持平衡),javascript,ckeditor,ckeditor4.x,Javascript,Ckeditor,Ckeditor4.x,我曾经遇到过这样的问题:有人可能会将其他地方的代码粘贴到CKeditor中,留下打开的HTML标记,或者包含不应该存在的关闭标记 我注意到,当视图从源代码更改为HTML时,标记是平衡的。所以这是在加载时发生的,在切换源代码时发生的,而不是在保存时发生的 要查看此操作,请查看源代码,输入一些带有打开标记但没有匹配关闭标记的HTML,查看HTML版本,查看源代码-它是固定的 即使这意味着快速切换到源代码,然后切换到HTML,如何在保存时触发此标记平衡?我认为最好的方法是在用户切换到源代码模式时禁用提

我曾经遇到过这样的问题:有人可能会将其他地方的代码粘贴到CKeditor中,留下打开的HTML标记,或者包含不应该存在的关闭标记

我注意到,当视图从源代码更改为HTML时,标记是平衡的。所以这是在加载时发生的,在切换源代码时发生的,而不是在保存时发生的

要查看此操作,请查看源代码,输入一些带有打开标记但没有匹配关闭标记的HTML,查看HTML版本,查看源代码-它是固定的


即使这意味着快速切换到源代码,然后切换到HTML,如何在保存时触发此标记平衡?

我认为最好的方法是在用户切换到源代码模式时禁用提交按钮。这样,您将避免在向服务器发送数据之前在模式之间闪烁。请看这个非常基本的代码笔,了解它是如何工作的

var editor = CKEDITOR.replace( 'editor1', {

} );

editor.on('instanceReady', function( event ){
  var submitBut = document.getElementById('my-submit'),
      submitWarn = document.getElementById('submit-warn');

  editor.on( 'mode', function( evt ){
    if( editor.mode == 'source') {
      submitBut.disabled = true;
      submitWarn.style.display = 'inline';
    } else{
      submitBut.disabled = false;
      submitWarn.style.display = 'none';
    }          
  });
})

我不确定这是不是正确的方法。当我检查
Source
按钮时,它调用了一个函数
CKEDITOR.tools.callFunction(52,this)

由于从HTML标记切换到预览模式,编辑器将自动关闭标记,在保存之前,您可以切换到预览模式以强制关闭打开的标记

var editor = CKEDITOR.replace( 'editor1', {} );

var isSourceOn = false;

function saveMyEditor() {
  if(isSourceOn)
    CKEDITOR.tools.callFunction(52, this);
}

editor.on('instanceReady', function( event ){    
  editor.on( 'mode', function( evt ){
    if(editor.mode != 'source') {
      isSourceOn = false;
    } else {
      isSourceOn = true;
    }
  });
});

编辑: 你能试试这个吗

var editor = CKEDITOR.replace( 'editor1', {} );
editor.commands.source.exec();

它正在正确切换源按钮。因此,在保存之前,您可以切换到实时预览,然后保存。所以它会关闭标签。

但我不想禁用源模式。我需要在两种模式下都启用“保存”按钮。有没有办法切换回预览模式?对不起,我的意思是禁用提交按钮而不是源按钮。我已经编辑了我的评论。请考虑我所写的,因为当HTML可能无效时,允许在源模式中保存是没有意义的。保存前在模式之间闪烁也比在源模式下禁用提交按钮更糟糕。请至少考虑一下。禁用保存按钮不符合我的要求。CKEditor的任何用于解析最终文本的HTML解析器函数?我试过了,但不起作用。不,你需要处于所见即所得模式,这些功能才能工作。他们需要一个在源代码模式下不可用的文档(只有纯文本区)。52在这里指的是什么?“此”是否具有当前窗口的范围?为什么我们需要窗口的当前引用?我在devtools中检查了源代码,源按钮的点击是这样绑定的。52只是它存储的函数的数组索引。在那个页面中,CKEDITOR是全局范围的,我想这就是为什么他们可以使用“this”。无论如何,onclick函数只接受一个参数(参见图->),因此我认为我们不需要在这里传递'this'。在我的代码中,它有索引3。所以索引取决于CKEditor实例或CKEditor版本?看起来它取决于该页面和按钮中实例的数量。如果可能的话,试着联系他们的支持,或者在GitHub中,如何模拟源代码按钮的点击。在普通js中,var link=document.querySelector(“#cke_33”);link.click()还会单击查询的元素。因此,您可以选择锚定标记并调用click函数,同样,我们需要知道源按钮的id。