\r\n```\r\n###ためしたこと\r\n囲んでみたけどダメでした。\r\n```jquery\r\n$(document).ready(function() { \r\n $('main').scroll(function() {\r\n alert('表示されない');\r\n });\r\n});\r\n\r\n```","answerCount":3,"upvoteCount":1,"datePublished":"2019-02-25T09:35:52.915Z","dateModified":"2019-02-25T09:38:04.612Z","acceptedAnswer":{"@type":"Answer","text":"scrollやresizeなど一部のイベントはバブリングしないので、`$(document).on(イベント、セレクタ、function(){})`ではスクロールイベントを拾えません。直接イベントをキャプチャする必要があります。\r\n\r\n追記します。\r\n> 直接イベントをキャプチャする\r\n\r\nとは、動的に追加する要素に直接イベントリスナーを仕込むという意味です。\r\n\r\n作例1\r\n```js\r\n\t$(document).on(\"click\",\"button\", function()\r\n\t{\r\n\t\t/** 追加するスクロール要素にscrollのイベントリスナーを仕込んだ、jQueryオブジェクトを用意 */\r\n\t\tvar $main = $('

Hello

').on(\"scroll\", function(evt){\r\n\t\t\tconsole.log(evt);\t\r\n\t\t});\r\n\t\t/** 用意したjQueryオブジェクトをDOMに追加する */\r\n\t\t$(this).after($main);\r\n\t});\t\r\n```\r\n\r\n作例2\r\n```js\r\n\t$(document).on(\"click\",\"button\", function()\r\n\t{\r\n\t\t/** DOMに追加する */\r\n\t\t$(this).after('

Hello

');\r\n\r\n\t\t/** 追加してからセレクタで追加した要素を探し出し、scrollのイベントリスナーを仕込む */\r\n\t\t$('main').on(\"scroll\", function(evt){\r\n\t\t\tconsole.log(evt);\t\r\n\t\t});\r\n\t});\t\r\n```\r\n\r\nmaimaimeさんのコードに近い記述は作例2ですが、\r\n作例1のほうがコードにつながりが出て、意図が伝わりやすいかなと思います。\r\nイベントリスナーを仕込むタイミングはDOMへの追加前でも後でも問題ありません。\r\nポイントはイベントバブリングされないので、どの要素に対してなのか明確にすることです。","dateModified":"2019-02-26T01:39:00.897Z","datePublished":"2019-02-25T10:31:59.250Z","upvoteCount":3,"url":"https://teratail.com/questions/176388#reply-262461"},"suggestedAnswer":[{"@type":"Answer","text":"htmlに肝心のmain要素が抜けていますね。\r\n\r\n<追記>\r\nすいません、よく質問文読んでいませんでした・・\r\nmain要素は動的に追加されてるんですね、\r\nちょっとしらべてみます。","dateModified":"2019-02-25T10:15:30.615Z","datePublished":"2019-02-25T10:06:13.216Z","upvoteCount":1,"url":"https://teratail.com/questions/176388#reply-262454","comment":[{"@type":"Comment","text":"あると思いますよ。","datePublished":"2019-02-25T10:10:16.316Z","dateModified":"2019-02-25T10:10:16.316Z"},{"@type":"Comment","text":"ご指摘ありがとうございます、早とちりしてました!","datePublished":"2019-02-25T10:15:54.999Z","dateModified":"2019-02-25T10:15:54.999Z"},{"@type":"Comment","text":"だいじょぶですよー。いい情報があればぜひ!","datePublished":"2019-02-25T10:16:44.005Z","dateModified":"2019-02-25T10:16:44.005Z"}]},{"@type":"Answer","text":"ボタンがクリックされたタイミングで追加すればいいと思います。\r\n```jQuery\r\n// スクロール要素の追加\r\n$(document).on(\"click\",\"button\", function(){\r\n $(this).after('

Hello

');\r\n $('main').on(\"scroll\", function(){\r\n alert('表示されない'); \r\n });\r\n}); \r\n```","dateModified":"2019-02-25T10:23:29.199Z","datePublished":"2019-02-25T10:05:36.213Z","upvoteCount":3,"url":"https://teratail.com/questions/176388#reply-262453","comment":[{"@type":"Comment","text":"$('main').on('scroll', function(){\r\n\talert('表示されない');\t\r\n});\t\r\n\r\nですか?できないみたいですね。","datePublished":"2019-02-25T10:09:31.309Z","dateModified":"2019-02-25T10:09:31.309Z"},{"@type":"Comment","text":"main部分のhtmlの記載がないのでどのような構造でどこをどうしたいのか見当がつきませんが、scrollイベントは基本$(window)を使うので。","datePublished":"2019-02-25T10:11:38.790Z","dateModified":"2019-02-25T10:11:38.790Z"},{"@type":"Comment","text":"いえ、スクロールさせたい要素(main)がwidowの中にあるという設定なので、windowについてのイベントじゃないです。\r\n\r\nあとmainはJSでappendしてますけど、これじゃなくてですか?","datePublished":"2019-02-25T10:13:44.992Z","dateModified":"2019-02-25T10:13:44.992Z"},{"@type":"Comment","text":"あ、mainは後から追加するんでしたね。","datePublished":"2019-02-25T10:13:45.693Z","dateModified":"2019-02-25T10:13:45.693Z"},{"@type":"Comment","text":"ですね。むりっぽくないですかこれ?","datePublished":"2019-02-25T10:15:43.731Z","dateModified":"2019-02-25T10:15:43.731Z"},{"@type":"Comment","text":"回答を修正しましたのでお試しを。","datePublished":"2019-02-25T10:23:59.076Z","dateModified":"2019-02-25T10:23:59.076Z"},{"@type":"Comment","text":"すみません今気づきました。ご修正誠にありがとうございます。","datePublished":"2019-02-26T20:25:14.135Z","dateModified":"2019-02-26T20:25:14.135Z"}]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https://teratail.com","name":"トップ"}},{"@type":"ListItem","position":2,"item":{"@id":"https://teratail.com/tags/JavaScript","name":"JavaScriptに関する質問"}},{"@type":"ListItem","position":3,"item":{"@id":"https://teratail.com/questions/176388","name":"jQuery の scroll イベントは .on が効かない!?"}}]}}}
質問するログイン新規登録

Q&A

解決済

3回答

8270閲覧

jQuery の scroll イベントは .on が効かない!?

maimaime

総合スコア17

JavaScript

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

jQuery

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

1グッド

2クリップ

投稿2019/02/25 09:35

編集2019/02/25 09:38

1

2

スクロールイベントに .on が効かないことを発見してしまったのですが、どなたか分かりますか?

動くサンプル:https://jsfiddle.net/jkesLu5m/

###該当のコード
こちらです。クリック(button)で要素(main)を追加し、その後要素にスクロールイベント(alert) が効かないんです。

html

1<button type="button">追加</button> 2 3<style> 4main { 5 height: 300px; 6 background: pink; 7 overflow-y: scroll; 8} 9div { 10 height: 3000px; 11} 12</style> 13 14<script> 15// スクロール要素の追加 16$(document).on("click","button", function(){ 17 $(this).after('<main><div><p>Hello</p></div></main>') 18}); 19 20// スクロールイベント 21$(document).on("load scroll","main", function(){ 22 alert('表示されない'); 23}); 24</script>

###ためしたこと
囲んでみたけどダメでした。

jquery

1$(document).ready(function() { 2 $('main').scroll(function() { 3 alert('表示されない'); 4 }); 5}); 6
flower_tako👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

scrollやresizeなど一部のイベントはバブリングしないので、$(document).on(イベント、セレクタ、function(){})ではスクロールイベントを拾えません。直接イベントをキャプチャする必要があります。

追記します。

直接イベントをキャプチャする

とは、動的に追加する要素に直接イベントリスナーを仕込むという意味です。

作例1

js

1 $(document).on("click","button", function() 2 { 3 /** 追加するスクロール要素にscrollのイベントリスナーを仕込んだ、jQueryオブジェクトを用意 */ 4 var $main = $('<main><div><p>Hello</p></div></main>').on("scroll", function(evt){ 5 console.log(evt); 6 }); 7 /** 用意したjQueryオブジェクトをDOMに追加する */ 8 $(this).after($main); 9 });

作例2

js

1 $(document).on("click","button", function() 2 { 3 /** DOMに追加する */ 4 $(this).after('<main><div><p>Hello</p></div></main>'); 5 6 /** 追加してからセレクタで追加した要素を探し出し、scrollのイベントリスナーを仕込む */ 7 $('main').on("scroll", function(evt){ 8 console.log(evt); 9 }); 10 });

maimaimeさんのコードに近い記述は作例2ですが、
作例1のほうがコードにつながりが出て、意図が伝わりやすいかなと思います。
イベントリスナーを仕込むタイミングはDOMへの追加前でも後でも問題ありません。
ポイントはイベントバブリングされないので、どの要素に対してなのか明確にすることです。

投稿2019/02/25 10:31

編集2019/02/26 01:39
so87

総合スコア789

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

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

maimaime

2019/02/25 10:56 編集

直接イベントをキャプチャする?とは?具体的なコードをご存知であれば教えて頂ければ幸いです。
so87

2019/02/26 01:39

作例1と作例2を追記しました。ご参考になれば幸いです。
maimaime

2019/02/26 20:24

どうもありがとうございます。2パターンのご提示のおかげでより理解が深まりました。
guest

0

ボタンがクリックされたタイミングで追加すればいいと思います。

jQuery

1// スクロール要素の追加 2$(document).on("click","button", function(){ 3 $(this).after('<main><div><p>Hello</p></div></main>'); 4 $('main').on("scroll", function(){ 5 alert('表示されない'); 6 }); 7});

投稿2019/02/25 10:05

編集2019/02/25 10:23
cerfweb

総合スコア1907

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

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

maimaime

2019/02/25 10:09

$('main').on('scroll', function(){ alert('表示されない'); }); ですか?できないみたいですね。
cerfweb

2019/02/25 10:11

main部分のhtmlの記載がないのでどのような構造でどこをどうしたいのか見当がつきませんが、scrollイベントは基本$(window)を使うので。
maimaime

2019/02/25 10:13

いえ、スクロールさせたい要素(main)がwidowの中にあるという設定なので、windowについてのイベントじゃないです。 あとmainはJSでappendしてますけど、これじゃなくてですか?
cerfweb

2019/02/25 10:13

あ、mainは後から追加するんでしたね。
maimaime

2019/02/25 10:15

ですね。むりっぽくないですかこれ?
cerfweb

2019/02/25 10:23

回答を修正しましたのでお試しを。
maimaime

2019/02/26 20:25

すみません今気づきました。ご修正誠にありがとうございます。
guest

0

htmlに肝心のmain要素が抜けていますね。

<追記>
すいません、よく質問文読んでいませんでした・・
main要素は動的に追加されてるんですね、
ちょっとしらべてみます。

投稿2019/02/25 10:06

編集2019/02/25 10:15
yu-smc

総合スコア610

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

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

maimaime

2019/02/25 10:10

あると思いますよ。
yu-smc

2019/02/25 10:15

ご指摘ありがとうございます、早とちりしてました!
maimaime

2019/02/25 10:16

だいじょぶですよー。いい情報があればぜひ!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問