
jQueryを学習中の者です。
現在、パララックス効果のサンプルコードを参考にしているのですが、理解できずに困っています。
その内容は各ブロック要素をeachでループさせ、ループの中でウインドウのスクロールイベントを登録しコールバック関数で細かい設定をしていくというものです。
理解できないというのは、以前 javasctiptでのfor文による要素へのイベント登録で「イベントでも渡す関数は参照のみです。新たに関数を自動で作成してくれるような事は決してありません。」と説明が有り、コールバック関数内に変数を使うとイベント発生時に変数を参照した時、ループの最後で格納した値になるので、この事は理解し注意もするようにしていました。
しかし、今回のサンプルコードではforとeachの違いはあるけれど、コールバック関数に変数を使っているのに、その変数が別々の値を持っています。
最初はjQueryとjavascriptの挙動の違いかなと思い、以前のfor文のコードを下の様にjQueryで書き替えても結果は一緒でした。
取り留めの無い文章になってしまいましたが、どうして下の2つコードが違う結果になるのかを解り易く説明していただけませんでしょうか。
<table border="1">
<tr><td></td><td></td>...</tr>
...
</table>
<script>
(1)//これだと、駄目…どのtdのイベントでも最後のtdが反応
$(function(){
for(var i =0 ,len=$('td').length;i < len; i++){
var td=$('td').eq(i);
td.mouseover(function(){ td.css('background-color','red');});
td.mouseout(function(){ td.css('background-color','');});
}
});
(2)//これだとOK…ちゃんと各tdが反応する。
$(function(){
$('td').each(function(index,elem){
var td=$(elem);
td.mouseover(function(){ td.css('background-color','red');});
td.mouseout(function(){ td.css('background-color','');});
});
});
</script>
*今回の質問はどう対処したら良いのかという類ではありません。
両方とも変数 td にjqueryオブジェクトを格納して、同じ形式でイベント登録しているのに違う結果になるという事が壁に成ってます。
ネットでいくら調べても構文の説明やサンプルコードは溢れていますが、この様な事例に触れた物が皆無です。
forとeachの違いなんて基本的なことで恥ずかしいのですが、お願いします。
No.2ベストアンサー
- 回答日時:
01function A(){
02 var x = 0;
03
04 function B(){
05 var x = 2;
06 console.log(x);
07 }
08
09 function C(){
10 console.log(x);
11 }
12
13 x = 1;
14 B();
15 C();
16 x = 3;
17 B();
18 C();
19}
B/C関数を定義・・・4行目.9行目
B/C関数を実行・・・14行目.15行目.17行目.18行目
さて、各関数のxは何が表示されるでしょうか?
B関数は、A関数のxとはB関数のxを使用します。
対してC関数はxの宣言が無いので、A関数のxを使用します。
その為
14行目のB関数は2を表示
15行目のC関数は1を表示(13行目で1を入れている)
17行目のB関数は2を表示
18行目のC関数は3を表示(16行目で3を入れている)
これを理解したら、質問の内容に戻って(2)を少し分解してみましょう。
$(function){
function A(index, element){
var td=$(elem);
function B1(){ td.css('background-color','red'); }
function B2(){ td.css('background-color','');}
td.mouseover(B1);
td.mouseout(B2);
}
$('td').each(A);
};
B1/B2関数のtdはA関数のtdが使われるのは理解できると思います。
A関数は$.each関数で何度も実行されますが、
B1/B2関数で使われるtdは各A関数が実行した時のtdなので、正しく動くわけです。
eachではなく、以下のようにA関数を実行したと考えると分かりやすいかもしれません。
var $td = $('td');
A(0, $td[0]);
A(1, $td[1]);
再度の回答と詳細な説明、ありがとうございます。
回答の読み初めで、変数のスコープは分かってるんだけどな…と生意気な事を思ってしまいましたが、その後の分解式で目から鱗が落ちました。
そうですよね、forは要素の数だけ処理を繰り返してるだけ、eachは関数の実行を繰り返してる。
今まではeachを使っても取得や設定だけで、jQueryで初めてeachによる関数の実行に触れたので、思い込みで視界が狭くなっていたと反省してます。
これで、先に進めます。
ありがとうございました。
No.1
- 回答日時:
変数は関数の先頭で宣言されたものとして扱われます。
よって、(1)は以下と同等です。
$(function(){
var td;
for(var i =0 ,len=$('td').length;i < len; i++){
td=$('td').eq(i);
td.mouseover(function(){ td.css('background-color','red');});
td.mouseout(function(){ td.css('background-color','');});
}
});
問題の関数が実行される時、forループは回り後っているので、tdの中身は最後のtd
そのため(1)はうまく動きません。
詳しく知りたい場合は、javascriptの変数スコープについて調べると良いです。
回答、ありがとうございます。
おしゃる通りで(1)のコードの結果は正しいというか、自分の理解に沿ったものになります。
しかし、理解できないのは(2)のコードの結果です。
イベント登録している変数tdとコールバックの関数式のtdとの結び付きはループ処理内では出来ていないと、認識しているのですが、何故か(2)では各セルでコールバック関数が反映しちゃてるんですよね。
ループ処理でもforとeachは結果が違う物なのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- JavaScript jQueryで同じクラス名のものを別物として扱いたい 1 2022/06/17 14:14
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- HTML・CSS テーブルタグのセルの幅の一部だけを指定 1 2023/03/12 12:02
- HTML・CSS 【CSS】:hasで可能? imgを含むtr要素を選択したい 1 2022/11/17 14:36
- Visual Basic(VBA) Selenium.ChromeDriverの使い方について 7 2022/09/22 06:43
- PHP htmlで複数の個数入力欄を表示させるには 1 2022/09/20 03:11
- MySQL SQL任意に並び替えをしたい 2 2023/08/28 10:47
- HTML・CSS 自身のHPにYouTube動画を貼り付けるのが出来なくなり困ってます 1 2022/11/11 10:44
- 工学 【制御工学】単位ステップ応答の遅れ時間の求め方(令和2年度の機械設計技術者試験(制御工学)の問題) 3 2022/11/02 10:51
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プルダウンで選択すると、DBの...
-
javascript クリックすると、あ...
-
ハイパーリンクを別ウインドウ...
-
Excelで作ったhtmlファイルのサ...
-
動的なtableの値を取得したい
-
テーブルの項目の値取得
-
テーブルの変数について
-
特定<table>内の<td>の色を変える
-
jqueryで表に連番No.を追加したい
-
JavaScriptで特定のtdタグにcla...
-
jsで質問です。 displayプロパ...
-
至急!GetElementById でtdの...
-
ブルダウン選択でページの表示...
-
クリックされた罫表セルの行番...
-
Selenium.ChromeDriverの使い方...
-
マウスオーバー時テーブルの背...
-
一覧から選択した行の行番号を...
-
JSで、テーブルのある行のみ、...
-
javascriptで質問です。 displa...
-
javascriptで表のます目と画像...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
特定<table>内の<td>の色を変える
-
ハイパーリンクを別ウインドウ...
-
プルダウンで選択すると、DBの...
-
JavaScriptで特定のtdタグにcla...
-
至急!GetElementById でtdの...
-
一覧から選択した行の行番号を...
-
クリックされた罫表セルの行番...
-
tableの任意行にfocusをあてる
-
javascript クリックすると、あ...
-
チェックボックスにチェックが...
-
マウスをブラウザの外に出した...
-
ブルダウン選択でページの表示...
-
Excelで作ったhtmlファイルのサ...
-
スクロールバーの表示位置を変...
-
動的なtableの値を取得したい
-
ツールチップにテーブル左端列...
-
【UWSC】HTML内のある部分を抽...
-
別ページからOnclickでテーブル...
-
【JQuery】テーブルで行選択さ...
-
JSで、テーブルのある行のみ、...
おすすめ情報