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

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

詳細はこちら
jQuery

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

Q&A

解決済

1回答

1724閲覧

jquery(focusの発火タイミング条件について)

miya_kodori

総合スコア13

jQuery

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

0グッド

0クリップ

投稿2021/03/17 04:09

Q.以下にあるケース2において、
<<“名前:”欄が空白時にfocusが発火するようにコードしてあるにも関わらず、
何故、“名前:”欄が空白でない時に、focusが発火して、名前入力欄の内容を消去することになるのか?
御分りになる方、御教示お願い致します。>>

ケース2のソース上、14~15行目“.focus(function(){//ブルー ~ $(this).val("") 〜”は、
12行目“if($(this).val()==""){”の条件(空欄の時)にだけ実行されるようになっています。
ところが、欄内に”なまえ”文字を入力して、空欄でないにも関わらず、クリック後、“.focus~”が
実行されて空欄になります。

宜しくお願いいたします。

※尚、ケース1で、望む結果となるのですが、・・・!

================================================

(((実行結果)))

ケース1<line_14(one_focus).html>

1)“お名前:”欄に、 "入力してください" が表示される。
2)欄内をクリックすると、空欄になる。
3)欄外をクリックすると、ポップアップ(“値なし”)が表示される。
4)OKを応答後、欄内をクリックする。
5)“入力して!!!”が表示される。
6)欄内に”なまえ”文字を入力する。
7)欄外をクリックすると、ポップアップ(“値あり”)が表示される。
8)OKを応答後、欄内をクリックする。
9)欄内の”なまえ”文字は、そのまま残っている。

ケース2<line_14(focus).html>

1)“お名前:”欄に、 "入力してください" が表示される。
2)欄内をクリックすると、空欄になる。
3)欄外をクリックすると、ポップアップ(“値なし”)が表示される。
4)OKを応答後、欄内をクリックする。
5)“入力して!!!”が表示される。
6)欄内に”なまえ”文字を入力する。
7)欄外をクリックすると、ポップアップ(“値あり”)が表示される。
8)OKを応答後、欄内をクリックする。
9)欄内の”なまえ”文字は、消去される。

A)上記のケース1、2の差異は、

a)実行結果では、9)だけである。

