【发布时间】:2015-09-26 12:44:59
【问题描述】:
我有一个预处理 HTML DOM 中的文本节点的函数。
目的本质上是执行一些插值或字符串模板。
该函数主要检查匹配正则表达式 /\${([^}]*)}/g 和 /{{([^}]*)}/g 的事件。
示例:${foo + 1} 和 {{foo + 2}}
一切正常。
但我的目标是用新节点(例如 span)替换这些事件,这些节点由包含正则表达式匹配的内部值的 Knockout 绑定表达式组成。位置正确。保留出现的空格。
像这样:
<span ko-text="foo" /> for ${foo}(注意:自定义绑定语法)
我无法用TextNode.splitText 来解决这个问题。
我如何实现这一目标?
这是我目前得到的代码:
preprocessNode(node: Element) {
if ("nodeValue" in node && node.nodeValue !== null) {
var value = node.nodeValue;
var match = value.matchAll(/\${([^}]*)}/g);
if (!match) {
match = value.matchAll(/{{([^}]*)}/g);
}
if (match !== null && match.length > 0) {
var parentNode = node.parentNode;
for (let entry of match) {
var offset = node.nodeValue.indexOf(entry[0]);
var oldNode = node;
node = node.splitText(offset);
var newNode = document.createElement("span");
newNode.setAttribute("ko-text", entry[1]);
node.parentNode.appendChild(newNode);
}
return [parentNode, parentNode];
}
}
return null;
}
函数matchAll是自定义函数。
【问题讨论】:
-
我认为您最好删除当前文本节点,然后在该位置插入新节点流。您可以使用单个正则表达式,使用全局搜索循环。由于您最终会混合新的文本节点和跨度元素,因此您必须考虑正则表达式中的文本之间的中间值。
标签: javascript html regex dom knockout.js