質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1051閲覧

for of 分が処理されない(エラーも出ない)

rei78087487

総合スコア12

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/03/31 07:44

状況:

1.ダブルクリックして要素(テキストエリア)を作成 ※同じ要素は複数作成可能
2.要素を右クリック メニューが表示され要素の選択をクリック
3.現時点で要素の隣にチェックボックスがあればチェックボックスを削除し、なければ作成する

原因:

ソースコードの追加と変更により、上記3番の部分が反応しなくなった

for文とquerySelectorAll追加に伴い、if分の条件を変更したらif分の反応がなくなった(エラーも出ない)
追加
const qa = document.querySelectorAll('.ip-class');
for (const test of qa) {

変更
if(document.querySelector('.ip-class') != null) → if(test != null) {

追加、変更前はif文は動作していた。
エラーも出ておらず不明。

推測:

検証として、あらかじめHTMLにて<input type='checkbox' class="ip-class">を入れておいた。
その後に、追加したfor文でイベントを行ってみたらif分の反応が返ってきた。
おそらくquerySelectorAll('ip-class')を記述してはいるが、まだ要素が作成されていないものに関しては
for of文が処理できないのではないか?

仮にそうだとしたらif文の条件式はどうする?

追記:

addEventListenerを使用したが、要素が増えるごとに処理が重複して行う為、今回の様なtoggle形式に近いイベント処理ができない。
要素が一つの場合:1回 
要素が二つの場合:2回  
要素が三つの場合:3回  
処理が累積して行われる
1+2+3=6

の様に仮に要素が3つ作成された状態で行うと処理が計6回も行われる。
要素が増えるたびに処理が累積して増えていく。
余分に行う処理の為、表示、非表示の切り替えが上手く作動しない。

実現したいこと:

ip-class全要素ごとの有無を確認して、if文の動作を行うようにしたい。
if(test != null)

if(document.querySelector('.ip-class')でのif分だと、要素単体にしか反映されないので、
for of文を使用する事で、同じ名前の全要素を取得しようとした。

全ソースコード
https://codepen.io/mio-rei/pen/RwKodmX

ソースコード抜粋

JavaScript

1document.addEventListener('dblclick',(e)=>{ 2 e.preventDefault(); 3 if(!e.target.closest('.nodoubleclick')){ 4 const textArea = document.createElement('textarea'); 5 document.querySelector('body').appendChild(textArea); 6 7 document.querySelector('.elm').onclick = () => { 8 9 const qa = document.querySelectorAll('.ip-class'); 10 for (const test of qa) { 11 if(test != null) { 12 alert('true'); 13 14 document.querySelector('.text-number').remove(); 15 16 document.querySelector('.ip-class').remove(); 17 18 document.querySelector('.di-class').parentNode.insertBefore(textArea, document.querySelector('.di-class')); 19 20 document.querySelector('.di-class').remove(); 21 22 } else { 23 alert('false'); 24 25 const diClass = document.createElement('div'); 26 diClass.classList.add('di-class'); 27 28 const textNumber = document.createElement('input'); 29 textNumber.setAttribute('type', 'number'); 30 textNumber.classList.add('text-number'); 31 32 const ipClass = document.createElement('input'); 33 ipClass.setAttribute('type','checkbox'); 34 ipClass.classList.add('ip-class'); 35 36 document.querySelector('body').appendChild(diClass); 37 diClass.style.backgroundColor = 'yellow'; 38 diClass.style.display = 'inline-block'; 39 diClass.appendChild(textNumber); 40 diClass.appendChild(ipClass); 41 diClass.appendChild(textArea); 42 textNumber.style.display = 'none'; 43 } 44 } 45 46 47 let sizeUp = document.getElementById('sizeup'); 48 let sizeNum = document.getElementById('sizenum'); 49 50 sizeUp.onclick = () => { 51 const qa = document.querySelectorAll('.ip-class'); 52 for (const test of qa) { 53 if(test.checked == true) { 54 sizeNum.value = Number(sizeNum.value) + 1; 55 test.nextElementSibling.style.fontSize = sizeNum.value + 'px'; 56 } 57 } 58 59 } 60 61 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ちょっと意味がわからないのですが
チェックだけならqa.lengthを数えればよいでしょう

投稿2021/03/31 09:40

yambejp

総合スコア114814

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rei78087487

2021/04/01 05:59

回答ありがとうございます。 アドバイスのおかげで無事解決出来ました。 もっとシンプルに考えればよかったと悔やまれます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問