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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

7990閲覧

目のアイコンでパスワード入力の表示・非表示を切り替えたい。

pondering

総合スコア104

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

1クリップ

投稿2020/11/02 12:49

編集2020/11/02 15:15

やりたいこと

下記ページを参考に、ログインフォームで
パスワード入力の際に目のアイコンを押すと、パスワード表示・非表示の切り替えができる欄を
【パスワード・パスワード確認用】の計2つ作成したいです。
https://kishiken.com/jq/input-password-toggle/
イメージ説明

困っていること

パスワード1つの場合はできたのですが、確認入力用の2つ目の同様のパスワード欄を作成した際に
2つ目のパスワード表示・非表示が切り替わりません。

試したこと

class名やidに変更をして該当のJavaScript部分を2回記述するなどしましたが
うまくいきませんでした。
変更したのは、下記の中のclass3箇所です。
.js-password-toggle
.js-password
.js-password-label

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>テスト</title> <link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet"> </head> <body> <form> <div class="box"> <p>Password</p> <div class="box-pass"> <input class="js-password" type="password" value="" id="pass-login" name="pass-login" maxlength="10" placeholder="99999" required="required"> <input class="js-password-toggle button__input" id="password--eye" type="checkbox" name="password01"> <label class="js-password-label button__label" for="password--eye"><i class="fas fa-eye"></i></label> </div> </div> <div class="box"> <p>Password(確認)</p> <div class="box-pass"> <input class="js-password" type="password" value="" id="pass-login-kakunin" name="pass-login-kakunin" maxlength="10" placeholder="99999" required="required"> <input class="js-password-toggle button__input" id="kakunin--eye" type="checkbox" name="password02"> <label class="js-password-label button__label" for="kakunin--eye"><i class="fas fa-eye"></i></label> </div> </div> </form> <style type="text/css"> .box { display: flex; align-items: center; } p { padding-right: 20px; } .box-pass { width: 200px; position: relative; } .box-pass input { width: 200px; height: 30px; } input.button__input { display: none; } .button__label { position: absolute; right: 10px; top: 5px; } </style> <footer> </footer> <script> const passwordToggle = document.querySelector('.js-password-toggle'); passwordToggle.addEventListener('change', function () { const password = document.querySelector('.js-password'), passwordLabel = document.querySelector('.js-password-label'); if (password.type === 'password') { password.type = 'text'; passwordLabel.innerHTML = '<i class="fas fa-eye-slash"></i>'; } else { password.type = 'password'; passwordLabel.innerHTML = '<i class="fas fa-eye"></i>'; } password.focus(); }); </script> </body> </html>

ご教示いただけますと幸いです。

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

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

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

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

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

hatena19

2020/11/02 14:03

HTMLコード、CSSコードも提示してください。
pondering

2020/11/02 15:15

コメントをありがとうございます。コードを追加いたしました。ぬけておりすみませんでした。
guest

回答2

0

既に正解の回答が出てますので、ダブりますが、

  • querySelectorAllで該当するすべての要素(NodeList)を取得する。
  • NodeListをループで回してイベントを設定する。(ForEachを使いました IE11非対応)
  • テキストボックスとラベルは.js-password-toggleの前後の位置なのでpreviousElementSiblingnextElementSiblingで取得できます。

js

1const passwordToggles = document.querySelectorAll('.js-password-toggle'); 2 3passwordToggles.forEach((el) => { 4 el.addEventListener('change', function () { 5 const password = el.previousElementSibling, 6 passwordLabel = el.nextElementSibling; 7 if (password.type === 'password') { 8 password.type = 'text'; 9 passwordLabel.innerHTML = '<i class="fas fa-eye-slash"></i>'; 10 } else { 11 password.type = 'password'; 12 passwordLabel.innerHTML = '<i class="fas fa-eye"></i>'; 13 } 14 password.focus(); 15 }); 16});

IE11にも対応させるには、for文でループさせるように修正する必要があります。

投稿2020/11/03 01:23

hatena19

総合スコア34075

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

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

pondering

2020/11/03 04:47

ご回答をいただきありがとうございました。 箇条書きでまとめていただいた箇所、何度も確認して自分で解決できるように 学習していきたいと思います。
guest

0

ベストアンサー

querySelectorだと該当した一番最初の要素1つだけを取得するので
querySelectorAllに変更し該当する要素を全て取得させました。
あとはfor文を使いそれぞれの要素ごとに処理させるようにしました。

Javascript

1 const passwordToggle = document.querySelectorAll('.js-password-toggle'); 2 3 for (let i = 0; i < 2; i++) { 4 passwordToggle[i].addEventListener('change', function () { 5 const password = document.querySelectorAll('.js-password'), 6 passwordLabel = document.querySelectorAll('.js-password-label'); 7 if (password[i].type === 'password') { 8 password[i].type = 'text'; 9 passwordLabel[i].innerHTML = '<i class="fas fa-eye-slash"></i>'; 10 } else { 11 password[i].type = 'password'; 12 passwordLabel[i].innerHTML = '<i class="fas fa-eye"></i>'; 13 } 14 password[i].focus(); 15 }); 16 }

投稿2020/11/02 20:48

編集2020/11/02 20:52
Jon_do

総合スコア1373

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

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

pondering

2020/11/03 04:50

お早いご回答をいただきありがとうございました。 querySelectorは最初の要素1つだけの取得の際に使用なのですね。 掲載いただいた内容を自分で消化できるようにしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問