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

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

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

Three.jsはWebGLをサポートしているJavaScriptの3D描画用ライブラリです。

JavaScript

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

Q&A

解決済

1回答

1705閲覧

removeEventListenerが効かない

te_ff

総合スコア13

Three.js

Three.jsはWebGLをサポートしているJavaScriptの3D描画用ライブラリです。

JavaScript

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

0グッド

0クリップ

投稿2021/02/25 11:14

前提・実現したいこと

Three.jsを利用し、360度動画を複数再生するWebサイトを作成しています。
メインで再生している動画にカメラの位置を変更するEventListnerを付与し、動画を切り替えた際に付与したイベントをremoveEventListenerで削除したいのですが削除できません
調査すると引数が異なることにより起こっているのかと推測していますが解決策あればご教授いただきたいです。
また、Three.jsで360度動画再生は下記ページを参考にさせていただきました。
https://sterfield.co.jp/designer/three-js%E3%81%A7360%E3%83%91%E3%83%8E%E3%83%A9%E3%83%9E%E5%8B%95%E7%94%BB%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B/

該当のソースコード

JavaScript

1//イベントの振り分け 2var EVENT = {}; 3if ('ontouchstart' in window) { 4 EVENT.TOUCH_START = 'touchstart'; 5 EVENT.TOUCH_MOVE = 'touchmove'; 6 EVENT.TOUCH_END = 'touchend'; 7} else { 8 EVENT.TOUCH_START = 'mousedown'; 9 EVENT.TOUCH_MOVE = 'mousemove'; 10 EVENT.TOUCH_END = 'mouseup'; 11} 12 13var onMouseDownMouseX = 0, onMouseDownMouseY = 0, 14lon = 0, onMouseDownLon = 0, 15lat = 0, onMouseDownLat = 0, 16phi = 0, theta = 0; 17 18// 球体作成関数 19function createThreeDimVideo(elem, index){ 20 var camera, scene, renderer, video, texture, container; 21 22 init(); 23 tick(); 24 25 function init(){ 26 ... 省略 ... 27 // onDocumentMouseMoveでカメラの位置を変更するためeventとcameraを渡す 28 if(index == 0){ 29 renderer.domElement.addEventListener( EVENT.TOUCH_START, onDocumentMouseDown.bind(renderer.domElement, camera), false ); 30 } 31 ... 省略 ... 32 } 33 function onWindowResize () { 34 ... 省略 ... 35 } 36 function tick() { 37 ... 省略 ... 38 } 39};

JavaScript

1// 以下動画切り替え時に利用したいため関数として切り離す 2function onDocumentMouseDown( camera, event ) { 3 event.preventDefault(); 4 if(event.clientX) { 5 onMouseDownMouseX = event.clientX; 6 onMouseDownMouseY = event.clientY; 7 } else if(event.touches) { 8 onMouseDownMouseX = event.touches[0].clientX 9 onMouseDownMouseY = event.touches[0].clientY; 10 } else { 11 onMouseDownMouseX = event.changedTouches[0].clientX 12 onMouseDownMouseY = event.changedTouches[0].clientY 13 } 14 onMouseDownLon = lon; 15 onMouseDownLat = lat; 16 document.addEventListener( EVENT.TOUCH_MOVE, onDocumentMouseMove.bind(document, camera), false ); 17 document.addEventListener( EVENT.TOUCH_END, onDocumentMouseUp.bind(document, camera), false ); 18} 19function onDocumentMouseMove( camera, event ) { 20 event.preventDefault(); 21 if(event.clientX) { 22 var touchClientX = event.clientX; 23 var touchClientY = event.clientY; 24 } else if(event.touches) { 25 var touchClientX = event.touches[0].clientX 26 var touchClientY = event.touches[0].clientY; 27 } else { 28 var touchClientX = event.changedTouches[0].clientX 29 var touchClientY = event.changedTouches[0].clientY 30 } 31 lon = ( touchClientX - onMouseDownMouseX ) * -0.3 + onMouseDownLon; 32 lat = ( touchClientY - onMouseDownMouseY ) * -0.3 + onMouseDownLat; 33 34 lat = Math.max( - 85, Math.min( 85, lat ) ); 35 phi = THREE.Math.degToRad( 90 - lat ); 36 theta = THREE.Math.degToRad( lon ); 37 camera.position.x = 100 * Math.sin( phi ) * Math.cos( theta ); 38 camera.position.y = 100 * Math.cos( phi ); 39 camera.position.z = 100 * Math.sin( phi ) * Math.sin( theta ); 40 camera.lookAt( 0, 0, 0 ); 41} 42 43// onDocumentMouseMoveが削除されない 44 45function onDocumentMouseUp( camera, event ) { 46 document.removeEventListener( EVENT.TOUCH_MOVE, onDocumentMouseMove.bind(document, camera), false ); 47 document.removeEventListener( EVENT.TOUCH_END, onDocumentMouseUp.bind(document, camera), false ); 48} 49

JavaScript

1var elems = Array.from(document.getElementsByTagName('video')); 2elems.forEach(function(video, index){ 3 createThreeDimVideo(video, index); 4});

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

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

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

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

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

guest

回答1

0

ベストアンサー

javascript

1 document.addEventListener( EVENT.TOUCH_MOVE, onDocumentMouseMove.bind(document, camera), false ); 2 document.addEventListener( EVENT.TOUCH_END, onDocumentMouseUp.bind(document, camera), false ); 3 ... 4 document.removeEventListener( EVENT.TOUCH_MOVE, onDocumentMouseMove.bind(document, camera), false ); 5 document.removeEventListener( EVENT.TOUCH_END, onDocumentMouseUp.bind(document, camera), false );

bind()は、毎回新しい関数を生成します。なので、同じ関数からbind()しても、addEventListener()removeEventListener()で異なる関数を指定していることになります。bind()の結果を変数に入れておくなどしてください。

投稿2021/02/25 14:36

int32_t

総合スコア20884

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

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

te_ff

2021/02/26 01:12

ありがとうございます! 実現できました! var mouseMoveEvent; ... document.addEventListener( EVENT.TOUCH_MOVE, mouseMoveEvent = onDocumentMouseMove.bind(document, camera), false ); ... document.removeEventListener( EVENT.TOUCH_MOVE, mouseMoveEvent, false );
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問