私のサイトのスライドショーにボタンを追加するこのコードを使用しようとしました:
window.onload = function loadContIcons() {
var elem = document.createElement("img");
elem.src = "http://arno.agnian.com/sites/all/themes/agnian/images/up.png";
elem.setAttribute("class", "up_icon");
var id = "views_slideshow_controls_text_next_slideshow-block";
if (id !== 0) {
document.getElementById(id).appendChild(elem);
} else console.log("aaaaa");
var elem1 = document.createElement("img");
elem1.src = "http://arno.agnian.com/sites/all/themes/agnian/images/down.png";
elem1.setAttribute("class", "down_icon");
var id1 = "views_slideshow_controls_text_previous_slideshow-block";
if (id1 !== 0) {
document.getElementById(id1).appendChild(elem1);
} else console.log("aaaaa");
}
私がスライドショーを持っているフロントページではすべてがうまくいきますが、他のページではエラーCannot read property 'appendChild' of null
が発生します。
要素はまだ追加されていないため、nullと等しくなります。 Idは決して0になりません。getElementById(id)を呼び出すと、静的IDがすでにDOM上にない限り、domの一部ではないため、nullになります。コンソールを介して呼び出しを行い、返される内容を確認します。
DOMまたはHTMLがJavaScriptの前に読み込まれることを確認するだけです。
あなたの状態id !== 0
は、文字列値を割り当てているため、常にゼロとは異なります。 id views_slideshow_controls_text_next_slideshow-block
が見つからない場合でも、img要素を追加しようとすると、Cannot read property 'appendChild' of null
エラー。
文字列値を割り当てる代わりに、DOM要素を割り当てて、ページ内に存在するかどうかを確認できます。
window.onload = function loadContIcons() {
var elem = document.createElement("img");
elem.src = "http://arno.agnian.com/sites/all/themes/agnian/images/up.png";
elem.setAttribute("class", "up_icon");
var container = document.getElementById("views_slideshow_controls_text_next_slideshow-block");
if (container !== null) {
container.appendChild(elem);
} else console.log("aaaaa");
var elem1 = document.createElement("img");
elem1.src = "http://arno.agnian.com/sites/all/themes/agnian/images/down.png";
elem1.setAttribute("class", "down_icon");
container = document.getElementById("views_slideshow_controls_text_previous_slideshow-block");
if (container !== null) {
container.appendChild(elem1);
} else console.log("aaaaa");
}
同様の問題に直面しているすべての人について、以下に示す特定のコードスニペットを実行しようとしたときに、同じ問題に遭遇しました。
<html>
<head>
<script>
var div, container = document.getElementById("container")
for(var i=0;i<5;i++){
div = document.createElement("div");
div.onclick = function() {
alert("This is a box #"+i);
};
container.appendChild(div);
}
</script>
</head>
<body>
<div id="container"></div>
</body>
</html>
https://codepen.io/pcwanderer/pen/MMEREr
Document.getElementByIdはnullを返しているため、nullにはappendChildという名前の属性がないため、エラーがスローされます。この問題を解決するには、以下のコードをご覧ください。
<html>
<head>
<style>
#container{
height: 200px;
width: 700px;
background-color: red;
margin: 10px;
}
div{
height: 100px;
width: 100px;
background-color: purple;
margin: 20px;
display: inline-block;
}
</style>
</head>
<body>
<div id="container"></div>
<script>
var div, container = document.getElementById("container")
for(let i=0;i<5;i++){
div = document.createElement("div");
div.onclick = function() {
alert("This is a box #"+i);
};
container.appendChild(div);
}
</script>
</body>
</html>
https://codepen.io/pcwanderer/pen/pXWBQL
これがお役に立てば幸いです。 :)