b)ソース上では、14行目
ケース1では、”$(this).val("入力して!!!")~.one("focus",function(){//ブルー”
ケース2では、”$(this).val("入力して!!!")~.focus(function(){//ブルー”

================================================

(((ソース)))

ケース1<line_14(one_focus).html>


<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>line_14(one_focus)</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script> $(function(){ $("input").val("入力してください").css("color","#EDDB35").one("focus",function(){//黄色 $(this).val("").css("color","#E022CE");//赤紫 }).blur(function(){ if($(this).val()==""){ alert('値なし'); $(this).val("入力して!!!").css("color","#7460E8").one("focus",function(){//ブルー<==問題箇所。> $(this).val("").css("color","#45E572");//緑 }); }else{alert('値あり');} }); }); </script> </head> <body> お名前:<input type="text" value=""> </body> </html> *********************************************

ケース2<line_14(focus).html>


<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>line_14(focus)</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script> $(function(){ $("input").val("入力してください").css("color","#EDDB35").one("focus",function(){//黄色 $(this).val("").css("color","#E022CE");//赤紫 }).blur(function(){ if($(this).val()==""){ alert('値なし'); $(this).val("入力して!!!").css("color","#7460E8").focus(function(){//ブルー<==問題箇所。> $(this).val("").css("color","#45E572");//緑 }); }else{alert('値あり');} }); }); </script> </head> <body> お名前:<input type="text" value=""> </body> </html> *********************************************

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

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

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

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

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

shinoharat

2021/03/17 04:58

質問の答えでなくて申し訳ないですが、HTMLは以下のように「バッククォート3つ」で囲ってもらえると助かります。 ``` <!DOCTYPE html> <html lang="ja"> ... </html> ```
guest

回答1

0

ベストアンサー

ケース1では、”$(this).val("入力して!!!")~.one("focus",function(){//ブルー”
ケース2では、”$(this).val("入力して!!!")~.focus(function(){//ブルー”

まさに one('focus', ...)focus() ( on('focus', ...) も同じ)の仕様の差が理由です。

one('focus' 関数) は、one() が呼ばれたあと一回だけfocusイベントが発生したときに関数が呼ばれます。
focus(関数)は、focus()が呼ばれたあと、何回でもfocusイベントが発生するたびに関数が呼ばれます。off() で止めることができます。


既に期待する動作は得られているようですが、

  • イベントハンドラを付け外しするのはコードがややこしくなりがちなので、イベントハンドラは最初から登録しっぱなしにしておいて、対象の状態によって処理を振り分けるほうが楽かもしれません。
  • 「入力してください」のような本来は値でないものを値として表示させるのはトラブルの元です。placeholder属性required属性を使ってしまってよいのではないでしょうか。

質問文の手順に沿って何が起きているか書いてみました。

1)“お名前:”欄に、 "入力してください" が表示される。
2)欄内をクリックすると、focusイベントが発生し、イベントハンドラで空欄になる。
3)欄外をクリックすると、blurイベントが発生し、イベントハンドラでポップアップ(“値なし”)が表示される。
4)OKを応答後、“入力して!!!”が表示される。focusイベントハンドラが登録される
5)欄内をクリックする。focusイベントが発生し、ステップ4で登録済みのイベントハンドラが空欄にする。
6)欄内に”なまえ”文字を入力する。
7)欄外をクリックすると、blurイベントが発生し登録済みのイベントハンドラでポップアップ(“値あり”)が表示される。
8)OKを応答後、欄内をクリックする。focusイベントが発生し、ステップ4で登録済みのイベントハンドラでステップ9が実行される
9)欄内の”なまえ”文字は、消去される。

投稿2021/03/17 04:57

編集2021/03/18 07:19
int32_t

総合スコア21679

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

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

miya_kodori

2021/03/18 06:05

迅速に回答して頂き、ありがとうございます。 私が知りたかったのは、”~focus(function(){//ブルー<==~”が、”if($(this).val()==""){”すなわち、空白のときに発火する条件が付いているにも関わらず、欄内に”なまえ”文字を入力した(空白でない)時に何故発火してしまうのかということです。 すみません。ややこしいのですが!!!
int32_t

2021/03/18 06:24 編集

質問文のステップ5でいったん空白の条件を満たして .focus(...) でイベントハンドラを登録すると、登録解除しない限りはフォーカスする度に登録したイベントハンドラが呼ばれます。空白の条件は「イベントハンドラを登録するかどうか」の条件であって、登録後は空白の条件は「イベントハンドラが呼ばれるかどうか」とは関係ありません。
miya_kodori

2021/03/20 11:46

丁寧に説明して頂き、感謝しております。登録するという意味が分かった様な気分なのですが、イベントハンドラーに魂をいれるとでも解釈すればよいのでしょうか?実はこのコーディングソースは、jqueryの参考書に例文として載っていたもので、私にとって見たことがないタイプで悩みました。 最初に回答いただいた”~イベントハンドラは最初から登録しっぱなしにしておいて、〜"とは、if文などのある条件付きのネスト中のイベントハンドラは、止めたほうが良いということですね! いろいろとありがとうございました。
miya_kodori

2021/03/21 10:04

たいへん厚かましい質問のですが、「イベントハンドラを登録する」とは、登録する場所は、何処で?何か特別な名前?があるのでしょうか?よろしくお願い申し上げます。
FKM

2021/03/29 05:15

横から失礼します。「イベントハンドラを登録する」というより、ブラウザにイベントを記憶させておくという言い方のほうがしっくりくるかと思います。
int32_t

2021/03/29 05:38

おお、コメント見逃してました。 「イベントハンドラを登録する」とは、jQuery の one() focus() on() click() などを関数を渡して呼び出すことです。渡した関数のことをイベントハンドラやイベントリスナと呼びます。登録先はブラウザだと思っておけばよいです。イベントが起きたときに、ブラウザが登録された関数を呼びます。
miya_kodori

2021/04/05 09:57

いろいろありがとうございました。ご回答のお陰で、現象を裏付ける正しい理論を得られて満足しております。正しく理解しておかないと応用も効かず、後日、混乱する為、何度も質問することになりました。 また、よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問