Tuliskan pengambil teks / penyetel terpendek pada elemen untuk DOM

8

Sama seperti jQuery $.fn.text, tulis satu atau dua fungsi yang bisa mendapatkan dan mengatur teks pada suatu elemen.

Anda tidak dapat menggunakan textContentatau innerText, dan bahkan lebih sedikit innerHTML.

Javascript biasa. Tidak ada perpustakaan DOM. Itu harus bekerja pada browser utama. (Tidak perlu peduli IE lama.)

Kode terpendek menang.

Nikmati!

Florian Margaine
sumber
apakah nama fungsi akan dihitung terhadap total?
Shmiddty
Ya. Saya seharusnya bisa meletakkan fungsi Anda di halaman saya dan langsung menggunakannya. Tapi itu harus menjadi batasan yang sama untuk semua orang, jadi itu tidak seperti itu tidak adil bagi siapa pun.
Florian Margaine
1
Jadi, satu nama fungsi surat. Oke.
Shmiddty
@Shmiddty Juga, tidak memiliki deklarasi fungsi tidak adil bagi orang yang ingin menggunakan rekursi.
Florian Margaine

Jawaban:

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}

Penggunaan:

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

Perhatikan bahwa tidak ada polusi pada namespace global

Demonstrasi , dengan pohon DOM multi-level dan beberapa tes

Denys Séguret
sumber
if('split' in h)
Shmiddty
@Shmiddty Itu akan memaksa pengguna fungsi untuk melewatkan sesuatu yang tidak undefined.
Denys Séguret
Penghitung kode golf SE melaporkan 175 karakter, bukan 218. Mengapa demikian?
John Dvorak
@ JanDvorak di mana konter ini? Ini pertama kalinya saya di sini ...
Denys Séguret
1
Petunjuk yang dapat digunakan orang lain: datalebih pendek dari nodeValue:-). Bisakah Anda memposting versi non-golf juga?
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))}}

Saya memiliki moralitas yang jauh lebih sedikit daripada @dystroy, jadi saya tidak repot-repot dengan var . Saya memang harus ruang lingkup f , dan saya melakukannya dengan agak cerdik.

Yang mengatakan, jawaban kami sangat mirip, dan saya tidak yakin ada banyak cara yang lebih baik untuk melakukannya.

Dengan pengakuan koleksi (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
sumber