前提・実現したいこと>
<div name="whole" class="box">
<form name="count">
<p>Please check if you're playing!</p>
<span>Player1</span><input id="pnum1" type="checkbox"><br>
<span>Player2</span><input id="pnum2" type="checkbox"><br>
<span>Player3</span><input id="pnum3" type="checkbox"><br>
<span>Player4</span><input id="pnum4" type="checkbox"><br>
<span>Player5</span><input id="pnum5" type="checkbox"><br>
</form>
</div>
チェックされた箇所の情報を読み取り、対応した画像を表示したい。
発生している問題・エラーメッセージ
編集前のエラー
Uncaught TypeError: Cannot read property 'appendChild' of undefined
編集後のエラー
Uncaught TypeError: Cannot read property 'checked' of undefined
該当のソースコード
編集後
function addplayer(){
var a = document.getElementsByName("count");
var c = document.getElementById("wholegame");
for(i = 0; i <= 5; i++){
if(a[i].checked){
var b = document.createElement("img");
b.src = "player1.png";
b.class ="absolute players";
c.appendChild(b);
}
else{}
}
a.style.display = "none";
}
編集前
function addplayer(){
var a = document.getElementById("count");
for(i = 0; i <= 5; i++){
if(document.count.elements[i].checked){
var b = document.createElement("img");
b.src = "player"+i+".png";
b.class ="absolute players";
document.whole.appendChild(b); //此処でエラーが発生
}
}
a.style.display = "none";
}
試したこと
appendChildではなく、元から<img>要素を作っておく。
.absolute{position:absolute;}
.players{display:none; z-index:2}
.hidden{display:none;}
<img id="you1" class="hidden">
<img id="you2" class="hidden">
<img id="you3" class="hidden">
<img id="you4" class="hidden">
<img id="you5" class="hidden">
同じくfor文で回し、
var b = document.getElementById("you"+i);
b.src = "player"+i+".png";
b.class = "absolute players";
としたが、関数が最後まで読み込まれなくなった。
恐らく、getElementByIdでちゃんとした要素が読み込まれていない。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
form name="count"のelementに対して0から5番まで処理をするということは6個
チェックしているということです。
実際にはinput要素は5個しか無いので、少なくとも6個めの処理をするときにエラーになります
正直なにをトリガーにどうしたいのかわかりづらいですが
チェックボックスを付けたり消したりするたびに
imgを付加したり削除したりすればいいのならこんな感じですかね
<script>
HTMLElement.prototype.trigger=function(eventStr){
if (document.createEvent) {
var e = document.createEvent("HTMLEvents");
e.initEvent(eventStr, true, true );
return this.dispatchEvent(e);
} else {
var e = document.createEventObject();
return this.fireEvent("on"+eventStr, e);
}
};
document.addEventListener('change',function(e){
var t=e.target;
if(t.nodeName=="INPUT" && t.type=="checkbox" && t.form.name=="count"){
[].forEach.call(t.form.querySelectorAll("input[type=checkbox]"),function(x,y){
if(z=document.querySelector("[name=whole] [src='player"+(y+1)+".png']")){
document.querySelector("[name=whole]").removeChild(z);
}
if(x.checked){
var b =document.createElement("img");
b.setAttribute("src","player"+(y+1)+".png");
b.classList.add("absolute","players");
document.querySelector("[name=whole]").appendChild(b);
}
});
};
});
window.addEventListener('DOMContentLoaded', function(e){
document.querySelector("#pnum1").trigger("change");
});
</script>
<div name="whole" class="box">
<form name="count">
<p>Please check if you're playing!</p>
<span>Player1</span><input id="pnum1" type="checkbox"><br>
<span>Player2</span><input id="pnum2" type="checkbox"><br>
<span>Player3</span><input id="pnum3" type="checkbox"><br>
<span>Player4</span><input id="pnum4" type="checkbox"><br>
<span>Player5</span><input id="pnum5" type="checkbox"><br>
</form>
</div>
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+2
document.whole.appendChild(b); //此処でエラーが発生
「document」というオブジェクトに「whole」などというプロパティがないから、アクセス不能なのです。
<div name="whole" class="box">
↑これを取得したいなら、「document.getElementsByName("whole")[0]」を使用する必要があります。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+2
質問がどれか曖昧なので2つ
- documentにwholeがない
wholeはdivのnameにすぎず、取得するコードをかく必要があります。自動的にdocument.wholeに読み込まれたりはしないと思います。 - iは0からはじまる
document.getElementById("you"+i);
のiは0からはじまるようです。"you"+i
はyou0となるように思いますが、これが意図した動作だとは思えません。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 89.97%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
m.ts10806
2018/05/09 17:29
プログラムコード(およびエラーメッセージ)は```で囲ってください。(わからなければ質問編集画面でコード部分を選択し<code>ボタンを押してください)正しく反映されているかどうかは質問編集画面のプレビューを見ながら編集していってください。