“jQuery方式”用HTML和文本混合替换一个文本节点?

时间:2012-10-12 03:17:14

标签: jquery dom-manipulation replacewith

在我的Web浏览器用户脚本项目中,我需要替换一个文本节点,而不会影响与文本相同的父节点下的其他HTML元素。我需要用多个节点替换它:

<div id="target"> foo / bar; baz<img src="/image.png"></div>

需要成为:

<div id="target"> <a href="#">foo</a> / <a href="#">bar</a>; <a href="#">baz</a><img src="/image.png"></div>

我知道jQuery没有对文本节点的大量支持。我知道我可以使用直接DOM调用而不是jQuery。我知道我可以做$('#target').html(我的新内容+之类的事情,我不想改变)。另外请注意,我想保留最初的空间,这本身似乎很棘手。

我想问这里的专家是,是否有最惯用的jQuery方法呢?

3 个答案:

答案 0 :(得分:9)

您基本上想要用新内容替换第一个子节点(文本节点)。您需要http://api.jquery.com/replaceWith/

// Text node we want to process and remove
var textNode = $("#target").contents().first();
// Break the text node up
var parts = textNode.text().split(/\s/);
// Put links around them
var replaceWith = "";
for (var i =0; i < parts.length;i++) {
    replaceWith += "<a href='http://www.google.com'>"  + parts[i] + "</a> ";
}
// Replace the text node with the HTML we created
textNode.replaceWith(replaceWith);

http://jsfiddle.net/NGYTB/1/

答案 1 :(得分:1)

尝试这种方法

// nodeType = 1 corresponds to element node
   // You are filtering everything out other than that and 
   // removing the textnodes from it..
   // contents() will get everything including the text
    ​$('#target'​).contents().filter(function() {
        return this.nodeType != 1; 
    }).remove();

   // Then you are prepending the div with the html  that needs to 
   //  replaced with the text...
    $('#target').prepend('<a href="#">mixed</a> text <a href="#">and</a> HTML');
   // This makes sure you do not touch the initial img element inside the div

如果您不想删除特定的节点类型,可以添加其他节点类型 的 CHECK FIDDLE​

答案 2 :(得分:0)

试试这个..编辑版

$('#target').html('<a href="#">mixed</a> text <a href="#">and</a> HTML' + $('#target').html());