Bagaimana Anda menguji elemen untuk keberadaan tanpa menggunakan getElementById
metode ini?
Saya telah menyiapkan demo langsung untuk referensi. Saya juga akan mencetak kode di sini juga:
<!DOCTYPE html>
<html>
<head>
<script>
var getRandomID = function (size) {
var str = "",
i = 0,
chars = "0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ";
while (i < size) {
str += chars.substr(Math.floor(Math.random() * 62), 1);
i++;
}
return str;
},
isNull = function (element) {
var randomID = getRandomID(12),
savedID = (element.id)? element.id : null;
element.id = randomID;
var foundElm = document.getElementById(randomID);
element.removeAttribute('id');
if (savedID !== null) {
element.id = savedID;
}
return (foundElm) ? false : true;
};
window.onload = function () {
var image = document.getElementById("demo");
console.log('undefined', (typeof image === 'undefined') ? true : false); // false
console.log('null', (image === null) ? true : false); // false
console.log('find-by-id', isNull(image)); // false
image.parentNode.removeChild(image);
console.log('undefined', (typeof image === 'undefined') ? true : false); // false ~ should be true?
console.log('null', (image === null) ? true : false); // false ~ should be true?
console.log('find-by-id', isNull(image)); // true ~ correct but there must be a better way than this?
};
</script>
</head>
<body>
<div id="demo"></div>
</body>
</html>
Pada dasarnya kode di atas menunjukkan elemen yang disimpan ke dalam variabel dan kemudian dihapus dari DOM. Meskipun elemen telah dihapus dari DOM, variabel tetap mempertahankan elemen seperti ketika pertama kali dinyatakan. Dengan kata lain, ini bukan referensi langsung ke elemen itu sendiri, melainkan replika. Akibatnya, memeriksa nilai variabel (elemen) untuk keberadaan akan memberikan hasil yang tidak terduga.
The isNull
Fungsi adalah upaya saya untuk memeriksa eksistensi unsur-unsur dari variabel, dan bekerja, tapi saya ingin tahu apakah ada cara yang lebih mudah untuk mencapai hasil yang sama.
PS: Saya juga tertarik pada mengapa variabel JavaScript berperilaku seperti ini jika ada yang tahu beberapa artikel bagus yang berhubungan dengan subjek.
Jawaban:
Tampaknya beberapa orang mendarat di sini, dan hanya ingin tahu apakah ada elemen (sedikit berbeda dengan pertanyaan awal).
Itu yang sederhana seperti menggunakan metode memilih browser, dan memeriksa untuk truthy nilai (umumnya).
Misalnya, jika elemen saya memiliki
id
dari"find-me"
, saya cukup menggunakan ...Ini ditentukan untuk mengembalikan referensi ke elemen atau
null
. Jika Anda harus memiliki nilai Boolean, cukup lemparkan!!
sebelum panggilan metode.Selain itu, Anda dapat menggunakan beberapa dari banyak metode lain yang ada untuk menemukan elemen, seperti (semuanya hidup
document
):querySelector()
/querySelectorAll()
getElementsByClassName()
getElementsByName()
Beberapa metode ini mengembalikan
NodeList
, jadi pastikan untuk memeriksa nyalength
properti, karenaNodeList
adalah obyek, dan karena itu truthy .Untuk benar-benar menentukan apakah suatu elemen ada sebagai bagian dari DOM yang terlihat (seperti pertanyaan yang awalnya ditanyakan), Csuwldcat memberikan solusi yang lebih baik daripada menggulirkan sendiri (karena jawaban ini biasanya berisi). Artinya, untuk menggunakan yang
contains()
metode pada elemen DOM.Anda bisa menggunakannya seperti itu ...
sumber
var elementInDom = function( el ) { while ( el = el.parentNode ) if ( el === document ) return true; return false; }
getElementById()
akan mengembalikan referensi ke elemen DOM ataunull
, oleh karena itu, menggunakantypeof
(terutama pada RHS) salah (jika tidak didefinisikan, kondisi LHS akan melempar aReferenceError
).document.body.contains()
yang tampaknya memiliki dukungan browser yang sangat bagus?Gunakan
getElementById()
jika tersedia.Juga, inilah cara mudah untuk melakukannya dengan jQuery:
Dan jika Anda tidak dapat menggunakan perpustakaan pihak ketiga, cukup pertahankan JavaScript:
sumber
$('#elementId')[0].length
tidak akan menghasilkan hasil yang sama.if (element) {}
? Ketika elemen tidak terdefinisi atau nol maka ungkapan ini salah. Jika elemen adalah elemen DOM maka ungkapan itu benar.getElementById()
dispesifikasikan untuk kembalinull
jika tidak menemukan elemen, jadi memeriksa nilai yang dikembalikan jujur adalah semua yang diperlukan.getElementById
seharusnya tidak pernah kembaliundefined
. Bagaimanapun,element != null
cek akan mengambil ini.Menggunakan Node.contains DOM API , Anda dapat memeriksa keberadaan elemen apa pun di halaman (saat ini di DOM) dengan mudah:
CATATAN CROSS-BROWSER :
document
objek di Internet Explorer tidak memilikicontains()
metode - untuk memastikan kompatibilitas lintas-browser, gunakandocument.body.contains()
saja.sumber
document.contains()
sudah cukup.document.contains(document.documentElement)
.document
memang memilikiNode
pada rantai prototipe, sejauh yang saya tahu (document
->HTMLDocument
->Document
->Node
)document.body.contains([selector])
, yaitudocument.body.contains(document.getElementById('div')
Saya hanya melakukan:
Ini bekerja untuk saya dan belum memiliki masalah dengan itu ...
sumber
id
. Solusi yang lebih baik yang menjawab pertanyaan. Bagaimana memeriksa apakah elemen ada di DOM yang terlihat? dengan elemen apa pun, bahkan elemen tanpaid
s adalah melakukandocument.body.contains(element)
.contains()
Anda bisa memeriksa untuk melihat apakah properti parentNode adalah nol.
Itu adalah,
sumber
Dari Jaringan Pengembang Mozilla :
Fungsi ini memeriksa untuk melihat apakah suatu elemen ada di tubuh halaman. Karena berisi () bersifat inklusif dan menentukan apakah isi tubuh itu sendiri bukan maksud isInPage, kasus ini secara eksplisit mengembalikan false.
simpul adalah simpul yang ingin kita periksa di dalam <body>.
sumber
false
seharusnya begitutrue
?node
IS itudocument.body
, tentu metode harus kembalitrue
? Yaitu,return (node === document.body) || document.body.contains(node);
Solusi termudah adalah memeriksa properti baseURI , yang ditetapkan hanya ketika elemen dimasukkan dalam DOM, dan kembali ke string kosong ketika dihapus.
sumber
Cannot read property 'baseURI' of null
. Contoh:console.log(document.querySelector('aside').baseURI)
solusi jQuery:
Ini bekerja untuk saya menggunakan jQuery dan tidak perlu
$('#elementId')[0]
digunakan.sumber
$('#elementId')[0]
sesuatu harus dihindari?Solusi csuwldcat tampaknya menjadi yang terbaik di antara banyak grup, tetapi sedikit modifikasi diperlukan untuk membuatnya berfungsi dengan benar dengan elemen yang ada dalam dokumen yang berbeda dari yang dijalankan oleh kode JavaScript, seperti iframe:
Perhatikan penggunaan
ownerDocument
properti elemen , tidak seperti biasadocument
(yang mungkin atau mungkin tidak merujuk ke dokumen pemilik elemen).torazaburo memposting metode yang lebih sederhana yang juga bekerja dengan elemen non-lokal, tetapi sayangnya, ia menggunakan
baseURI
properti, yang tidak diimplementasikan secara seragam di seluruh browser saat ini (saya hanya bisa membuatnya bekerja di yang berbasis WebKit ). Saya tidak dapat menemukan elemen atau properti simpul lain yang dapat digunakan dengan cara yang sama, jadi saya pikir untuk saat ini solusi di atas sama baiknya dengan yang didapat.sumber
Alih-alih mengulangi orang tua, Anda bisa mendapatkan persegi panjang pembatas yang semuanya nol ketika elemen dilepaskan dari DOM:
Jika Anda ingin menangani selubung tepi elemen lebar dan tinggi nol di atas nol dan kiri nol, Anda dapat memeriksa ulang dengan mengulangi orang tua hingga
document.body
:sumber
Cara sederhana untuk memeriksa apakah ada elemen dapat dilakukan melalui kode jQuery satu baris.
Berikut adalah kode di bawah ini:
sumber
Opsi lain adalah element.closest :
sumber
Kode ini berfungsi untuk saya, dan saya tidak memiliki masalah dengannya.
sumber
Anda juga dapat menggunakan
jQuery.contains
, yang memeriksa apakah suatu elemen adalah turunan dari elemen lain. Saya meneruskandocument
sebagai elemen induk untuk mencari karena setiap elemen yang ada pada halaman DOM adalah turunan daridocument
.sumber
Periksa apakah elemennya adalah anak dari
<html>
viaNode::contains()
:Saya sudah membahas hal ini dan lebih banyak lagi di is-dom-detached .
sumber
Solusi sederhana dengan jQuery:
sumber
$(document).find(yourElement).length !== 0
null == undefined
. Nilai yang dikembalikan sebenarnya adalahundefined
. Membandingkannyanull
sedikit aneh.sumber
DOM
, orang tuanya juga harus didocument
Jadi untuk memeriksa bahwa kita hanya loop ke
parentNode
pohon elemen sampai kita mencapai kakek terakhirGunakan ini:
sumber
Saya menyukai pendekatan ini:
Juga
sumber
!!
jika Anda menginginkan Boolean?Gunakan
querySelectorAll
denganforEach
,sebagai lawan dari:
sumber
Coba yang berikut ini. Ini adalah solusi paling andal:
Sebagai contoh,
sumber
Semua elemen yang ada memiliki set parentElement, kecuali elemen HTML!
sumber
kondisi ini cewek semua kasus.
sumber
Saya lebih suka menggunakan
node.isConnected
properti ( Kunjungi MDN ).Catatan: Ini akan mengembalikan true jika elemen ditambahkan ke ShadowRoot juga, yang mungkin tidak semua orang inginkan.
Contoh:
sumber