我收到的HTML格式各不相同,我正在尝试使用jQuery将代码标准化。在某些情况下,我使用换行符<br>
来分隔行。我需要将其更改为<div>
或<p>
标签。例如下面的代码:
a<br>b<br>c
需要转换为
<div>a</div><div>b</div><div>c</div>
这是一个简单的例子,因为 a
中的内容可能被各种格式选项包围,如<font>
, <span>
等,所有这些都需要保留。
这是我的第一次尝试。它找到整个文档中所有的 <br>
标签,然后访问父元素的内容以获取 <br>
周围的所有HTML。如果内容长度为1,则 <br>
是唯一的元素(表示空行),则跳过到下一个。否则,查看每个元素,用 <div>
(或 <p>
)将其包围,并删除 <br>
,因为它不再需要。变量 wrapper
取决于浏览器,可以是 "<div />"
或 "<p />"
。
$("br").each(function() {
// Find all the br tags' parent nodes
var elements = $(this).parent().contents();
if (elements.length > 1) {
// If there is one element than it is br so skip on.
elements.each(function() {
// Loop through each child element of the parent
var nodeName = this.nodeName.toLowerCase();
if (nodeName !== 'div' && nodeName !== 'p') {
// Make sure each child that is not <br> is wrapped. Remove <br> tags.
if (nodeName == 'br') {
$(this).remove();
} else {
$(this).wrap(wrapper);
}
}
});
}
});
但是,这种方法行不通,因为它会在每个子元素周围添加<div>
(或<p>
)标签,所以像<font>a</font>bc<br>de<b>f</b>
这样的内容最终会变成:
<div><font>a</font></div>
<div>bc</div>
<div>de</div>
<div><b>f</b></div>
当它确实需要时
<div><font>a</font>bc</div>
<div>de<b>f</b></div>
如果我在文本解析器中执行此操作,我会像上面对变量elements
进行的操作一样找到内容,然后在开头添加一个<div>
,在结尾添加一个</div>
,然后将每个<br>
替换为</div><div>
(除非它已经是<div><br></div>
,此时我会跳过它)。我不知道如何在jQuery / Javascript中执行此操作。特别是关于使用<br>
替换</div><div>
的部分。(第一部分是elements.wrap(wrapper)
。)
谁能给予一些帮助或者提供另一种方法将不胜感激。
--- 更新 ---
@Ian提供了大部分有效的代码。我稍微扩展了一下,并认为应该在这里包含它。我已在FF,Safari,Chrome和IE 9+中测试过。
$("br").each(function(idx, el) {
var $el = $(el),
$parent = $el.parent(),
$contents = $parent.contents(),
$cur, $set, i;
$set = $();
if ($contents.length > 1) {
for (i = 0; i < $contents.length; i++) {
$cur = $contents.eq(i);
if ($cur.is("br")) {
$set.wrapAll(wrapper);
$cur.remove();
$set = $();
} else {
$set = $set.add($cur);
}
}
$set.wrapAll(wrapper);
}
});