2012-10-10 76 views
2

我有一个div(contenteditable="true"),其中包含一些文本和一些html。我试图替换整个div 中的文字,但是与某个类别的链接中的除外。更改文本节点的内容

我想:

$('div#text').contents().not('a.selected').each(function() { 
    $(this).html(replace($(this).text())); 
}); 

但似乎$(this).html()null

在div的测试内容是'test <a class="selected">test2</a> test3'

作为输出,我想"test "" test3"与替换()函数的结果被替换,而a.selected内的文本是不变。

编辑

有可能是在div内的一些其他HTML,可以忽略不计。如果替换功能开关的事情为大写,这里有需要的输入蚂蚁ouptut:

输入:'test <a class="selected">test2</a> <a>test3</a>'

输出:'TEST <a class="selected">test2</a> TEST3'

EDIT 2

这似乎是工作,但不当replace()返回一些HTML时

$("div#text").contents().not("a.selected").each(function() { 
    this.nodeValue = replace(this.nodeValue); 
}); 

demo:http://jsfiddle.net/ApgEc/2/

+0

相同的开始,但不同的问题。我问了选择器,现在没问题。我只需要改变这些文本节点! :) – Manu

+0

@Manu输入可以理解,但是应该输出什么? – VisioN

+0

也许我应该包装()一个,以消除文本节点的问题...... – Manu

回答

1

你的意思是这样的吗?

$("div").contents().not("a.selected").each(function() { 
    this.nodeValue = replace(this.nodeValue); 
});​ 

DEMO:http://jsfiddle.net/ApgEc/


为了使可能的replace功能的嵌入式HTML,我们需要重写代码:

$("div").contents().map(function() { 
    if (!$(this).is("a.selected")) { 
     return replace(this.nodeValue); 
    } 
    return this.outerHTML; 
}).appendTo($("div").empty());​ 

DEMO:http://jsfiddle.net/ApgEc/3/

+0

如果替换函数返回一些HTML会工作吗? – Manu

+0

return val.replace(“test”,“ TEST”);显示测试,而不是做一个链接 – Manu

+0

http://jsfiddle.net/ApgEc/2/ – Manu

1

Working Demo

$(function() { 
    $('#test').contents().each(function() { 
     var $this = $(this); 
     if ($this.is('a.selected')) return true; 
     if(this.wholeText) 
      this.wholeText = replace(this.wholeText); 
     else $this.html(replace($this.html())); 
    }); 
}); 
+0

奇怪,我得到一个“txt为空”的错误 – Manu

+0

@Manu奇怪......在哪里以及如何?你能在我的jsfiddle中重现它吗? – nbrooks

+0

没有它在小提琴中工作Oo – Manu