我在JS中有一个字符串变量,它包含一些文本。有时会发生所述文本包含HTML标记。
我需要做的是将每个单词都包含在单独的span标记中。例如
This is <p>text</p>
=&gt; <span>This</span> <span>is</span> <p><span>text</span></p>
理想情况下,它应该在不使用JQuery的情况下实现,但不是必需的。
我尝试过几种不同的解决方案,包括Regexes(大部分时间都可以使用,但并非总是如此)。
我正在使用Polymer 2.0和ShadyDOM。
修改
也可能发生标签有属性的问题。例如:
<span class=”test”>So I have heard.</span>
=&gt; <span class="test"><span>So</span> <span>I</span> <span>have</span> <span>heard</span></span>
答案 0 :(得分:1)
您可以使用DOM
从字符串创建DOM.childNodes
元素并循环遍历所有子节点。
然后用span
替换字符串。
function changeText(s){
var div = document.createElement('div');
div.innerHTML = s;
recurseDomChildren(div, true);
var str = div.innerHTML.replace(/spfrnt/g, "<span>").replace(/spback/g, "</span>");
return str;
}
function recurseDomChildren(start, output){
var nodes;
if(start.childNodes){
nodes = start.childNodes;
loopNodeChildren(nodes, output);
}
}
function loopNodeChildren(nodes, output){
var node;
for(var i=0;i<nodes.length;i++){
node = nodes[i];
addSpanToNode(node);
if(node.childNodes)recurseDomChildren(node, output);
}
}
function addSpanToNode(node){
if(node.nodeType != 3) return;
var tt = node.data;
var strArr = tt.split(" ");
var str = "";
for( var i = 0 ; i < strArr.length; i++) if (strArr[i]){
str += 'spfrnt' + strArr[i] + 'spback ';
}
node.data = str;
}
console.log("firstCase: ", changeText('<span class="test">So I have heard.</span>'));
console.log("secondCase: ", changeText('This is <p>text</p>'));
&#13;
答案 1 :(得分:0)
您不需要Regex来完成此任务。只需几个数组操作。
var str = "Your string of info here";
//Create an array with each word in the string
//Map the array wrapping each word in a <span>
//You can also then join the array by adding .join('') to the end
var res = str.split().map(m => {return `<span>${m}</span>`});