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

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

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

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

jQuery

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

Q&A

2回答

324閲覧

jQuery プラグイン化した際のhover内の記載方法

shinoru

総合スコア6

JavaScript

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

jQuery

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

0グッド

1クリップ

投稿2022/09/15 02:33

実現したいこと

ロールオーバーで切り替わる画像(画像パスがhoge_offからhoge_onに変わる)を実装しています。
実装は完了しましたが、次にこれをプラグイン化しようと参考書を参考に組んでみました。
その際の不明点になります。

発生している問題・エラーメッセージ

hover内の$(this)が思ったように動きません。
プラグイン化しない場合、アロー関数を使用してもhoverさせた要素のimg要素が正常に取得できていました。
プラグイン化した場合は
①hoverイベント内でアロー関数を使い、ホバーした要素を取得して変化させた
②アロー関数を使用し 誤作動 a要素にsrc属性がついてしまう
③アロー関数未使用→成功
っと挙動が変わってしまい、なぜ変わってしまうのか理解できませんでしたので、知見お持ちの方ご教授いただけますと幸いです。

■html <ul class="menu"> <li><a href="http://example.com/" class="rollover"><img src="images/menu01_off.png" alt="Home" /></a></li> <li><a href="http://example.com/" class="rollover"><img src="images/menu02_off.png" alt="Products" /></a></li> <li><a href="http://example.com/" class="rollover"><img src="images/menu03_off.png" alt="Company" /></a></li> </ul>

該当のソースコード

//プラグイン化 $.fn.rollover = function (options) { options = $.extend({ off: '_off', on: '_on' }, options); this.each(function () { const rollover = $(this); const imgs = rollover.find('img'); const img_off = imgs.attr('src'); const img_on = img_off.replace(/(^.+)_off(\..+)/g, '$1_on$2'); $('<img>').attr('src', img_on); //成功 //①hoverイベント内でアロー関数を使い、ホバーした要素を取得して変化させた // imgs.hover((i,e) => { // console.log($('> img', this)); // $('> img', this).attr('src', img_on); // }, () => { // console.log('hoverオフ'); // $('> img', this).attr('src', img_off); // });//hover //②アロー関数を使用し→誤作動 a要素にsrc属性がついてしまう //https://www.sejuku.net/plus/question/detail/15205 // imgs.hover(()=> { // $(this).attr('src', img_on); // }, ()=> { // $(this).attr('src', img_off); // });//hover //③アロー関数未使用→成功 // imgs.hover(function() { // $(this).attr('src', img_on); // }, function() { // $(this).attr('src', img_off); // });//hover });//each };//end $(function () { $('.menu .rollover').rollover(); }); //プラグイン化なし $(function () { $('.menu').each(function () { const rollover = $(this).find('.rollover'); const imgs = rollover.find('img'); const img_off = imgs.attr('src'); const img_on = img_off.replace(/(^.+)_off(\..+)/g, '$1_on$2'); $('<img>').attr('src', img_on); imgs.hover(() => { $(this).attr('src', img_on); }, () => { $(this).attr('src', img_off); });//hover }); });

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

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

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

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

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

guest

回答2

0

javascriptでアロー関数を使用した場合、スコープが限定されません。

ですので、「imgs.hover」内部のアロー関数式のthisは、その直前のthisです。

アロー関数式

投稿2022/09/15 02:42

Matsumon0104

総合スコア1005

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

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

0

ご回答、誠にありがとうございます。

参考ページ一通り見てみましたが、まだ理解できず…

javascriptでアロー関数を使用した場合、スコープが限定されません。

スコープが限定されない、っというのはアロー関数内のthisは常にどこを指すことになるでしょうか?

ですので、「imgs.hover」内部のアロー関数式のthisは、その直前のthisです。

「アロー関数式のthisは、その直前のthis」というのは、何を指すことになるでしょうか…

投稿2022/09/15 03:12

shinoru

総合スコア6

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

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

yambejp

2022/09/15 03:47

回答への返信はコメント欄をご利用ください
shinoru

2022/09/15 05:28

不慣れですみません、ありがとうとざいます。コメント欄に同内容記載いたします。 ━━━━━━━━━━━━━━━━ ご回答、誠にありがとうございます。 参考ページ一通り見てみましたが、まだ理解できず… javascriptでアロー関数を使用した場合、スコープが限定されません。 スコープが限定されない、っというのはアロー関数内のthisは常にどこを指すことになるでしょうか? ですので、「imgs.hover」内部のアロー関数式のthisは、その直前のthisです。 「アロー関数式のthisは、その直前のthis」というのは、何を指すことになるでしょうか…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問