部分包装内部HTML

时间:2017-01-06 17:17:57

标签: javascript jquery

我想知道有没有办法转换它:

quantityTextView.setText(Integer.toString(x));

对此:

<body>
    Foo
    Bar
    <div>Abc</div>
    <div>Xyz</div>
</body>

作为一个新手,我了解<body> <div id="new"> Foo Bar </div> <div>Abc</div> <div>Xyz</div> </body> 和jQuery innerHTML的基本内容,但是这样的代码:

wrap

给了我全身,包括var foo = document.body.innerHTML; console.log(foo); Abc div。所以,它并没有解决问题。

3 个答案:

答案 0 :(得分:4)

您可以使用contents().filter()检索文本节点,然后使用wrapAll()将它们放入新的div元素中来实现此目的。试试这个:

&#13;
&#13;
$('body').contents().filter(function() {
  return this.nodeType == 3 && this.textContent != '';
}).wrapAll('<div id="new" />');
&#13;
/* only to show the new div exists... */
#new { border: 1px solid #C00; }
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Foo
Bar
<div>Abc</div>
<div>Xyz</div>
&#13;
&#13;
&#13;

答案 1 :(得分:3)

非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>

答案 2 :(得分:1)

您可以使用.contents().filter().prependTo()。要保留换行符,请将#new css white-space属性设置为pre

&#13;
&#13;
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")
&#13;
#new {
  color: sienna;
}
&#13;
<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>
&#13;
&#13;
&#13;