2011-04-14 82 views

回答

2

如果您使用jQuery

$('body *').wrap('<span class="foo"></span>'); 

如果你不是(解决@minitech's code):

var elts = document.body.childNodes, 
    numElts = elts.length, 
    elt; 
for(var i = 0; i < numElts; i++) { 
    elt = elts[i]; 
    elt.innerHTML = '<span class="foo">' + elt.innerHTML + '</span>'; 
} 
+0

你能告诉我如何在str上做到这一点吗?输入str是原始内容,输出是新格式? – user570494 2011-04-14 02:05:49

+0

你是什么意思“在弦上做这个?” – 2011-04-14 02:10:15

+0

不知道为什么这会起作用,这显然是错误的。它将在一个范围内包装所有*元素,产生无效的HTML(*

content1

content2

*)并忽略textNodes身体和嵌套元素做奇怪的事情 - 尝试在桌子上。另外,OP想要传递一个字符串(可能是一个HTML片段)。 – RobG 2011-04-14 09:26:42

0

如果你没有(固定为“做一个字符串',希望):

var b = document.body.childNodes; 
for(var i = 0; i < b.length; i++) { 
    if(b[i].nodeType === 1) { 
     b[i].innerHTML = '<span class="foo">' + b[i].innerHTML + '</span>'; 
    } else if(b[i].nodeType === 3) { 
     var newElement = document.createElement('span'); 
     newElement.className = "foo"; 
     b.replaceChild(newElement, b[i]); 
    } 
} 
+2

这会破坏现有的内容。 – Jeff 2011-04-14 02:06:47

+0

我错过了第一部分中的“content1”......谢谢。 – Ryan 2011-04-14 02:30:48

+0

Mysticial 2013-11-29 05:12:26

1

不要用其他答案中建议的方式使用innerHTML,它会与其他任何其他问题混淆有元素。你需要寻找的文本节点和包装他们,就像这样:

// Pass either an id or a DOM element 
var wrapContent = (function() { 

    // This could be passed as a parameter 
    var oSpan = document.createElement('span'); 
    oSpan.className = 'mySpanClass'; 

    return function(id) { 
    var el = (typeof id == 'string')? document.getElementById(id) : id; 
    var node, nodes = el && el.childNodes; 
    var span; 
    var fn = arguments.callee; 

    for (var i=0, iLen=nodes.length; i<iLen; i++) { 
     node = nodes[i]; 
     if (node.nodeType == 3) { 
     span = oSpan.cloneNode(false); 
     node.parentNode.insertBefore(span, node); 
     span.appendChild(node); 
     } else { 
     fn(node); 
     } 
    } 
    } 
}()); 

如果你想在HTML的字符串运行它,然后创建一个div,插入字符串作为它的innerHTML,运行上面的函数传递它的股利,然后抓住innerHTML的背:

function wrapHTMLstring(s) { 
    var el = document.createElement('div'); 
    el.innerHTML = s; 
    wrapContent(el); 
    return el.innerHTML; 
} 

alert(wrapHTMLstring('<h1>content1</h1><p>content2</p>'));" 
// <h1><span class="mySpanClass">content1</span></h1><p><span class="mySpanClass">content2</span></p> 

注意childNodes集合将在不同的浏览器不同,对于相同的HTML,如果您有任何多余的空格,所以你可能需要做一些处理存在(例如,如果一个textNode没有任何内容,不包装它)。

相关问题