从段落内的文本创建新节点

时间:2012-09-27 18:51:04

标签: javascript jquery html

我有一个包含很多段落的网站。其中一些有文字和图像:

<p>first paragraph</p>
<p>second paragraph</p>
<p>third paragraph</p>
<p>fourth paragraph<img alt="alt" src="src"/></p>
<p>fifth paragraph</p>

我想将带有<img>标签的编号段落包含在新段落中:

<p id="1">first paragraph</p>
<p id="2">second paragraph</p>
<p id="3">third paragraph</p>
<p id="4">fourth paragraph</p>
<p id="5"><img alt="alt" src="src"/></p>
<p id="6">fifth paragraph</p>

请注意,如果第4段内的文字在图片之后,那么最后的情况应该是:

<p id="1">first paragraph</p>
<p id="2">second paragraph</p>
<p id="3">third paragraph</p>
<p id="4"><img alt="alt" src="src"/></p>
<p id="5">fourth paragraph</p>
<p id="6">fifth paragraph</p>

现在我只有这段代码,但它没有将图像添加到单独的段落中:

elem.find('p').each(function () {
    id++;
    $(this).attr('id', 'id_' + id);
});

2 个答案:

答案 0 :(得分:3)

一种方法:

$('p').each(
    function(i){
        while(this.childNodes.length > 1) {
            var p = document.createElement('p');
            p.appendChild(this.childNodes[1]);
            this.parentNode.insertBefore(p,this.nextSibling);
        }
    });

$('p').attr('data-index',function(i) { return i; });​​​​​​​​​​​

JS Fiddle demo

我修改了第一块代码以保留childNodes的顺序(在this example using the above code中有缺陷(请查看textNode后面的第二个img,它是在错误的地方):

$('p').each(
    function(i){
        while(this.childNodes.length > 1) {
            var p = document.createElement('p');
            p.appendChild(this.lastChild);
            this.parentNode.insertBefore(p,this.nextSibling);
        }
    });

JS Fiddle demo

答案 1 :(得分:0)

this fiddle

怎么样?
$('p').each(function(index, p) {
    p.find('img').each(function() {
        if (p.text() != '') {
            var newParagraph = $('<p></p>');
            var html = p.html();
            newParagraph.append($(this));

            if (html.substring(0,1) != '<') {
                p.after(newParagraph);
            }
            else {
                p.before(newParagraph);
            }

        }         
    });
});

$('p').each(function(i) {
   $(this).attr('id', i);
});