我想知道有什么方法可以把这个转换成:
<body>
Foo
Bar
<div>Abc</div>
<div>Xyz</div>
</body>对此:
<body>
<div id="new">
Foo
Bar
</div>
<div>Abc</div>
<div>Xyz</div>
</body>作为新手,我了解innerHTML和jQuery wrap的基本知识,但代码如下:
var foo = document.body.innerHTML;
console.log(foo);给我完整的身体,包括Abc和Xyz div。所以,这并不能解决问题。
发布于 2017-01-06 17:22:26
您可以通过使用contents().filter()检索文本节点,然后使用wrapAll()将它们放置在新的div元素中来实现这一点。试试这个:
$('body').contents().filter(function() {
return this.nodeType == 3 && this.textContent != '';
}).wrapAll('<div id="new" />');/* only to show the new div exists... */
#new { border: 1px solid #C00; }<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Foo
Bar
<div>Abc</div>
<div>Xyz</div>
发布于 2017-01-06 17:24:27
非jQuery解决方案:
可以遍历主体的所有子节点,并将每个文本节点移动到新元素,直到到达第一个元素节点为止。示例:
var div = document.createElement('div');
div.id = 'new';
var childNodes = document.body.childNodes;
while (childNodes[0].nodeType !== Node.ELEMENT_NODE) {
div.appendChild(childNodes[0]);
}
document.body.insertBefore(div, childNodes[0]);#new {
color: red;
}Foo
Bar
<div>Abc</div>
<div>Xyz</div>
发布于 2017-01-06 17:22:40
你可以使用.contents(),.filter(),.prependTo()。若要保留新行字符,请将#new css white-space属性设置为pre。
var nodes = $("body").contents().filter(function() {
return this.nodeType === 3 && /Foo|Bar/.test(this.textContent)
});
$("<div></div>", {
id:"new",
html: nodes,
css: {whiteSpace: "pre"}
}).prependTo("body")#new {
color: sienna;
}<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
Foo
Bar
<div>Abc</div>
<div>Xyz</div>
</body>
https://stackoverflow.com/questions/41510807
复制相似问题