我的解决方案(再次感谢 @jonathan-m 和 @frankiethekneeman):
//remove any broken variables
variables = $( 'span[data-placeholder]', this.editor );
for ( i = 0, len = variables.length; i < len; i++ ) {
if ( pp.arrayIndexOf( dict, variables[ i ].innerHTML ) == -1 ) {
t = variables[ i ].childNodes[ 0 ];
$( t ).unwrap( );
}
}
//convert any variables already in a span tag
variables = $( 'span', this.editor );
for ( i = 0, len = variables.length; i < len; i++ ) {
t = variables[ i ].innerHTML.match( /^{(.)*}$/ );
if ( !variables[ i ].hasAttribute( 'data-placeholder' ) && t != null && pp.arrayIndexOf( dict, t[ 0 ] ) != -1 ) {
variables[ i ].setAttribute( 'data-placeholder', this.getVariable( t[ 0 ] ) );
}
}
//convert any variables in a text node
variables = $( 'p', this.editor );
for ( i = 0, len = variables.length; i < len; i++ ) {
for ( j = 0, len2 = variables[ i ].childNodes.length; j < len2; j++ ) {
if ( variables[ i ].childNodes[ j ].nodeType == 3 ) {
t = variables[ i ].childNodes[ j ].data.match( /{(.)*}/ );
if ( t != null && pp.arrayIndexOf( dict, t[ 0 ] ) != -1 ) {
span = document.createElement( 'span' );
span.setAttribute( 'data-placeholder', this.getVariable( t[ 0 ] ) );
span.innerHTML = t[ 0 ];
variables[ i ].replaceChild( span, variables[ i ].childNodes[ j ] );
}
}
}
}
循环 1:如果用户编辑了文本并将变量转换为其他内容,则将编辑后的内容从包装器中分离出来。
循环2:检查每个span标签,如果它已经有数据占位符忽略它,如果没有检查它的内容看它是否是一个变量。
循环 3:检查每个 p 标签,在其中查找与变量匹配的文本节点。如果找到,则创建一个跨度并用包装器替换文本节点。
注意:刚刚意识到我没有在文本节点中测试过多次出现,所以这可能不适用于此代码。现在要去测试了。