Schreiben Sie den kürzesten Text Getter / Setter auf ein Element für das DOM

8

$.fn.textSchreiben Sie genau wie bei jQuery eine oder zwei Funktionen, mit denen Sie den Text für ein Element abrufen und festlegen können.

Sie können nicht verwenden textContentoder innerText, und noch weniger innerHTML.

Einfaches Javascript. Keine DOM-Bibliothek. Es muss auf gängigen Browsern funktionieren. (Sie müssen sich nicht um den alten IE kümmern.)

Der kürzeste Code gewinnt.

Genießen!

Florian Margaine
quelle
Wird der Funktionsname auf die Gesamtsumme angerechnet?
Shmiddty
Ja. Ich sollte in der Lage sein, Ihre Funktion auf meine Seite zu setzen und sie sofort zu verwenden. Aber es sollte für alle die gleiche Einschränkung sein, also ist es nicht so, als wäre es für niemanden unfair.
Florian Margaine
1
Also ein Buchstabe Funktionsnamen. Ich habs.
Shmiddty
@Shmiddty Außerdem wäre es unfair, wenn die Funktionsdeklaration nicht vorhanden wäre, wenn Personen die Rekursion verwenden möchten.
Florian Margaine

Antworten:

4

JavaScript (167)

function t(e,h,f){if(h||h==''){while(f=e.lastChild)e.removeChild(f);e.appendChild(document.createTextNode(h))}h=e.data||'';for(c in f=e.childNodes)h+=t(f[c]);return h}

Verwendungszweck :

var textContent = t(yourElement); // get the text content
t(yourElement, ''); // clear
t(yourElement, newText); // sets a new text

Beachten Sie, dass der globale Namespace nicht verschmutzt wird

Demonstration mit einem mehrstufigen DOM-Baum und einigen Tests

Denys Séguret
quelle
if('split' in h)
Shmiddty
@Shmiddty Das würde den Funktionsbenutzer zwingen, etwas nicht zu übergeben undefined.
Denys Séguret
Der Code Golf SE-Zähler meldet 175 Zeichen, nicht 218. Warum ist das so?
John Dvorak
@ JanDvorak wo ist dieser Zähler? Es ist mein erstes Mal hier ...
Denys Séguret
1
Hinweis, den andere verwenden können: dataist kürzer als nodeValue:-). Können Sie auch die Version ohne Golf veröffentlichen?
Florian Margaine
2

JavaScript (175)

function t(e,v,f){if(!v&&v!=''){v=e.data||'';for(c in f=e.childNodes)v+=t(f[c]);return v}else{ while(c=e.lastChild)e.removeChild(c);e.appendChild(document.createTextNode(v))}}

Ich habe deutlich weniger Moral als @dystroy, also habe ich mich nicht um var gekümmert . Ich musste allerdings f fassen, und ich habe es etwas klug gemacht.

Trotzdem sind unsere Antworten ziemlich ähnlich, und ich bin mir nicht sicher, ob es einen besseren Weg gibt, dies zu tun.

Mit Sammlungserkennung (173) :

function t(e,v){if(!v&&v!=''){v=e.data||'';for each(c in e.childNodes)v+=t(c);return v}else{ while(c=e.lastChild)e.removeChild(c);e.appendChild(document.createTextNode(v))}}
Shmiddty
quelle