Escriba el getter / setter de texto más corto en un elemento para el DOM

8

Al igual que jQuery $.fn.text, escriba una o dos funciones que puedan obtener y establecer el texto en un elemento.

No puedes usar textContento innerText, y aún menos innerHTML.

JavaScript simple. No hay biblioteca DOM. Tiene que funcionar en los principales navegadores. (No es necesario preocuparse por el antiguo IE).

El código más corto gana.

¡Disfrutar!

Florian Margaine
fuente
¿El nombre de la función se contará para el total?
Shmiddty
Sí. Debería poder poner su función en mi página y usarla de inmediato. Pero debería ser la misma limitación para todos, por lo que no es injusto para nadie.
Florian Margaine
1
Entonces, nombres de funciones de una letra. Entendido.
Shmiddty
@Shmiddty Además, no tener la declaración de función sería injusto para las personas que desean utilizar la recursividad.
Florian Margaine

Respuestas:

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}

Uso:

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

Tenga en cuenta que no hay contaminación del espacio de nombres global

Demostración , con un árbol DOM multinivel y algunas pruebas.

Denys Séguret
fuente
if('split' in h)
Shmiddty
@Shmiddty Eso obligaría al usuario de la función a pasar algo que no undefined.
Denys Séguret
El contador de código de golf SE informa 175 caracteres, no 218. ¿Por qué es así?
John Dvorak
@ JanDvorak, ¿dónde está este mostrador? Es mi primera vez aquí ...
Denys Séguret
1
Sugerencia que otras personas pueden usar: dataes más corta que nodeValue:-). ¿Puedes publicar la versión sin golf también?
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))}}

Tengo significativamente menos moralidad que @dystroy, así que no me molesté con var . Sin embargo, tuve que buscar f , y lo hice de manera algo inteligente.

Dicho esto, nuestras respuestas son bastante similares, y no estoy seguro de que haya una mejor manera de hacerlo.

Con reconocimiento de colección (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
fuente