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

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

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

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

JavaScript

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

Q&A

解決済

1回答

3283閲覧

「v-on:scroll」でスクロールイベントが動作しない。

sdice

総合スコア12

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

JavaScript

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

0グッド

0クリップ

投稿2018/09/30 07:25

編集2018/10/01 12:27

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

実現したいことは「vue.js」にて、下記のcomponentで「v-on:scroll="handleScroll"」の指定をしても「handleScroll」メソッドが実行されてくれません。
「v-on:click」などに変更するとクリック時に「handleScroll」メソッドが実行されるのでメソッドの宣言などは正しくは動作していると考えております、対応方法などアドバイス頂ければと考えております。

該当のソースコード

JavaScriopt

1<template> 2 <div class="item-container" v-on:scroll="handleScroll" > 3 ..... 4 </div> 5</template> 6 7export default { 8 name: "taglist", 9 data() { 10 return { 11 }; 12 }, 13 methods: { 14 handleScroll(event){alert("TEST")}, 15 }, 16}; 17</script> 18

試したこと

下記のように自分でイベントをwindowに追加したら動作したのですが、できれば「v-on:scroll」で指定出来ないかと考えております。

JavaScriopt

1 created() { 2 window.addEventListener('scroll', this.handleScroll); 3 }, 4 destroyed() { 5 window.removeEventListener('scroll', this.handleScroll); 6 },

構成につきまして

vue.jsのバージョン「2.9.6」を使用しております。
VueRouterを使用して入れ子になっており、scrollのeventを記載していますのは子コンポーネントのリスト表示の部分となります。
Vue CLIを使用して「vue init weebpack my-app」で構成を作成した後、vue routerへ下記の設定を行いました。

JavaScriopt(index.js)

1import Vue from 'vue' 2import Router from 'vue-router' 3import HelloWorld from '@/components/HelloWorld' 4import DataTest from '@/components/DataTest' 5 6Vue.use(Router) 7export default new Router({ 8 routes: [ 9 { 10 path: '/', 11 name: 'HelloWorld', 12 component: HelloWorld, 13 children: [ 14 { 15 path: '', 16 component: DataTest, 17 } 18 ] 19 } 20 ] 21})

親コンポーネント

JavaScriopt(HelloWorld.vue)

1<template> 2<div> 3 <div class="container"> 4 <div class="row"> 5 <main class="col-12 col-md-8 "> 6 <router-view/> 7 </main> 8 </div> 9 </div> 10</div> 11</template> 12 13<script> 14export default { 15 name: 'layout', 16} 17</script>

子コンポーネント(scrollのeventを設定)

JavaScriopt(DataTest.vue)

1<template> 2 <div v-on:scroll="handleScroll" > 3 <div v-for="item in items" v-bind:key="item.id" > 4 <p>aaaaa</p> 5 </div> 6 </div> 7</template> 8 9<script> 10export default { 11 name: "taglist", 12 data() { 13 return { 14 items: [ 15 {id:"1"}, 16 {id:"2"}, 17 {id:"3"}, 18 {id:"4"}, 19 {id:"5"}, 20 {id:"6"}, 21 {id:"7"}, 22 {id:"8"}, 23 {id:"9"}, 24 ] 25 }; 26 }, 27 methods: { 28 handleScroll(event){ 29 console.log("TEST"); 30 }, 31 } 32}; 33</script>

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

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

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

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

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

spookybird

2018/10/01 02:58

http://jsfiddle.net/eywraw8t/401155/ 試しに作ってみたんですが、正常に動きますね... Vue.jsのバージョンはいくつですか。また、完全に再現できるコードをご提示ください。
sdice

2018/10/01 12:19

vue.jsのバージョンですが「2.9.6」となります。
sdice

2018/10/01 12:21

少し構成情報を追記させて頂きました、お手数をお掛けして大変申し訳ありませんでした。
spookybird

2018/10/01 12:43

スクロールイベントを取ろうとしているdiv要素にスタイルが当たっているように見えないのですが、そのdivにはスクロールバーがあるのでしょうか?
sdice

2018/10/01 15:06 編集

windowのscrollイベントが取得できると考えていました。つまり内部の子コンポーネントのeventでは、親やwindowのscrolleventが取得できないとゆうことですね... お恥ずかしながら、子要素にもeventが伝わるか、どうにかうまく取得できると考えてました。勉強不足にてご迷惑をおかけしました。
guest

回答1

0

ベストアンサー

DOMイベントというのは、「バブリング」といって親要素に向かって伝播していく性質はもっていますが、子要素に向かって伝播することはありません。

例えばこのような構成のとき

html

1<body> 2 <div> 3 <a>Link</a> 4 </div> 5</body>

<a>要素のクリックイベントは途中で意図的に止めない限り<div>にも<body>にも伝播するので、どちらからでもハンドリングできます。
しかし<div>要素のクリックイベントは、親に向かって伝播するので<body>からハンドリングすることはできても、<a>からはハンドリングできません。

ウィンドウ全体のscrollイベントはdocumentで発火するので、documentまたはwindowからのみハンドリングできます。

投稿2018/10/01 23:56

spookybird

総合スコア1803

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

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

sdice

2018/10/03 11:51

バタバタして、ご返信が遅くなり申し訳ありません。 ご回答ありがとうございました。○子->親(×親->子)への伝播について認識いたしました。 今回対応として、「試したこと」で記載した子コンポーネントの「create」にてWindowのscrollイベントのハンドラに子供のハンドラを追加することで対応することに致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問