Kısa ve basit: Çünkü aradığınız öğeler belgede mevcut değil (henüz).
Bu yanıt geri kalanı için kullanmak olacaktır getElementById
örnek olarak, aynı için de geçerlidir getElementsByTagName
, querySelector
ve diğer herhangi bir DOM yöntemi seçer elemanlarının.
Olası nedenler
Bir öğenin var olmamasının iki nedeni vardır:
İletilen kimliğe sahip bir öğe belgede gerçekten yok. İletdiğiniz getElementById
kimliğin (oluşturulan) HTML'deki mevcut bir öğenin kimliğiyle gerçekten eşleşip eşleşmediğini ve kimliği yanlış yazdığınızdan (kimlikler büyük / küçük harfe duyarlıdır !) İki kez kontrol etmelisiniz .
Bu arada, uygulayan ve yöntem yapan çağdaş tarayıcıların çoğunda , CSS tarzı gösterim, bir öğeyi , örneğin: bir öğenin altından alma yönteminin aksine, bir öğeyi almak için kullanılır ; birincisinde karakter esastır, ikincisinde elemanın alınmamasına yol açar.querySelector()
querySelectorAll()
id
document.querySelector('#elementID')
id
document.getElementById('elementID')
#
Öğe, aradığınız anda mevcut değil getElementById
.
İkinci durum oldukça yaygındır. Tarayıcılar HTML'yi yukarıdan aşağıya ayrıştırır ve işler. Bu, söz konusu DOM öğesinin HTML'de görünmesinden önce gerçekleşen bir DOM öğesine yapılan tüm çağrıların başarısız olacağı anlamına gelir.
Aşağıdaki örneği düşünün:
<script>
var element = document.getElementById('my_element');
</script>
<div id="my_element"></div>
div
Görünür sonrascript
. Komut dosyası yürütüldüğünde, öğe henüz mevcut değildir ve getElementById
geri döner null
.
jQuery
Aynı durum jQuery'li tüm seçiciler için de geçerlidir. jQuery, seçicinizi yanlış yazdıysanız veya gerçekte var olmadan önce seçmeye çalışıyorsanız öğeleri bulamaz .
Eklenen bir bükülme, komut dosyasını protokol olmadan yüklediğiniz ve dosya sisteminden çalıştırdığınız için jQuery bulunamadığında ortaya çıkar:
<script src="//somecdn.somewhere.com/jquery.min.js"></script>
bu sözdizimi, komut dosyasının https: // içeren bir sayfaya HTTPS aracılığıyla yüklenmesine ve http: // protokolüne sahip bir sayfaya HTTP sürümünü yüklemek için kullanılır.
Yükleme denemesinin ve başarısız olmasının talihsiz yan etkisi vardır. file://somecdn.somewhere.com...
Çözümler
Bir çağrı yapmadan önce getElementById
(veya bu konuyla ilgili herhangi bir DOM yönteminden), erişmek istediğiniz öğelerin, yani DOM'un yüklendiğinden emin olun.
Bu , ilgili DOM öğesinden sonra JavaScript'inizi yerleştirerek sağlanabilir
<div id="my_element"></div>
<script>
var element = document.getElementById('my_element');
</script>
bu durumda kodu, body kodunun kapanışından hemen önce koyabilirsiniz ( </body>
) (tüm DOM öğeleri komut dosyası yürütülürken kullanılabilir olacaktır).
Diğer çözümler arasında load
[MDN] veya DOMContentLoaded
[MDN] olaylarını dinleme sayılabilir . Bu durumlarda, belgede JavaScript kodunu nereye yerleştirdiğiniz önemli değildir, tüm DOM işleme kodunu olay işleyicilerine koymayı hatırlamanız yeterlidir.
Misal:
window.onload = function() {
// process DOM elements here
};
// or
// does not work IE 8 and below
document.addEventListener('DOMContentLoaded', function() {
// process DOM elements here
});
Olay işleme ve tarayıcı farklılıkları hakkında daha fazla bilgi için lütfen quirksmode.org'daki makalelere bakın .
jQuery
Önce jQuery'nin düzgün yüklendiğinden emin olun. JQuery dosyasının bulunup bulunmadığını öğrenmek için tarayıcının geliştirici araçlarını kullanın ve bulunmuyorsa URL'yi düzeltin (ör . Başlangıçta http:
veya https:
şemasını ekleyin , yolu ayarlayın, vb.)
load
/ DOMContentLoaded
Olaylarını dinlemek jQuery'nin .ready()
[docs] ile yaptığı şeydir . DOM öğesini etkileyen tüm jQuery kodunuz bu olay işleyicinin içinde olmalıdır.
Aslında, jQuery öğreticisi açıkça şunları belirtir:
JQuery kullanırken yaptığımız hemen hemen her şey belge nesne modelini (DOM) okur veya manipüle ederken, DOM hazır olur olmaz etkinlik vb. Eklemeye başladığımızdan emin olmamız gerekir.
Bunu yapmak için, belge için hazır bir olay kaydederiz.
$(document).ready(function() {
// do stuff when DOM is ready
});
Alternatif olarak steno sözdizimini de kullanabilirsiniz:
$(function() {
// do stuff when DOM is ready
});
Her ikisi de eşdeğerdir.