使用javascript字符串方法解析从ckeditor返回的字符串

使用javascript字符串方法解析从ckeditor返回的字符串,javascript,string,ckeditor,text-parsing,Javascript,String,Ckeditor,Text Parsing,我试图从ckeditor中获取某个区域的数据。为了做到这一点,我使用以下代码 function get_body_html(){ var email = CKEDITOR.instances['message'].getData(); var before_body = header_to + to + to_subject + subject + subject_body; var s_index = email.indexOf(before_body)+before_

我试图从ckeditor中获取某个区域的数据。为了做到这一点,我使用以下代码

function get_body_html(){
    var email = CKEDITOR.instances['message'].getData();
    var before_body = header_to + to + to_subject + subject + subject_body;
    var s_index = email.indexOf(before_body)+before_body.length;
    var e_index = email.indexOf(body_footer);
    return email.substring(s_index,e_index);
}
由于某些原因,当我在页面加载时这样做是有效的

CKEDITOR.instances.message.setData(header_to + to + to_subject+ 
subject + subject_body + body_text + body_footer);
get_body_html();
它工作正常,给我的字符串与body_文本中包含的字符串相同

但当我这么做的时候

body_text = get_body_html();
CKEDITOR.instances.message.setData(header_to + to + to_subject + subject + 
subject_body + body_text + body_footer);

在onclick函数中,它以某种方式获取了错误的索引。有时它找不到字符串并返回-1,有时它只是得到一个奇怪的索引,没有意义。只有当我的代码以不同的方式处理问题时,这些索引变化才会发生。因此,如果是错误的索引,如-5和2,那么在我更改代码之前,这些索引将继续是错误的。

关于
editor.setData
,您应该知道两个事实

  • 在某些情况下,它是异步的(取决于编辑器的类型)。这就是它也接受回调的原因。因此,在
    setData()
    之后执行的任何代码都应该在该回调中执行
  • 在编辑器准备就绪之前,它从来都不是异步的。在此期间(在编辑器初始化和
    instancerady
    事件之间),它以不同的模式工作-它只是缓存设置的值,并在
    getData()
    上精确返回该值
  • 因此,正如我在PageLoad上看到的,您同步调用了
    setData()
    getData()
    ——您的函数可以工作,因为您得到了期望得到的值

    但是,当您尝试
    getData()
    当编辑器已经准备好时,您会得到由CKEditor解析、修复、处理的HTML,并且可能会以不同的格式。我想您的
    indexOf()
    检查不足以处理此问题。您必须重新考虑您的功能-例如,regexp可以提供帮助

    删除
    htmlwriter
    plugin也会有所帮助,该插件的HTML格式可能会使您更难使用它。例如:

    config.removePlugins = 'htmlwriter';
    

    我能让它工作。所以htmlwriter是问题之一,因为它必须通过HTML标记在两者之间添加空格。我发现的另一个问题是,它去掉了某些样式属性中的一些分号。总的来说,CKEditor对源代码进行了大量格式化,这使得正确索引非常困难,但这几乎是一个反复试验的过程。我最终使用了搜索JavaScript方法来搜索可以接受正则表达式的字符串,但我使用的方法与使用indexOf的方法相同,因此我不知道这是否有区别。

    您是否应该调用
    get\u body\u html()
    在像以前一样设置消息数据之后?我试图在使用setData()覆盖正文之前获取正文html,因此切换这两种格式将无法达到目的。我之前设置数据的那个只是一个测试,看看我的逻辑是否在第一时间起作用。那么问题是身体有什么数据。尝试输出/记录您的电子邮件变量,并检查它是否包含
    正文前
    正文页脚
    如果不包含,那么您可能应该使用replace而不是substring,例如:
    email.replace(正文前),
    从编辑器记录/输出数据时,正文具有正确的数据。问题是java中的indexOf方法似乎找不到它,即使它在那里。好吧,你可以发布一些示例数据来尝试对其进行排序吗?应该注意的是,即使关闭了htmlwriter,它也会去掉分号。