\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 = $('').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('');\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('');\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 が効かない!?"}}]}}}
スクロールイベントに .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
ベストアンサー
scrollやresizeなど一部のイベントはバブリングしないので、$(document).on(イベント、セレクタ、function(){})ではスクロールイベントを拾えません。直接イベントをキャプチャする必要があります。
追記します。
直接イベントをキャプチャする
とは、動的に追加する要素に直接イベントリスナーを仕込むという意味です。
作例1
js
1 $(document).on("click","button", function()
2 {
3
4 var $main = $('<main><div><p>Hello</p></div></main>').on("scroll", function(evt){
5 console.log(evt);
6 });
7
8 $(this).after($main);
9 });
作例2
js
1 $(document).on("click","button", function()
2 {
3
4 $(this).after('<main><div><p>Hello</p></div></main>');
5
6
7 $('main').on("scroll", function(evt){
8 console.log(evt);
9 });
10 });
maimaimeさんのコードに近い記述は作例2ですが、
作例1のほうがコードにつながりが出て、意図が伝わりやすいかなと思います。
イベントリスナーを仕込むタイミングはDOMへの追加前でも後でも問題ありません。
ポイントはイベントバブリングされないので、どの要素に対してなのか明確にすることです。
ボタンがクリックされたタイミングで追加すればいいと思います。
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});
htmlに肝心のmain要素が抜けていますね。
<追記>
すいません、よく質問文読んでいませんでした・・
main要素は動的に追加されてるんですね、
ちょっとしらべてみます。
15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

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

テンプレート機能で
簡単に質問をまとめる
質問する
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/25 10:56 編集
2019/02/26 01:39
2019/02/26 20:24