2011-04-18 50 views
0

我甚至不知道如何命名我想要的。所以讓我通過舉例來解釋它。Javascript語法?

雖然firefox使用textContent,但其他瀏覽器支持innerText屬性。順便說一句,如果我使用錯誤的術語,請糾正我。無論如何,迄今爲止一切都很好。但我想類似如下:

document.getElementById(id).iText = "blablabla" 
//or 
var x = document.getElementById(id).iText; 
//where iText is something like: 

if(e.innerText) return innerText; 
else return textContent; 

我不想使用的功能這個東西。另外,請告訴我這個「東西」的名字,如果存在的話,因爲我不熟悉它。

+0

啊,是的,殘酷的情婦......它有很多名字取決於你來自哪裏。我來自[jQuery](http://jquery.com/),它被稱爲[。文本()](http://api.jquery.com/text/)。在普通的JS中,你總是可以使用'var x = document.body.innerText?document.getElementById(id).innerText:document.getElementById(id).textContent;' – Khez 2011-04-18 11:53:26

+0

是的,我知道,但由於我會參考很多的時間和不同的ID,我不想一直檢查它。我想創建一個交叉瀏覽器的屬性。顯然,直到現在,最好的答案是安迪的答案。 – Shaokan 2011-04-18 12:00:03

回答

2

一般來說,你想要的東西是calle d'getters'(並設置文本,'setters')。有關文檔,請參閱例如。 MDC

在DOM節點上,IE不能可靠地支持添加這些屬性(至少在IE8之前,請參閱this MSDN doc)。但是,Webkit(Chrome)和Gecko(Firefox)似乎很樂意讓您修改DOM原型。這讓你:

try { 
    if (!('innerText' in HTMLElement.prototype)) { 
     HTMLElement.prototype.__defineGetter__("innerText", function() { return this.textContent; }); 
    } 
} catch (ex) {/*uh oh*/} 

你可以使用類似的語法來定義一個setter:

HTMLElement.prototype.__defineSetter__("innerText", function(newVal) { return this.textContent = newVal; }); 

雖然這工作,我仍然強烈建議使用您所選擇的庫(jQuery的,原型, MooTools,YUI,等等)。當然,你可以自己做這種工作,但對於大多數情況下,你的努力最好花在編寫實際應用程序上。

+0

非常感謝。儘管Andy的答案是最接近的答案,但在你回答之前,我將他的正確答案轉移給你,因爲你完美地回答了我的問題:)這正是我所期待的。 – Shaokan 2011-04-18 12:15:08

+0

@Shaokan,Gijs:請注意'__defineSetter__'和'__defineGetter__'都是非標準的,並且不能在僅支持'textContent'的瀏覽器中定義。比如黑莓網絡瀏覽器。它也可能在未來從某些瀏覽器中刪除,轉而使用標準的Object.defineProperty()方法。 – 2011-04-18 17:52:23

2

不知道這「東西」你的意思,但你可以使用一個邏輯或檢索文本:

var text = x.textContent || x.innerText; 

這將返回x.innerText如果x.textContent沒有定義(和x.textContent如果它被定義)。這是一個非常普遍的捷徑。

分配有點棘手,我甚至不確定您是否可以分配這些屬性。但是,如果可以的話,那麼它與分配innerHTML(除了渲染HTML之外)具有相同的效果,即用給定的字符串替換整個內容。
但每個瀏覽器都支持innerHTML,因此更易於使用。

+0

是的,我不確定那個「東西」是什麼。我不確定即使它存在大聲笑。這就是爲什麼我不知道該怎麼問:) – Shaokan 2011-04-18 11:53:17

+0

將'innerText'作爲後備可能更合適,因爲它和'textContent'之間略有不同,現在所有主要的邊緣瀏覽器版本都支持'textContent'。 – 2011-04-18 11:58:39

+0

@AndyE:是的,其實我不知道這個命令是什麼......更新了。 – 2011-04-18 12:00:55

2

嵌入jQuery,然後簡單地使用$('#' + id).text()

這是唯一正確的方法。儘管JavaScript允許您定義具有getter的屬性,但擴展主機對象(並且DOM節點是主機對象)可能會導致未定義的行爲。

+0

感謝您的答案哥們,但我也不想使用jQuery :) – Shaokan 2011-04-18 11:52:09

+0

然後,你必須留下醜陋的代碼,返回任何有價值的財產。 – ThiefMaster 2011-04-18 11:52:42

+0

是的,我猜是這樣的:S – Shaokan 2011-04-18 11:54:32

0

要麼做某事像

var x = elem.innerText || elem.textContent || ""; 

或simly使用jQuery,讓它爲您處理

var x = $('myElement').text(); 
5

如果您需要引用innerTexttextContent幾次,你可以這樣做像這樣:

// Check which is supported: 
var textProp = "textContent" in document.body ? "textContent" : "innerText"; 

// And when you need it: 
var text = document.getElementById("myId")[textProp]; 
+0

Yay謝謝!這是我問的最接近的答案! – Shaokan 2011-04-18 11:57:31

+0

@ Shaokan:沒問題。不要忘了'innerText'和'textContent'之間有一些細微差別:-) – 2011-04-18 11:59:59

+1

是的,我知道:)但我需要paragpraph中的文本,而innerHTML並不會解僱它們。由於Firefox不使用innerText,所以最接近我想要的是textContent :)再次感謝 – Shaokan 2011-04-18 12:01:28