如果文本包含编码字符,则删除 span 标记问题



我希望删除在浏览器内编辑器中包装文本块的 span 标签,但如果文本包含任何类型的特殊字符(如换行符''(或编码字符 (如 、• 等(时遇到麻烦。

这是我的代码,适用于没有编码字符的句子

function fnIgnoreThisErr(evtTargID){    
    // use the passed parameter 
    var errIdx = evtTargID.substr(evtTargID.indexOf('err-') + 4);  
    // buld span tag for finding
    var errSpan = "span.err-" + evtTargID;
    // declare the editor
    var editor = CKEDITOR.instances.editor1;
    // get text from the editor
    var edata = editor.getData();  
    // find the specific span in the text
    var spanData = $( edata ).find(errSpan); 
    // get outerHTML and innerText to use for replacement
    var myCurrText = spanData[0].outerHTML;
    var myNewText = spanData[0].innerHTML;
    // standard js replace works if no special chars
    var replace_text = edata.replace(myCurrText, myNewText);  //
    // sets the data back in CKEditor
    editor.setData(replace_text);
}

下面是带有 span 标记的文本示例myCurrText:

<span class="vts-warn vts-ParseFailure err-2">Approval of ICA<br />n&nbsp; GAMA requested further clarification of proposed &sect;&sect;25.1739 (now &sect;25.1729) and 25.1805(b) (now &sect;26.11(b)) requirements that ICA prepared in accordance with paragraph H.</span>

并删除了跨度标签。

Approval of ICA<br />n&nbsp; GAMA requested further clarification of proposed &sect;&sect;25.1739 (now &sect;25.1729) and 25.1805(b) (now &sect;26.11(b)) requirements that ICA prepared in accordance with paragraph H.

它适用于没有任何编码字符的普通句子。我可以切换到jQuery,但也无法获得替换工作。

我在这里错过了什么?

我想通了。html实体与浏览器和我的JS呈现/解释它们的方式之间似乎存在差异。
即 span 的 outerHTML 不是 edata 中文本的字符对字符匹配。

所以我只获取跨度开始和跨度节点长度的 indexOf 值。但是,由于提到的差异,此长度可能包含其他字符。所以,接下来,我找到了"标签的确切位置。从那里,我构建一个与需要替换的文本完全匹配的字符串变量。

这是我的最终代码。(为了清楚起见,我把它保留了长篇(

function fnIgnoreThisErr(evtTargID){    
    // use the passed parameter 
    var errIdx = evtTargID.substr(evtTargID.indexOf('err-') + 4);  
    // buld span tag for finding
    var errSpan = "span.err-" + evtTargID;
    // declare the editor
    var editor = CKEDITOR.instances.editor1;
    // get text from the editor
    var edata = editor.getData();  
    // find the specific span in the text
    var spanData = $( edata ).find(errSpan); 
    // extract the span class name
    var spanTag = '<span class="'+spanData[0].className+'">'
    // find indexOf value for the span opening tag
    var spanPos = edata.indexOf(spanTag);
    // get the initial length of the span.
    var spanLength = spanData[0].outerHTML.length;
    // get the actual text from that span length.
    var spanString = edata.substring(spanPos,spanPos+spanLength);
    // find the acutal position of the span closing tag
    var spanClose = spanString.indexOf('</span>');
    var spanTagClosePos = spanClose+7;
    // extract the true text comprising the span tag
    var spanStringMod = edata.substring(spanPos,spanPos+spanTagClosePos);
    var spanInnerHtm = spanData[0].innerHTML;
    log("errSpan: "+ errSpan);
    log("errSpanClass: "+ errSpanClass);
    log("spanData: "+  JSON.stringify(spanData));
    log("spanPos: "+ spanPos);
    log("spanTagClosePos: "+ spanTagClosePos);
    log("spanStringMod: "+ spanStringMod);
    log("spanInnerHtm: "+ spanInnerHtm);
    var newEdata = edata.replace(spanStringMod, spanInnerHtm);  
    log(" newEdata: "+ newEdata);   
    // update the editor
    editor.setData(newEdata);
}

我希望这在某个地方,某个时间对某人有所帮助!

干杯!

最新更新