2012-10-10 109 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