Escreva o getter / setter de texto mais curto em um elemento para o DOM

8

Assim como o jQuery $.fn.text, escreva uma ou duas funções que possam obter e definir o texto em um elemento.

Você não pode usar textContentou innerText, e menos ainda innerHTML.

Javascript simples. Nenhuma biblioteca DOM. Ele tem que funcionar nos principais navegadores. (Não há necessidade de se preocupar com o antigo IE.)

O menor código vence.

Aproveitar!

Florian Margaine
fonte
o nome da função será contado no total?
Shmiddty
Sim. Deveria poder colocar sua função na minha página e usá-la imediatamente. Mas deve ser a mesma limitação para todos, por isso não é injusto com ninguém.
Florian Margaine 08/04
1
Portanto, nomes de função de uma letra. Entendi.
Shmiddty
@Shmiddty Além disso, não ter a declaração de função seria injusto para as pessoas que desejam usar recursão.
Florian Margaine 08/04

Respostas:

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

Observe que não há poluição do espaço para nome global

Demonstração , com uma árvore DOM de vários níveis e alguns testes

Denys Séguret
fonte
if('split' in h)
Shmiddty
@ Shmiddty Isso forçaria o usuário da função a passar algo que não é undefined.
Denys Séguret
O contador de código SE do golf relata 175 caracteres, não 218. Por que é assim?
John Dvorak
@JanDvorak, onde fica esse balcão? É minha primeira vez aqui ...
Denys Séguret 08/04
1
Sugira que outras pessoas podem usar: dataé menor que nodeValue:-). Você também pode postar a versão sem golfe?
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))}}

Eu tenho uma moralidade significativamente menor que o @dystroy, então não me incomodei com var . No entanto, eu tinha que escopo f , e fiz isso de maneira inteligente.

Dito isto, nossas respostas são bastante semelhantes e não tenho certeza de que haja uma maneira melhor de fazer isso.

Com reconhecimento de coleção (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
fonte