🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
ストレージ

ストレージとは、データを長期で保管・保存しておくための記憶装置。ハードディスクやDVD、CDなどが主なストレージとして挙げられます。PCでは作成データの他、OSやアプリケーションがインストールされています。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

Q&A

解決済

1回答

512閲覧

ローカルストレージから呼び出した値にイベントをつけれない

tokio-k

総合スコア11

ストレージ

ストレージとは、データを長期で保管・保存しておくための記憶装置。ハードディスクやDVD、CDなどが主なストレージとして挙げられます。PCでは作成データの他、OSやアプリケーションがインストールされています。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

0グッド

0クリップ

投稿2019/10/30 11:20

ローカルストレージから出すときにクリックイベントがうまくつきません。
onloadイベントでこの下記のコードのイベントをします。そのイベントの中で<li>を作るたびにそこにクリックイベントをつけるつもりです。

<ul></ul>の中に<li>を作っていきます。 liの中のp要素とi要素にクリックイベントをつけようとしているのですが、なぜか最初の一つにしか付きません。 考えられる原因は何でしょうか。 どうしたら解決するのでしょうか。

onloadイベントではなくinputタグから追加するときはすべてにつけることができます。

javascript

1var loadlsta=JSON.parse(localStorage.getItem('keya')); 2 3 loadlsta.forEach(function(loadtask){ 4 let lists = document.getElementById("todolist-a"); 5 lists.insertAdjacentHTML("beforeend","<li><p>◉</p>"+loadtask+"<i class='far fa-trash-alt gomi'></i></li>"); 6 let i=0; 7 lists.querySelector('p').addEventListener('click',function(){ 8 let lank = ["◉","✮","▴","✓"]; 9 i++; 10 if(i==4){ 11 i=0; 12 } 13 this.innerHTML=lank[i]; 14 15 switch(i){ 16 case 0 : 17 this.parentNode.style.color = '#000' 18 this.parentNode.style.textDecoration = "none" 19 break; 20 case 1 : 21 this.parentNode.style.color = '#00f' 22 this.parentNode.style.borderBottom = '2px solid #f00' 23 break; 24 case 2 : 25 this.parentNode.style.color = '#666' 26 this.parentNode.style.borderBottom = '0.5px solid #d1d405' 27 break; 28 case 3 : 29 this.parentNode.style.color = '#ccc' 30 this.parentNode.style.textDecoration = "line-through #000" 31 break; 32 } 33 34 }); 35 lists.querySelector('i').addEventListener('click',function(){ 36 this.parentNode.remove(); 37 }) 38 39 });

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

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

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

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

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

tokio-k

2019/10/30 13:29 編集

ミス
guest

回答1

0

ベストアンサー

こんにちは

以下は、 MDN の querySelector() の説明からの引用です。

Document の querySelector() メソッドは、指定されたセレクターまたはセレクターのグループに一致する、文書内の最初の Element を返します。一致するものが見つからない場合は null を返します。

上記に 最初の Element を返します。 と書いてあるとおり、ご質問のコードにある、下記の部分

lists.querySelector('p').addEventListener('click',function(){

lists.querySelector('p') は、常に lists に含まれる最初の <p> を返します。そのため、

なぜか最初の一つにしか付きません。

ということになります。

何らかの修正をして、直前に追加されたリストアイテムに含まれる <p> を取得して、それに対して addEventListener を行うようにすればよいです。

例えば、下記のように修正してみると、いかがでしょうか?

lists.querySelector('li:last-of-type > p').addEventListener('click',function(){

以上、参考になれば幸いです。

投稿2019/10/30 11:52

jun68ykt

総合スコア9058

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

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

tokio-k

2019/10/30 13:29

なるほど! 完璧に気づきませんでした
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問