javascript - 为什么添加另一个事件监听器后 FirstPersonControls.js 会停止运行?

标签 javascript events three.js

我正在尝试使用 FirstPersonControls.js 编写一个用于移动的 3d 环境,并为鼠标单击监听器编写以下内容:

function onDocumentMouseDown(event) {

    event.preventDefault();

    var vector = new THREE.Vector3((event.clientX / window.innerWidth) * 2 - 1, -(event.clientY / window.innerHeight) * 2 + 1, 0.5);
    projector.unprojectVector(vector, camera);

    var raycaster = new THREE.Raycaster(camera.position, vector.sub(camera.position).normalize());

    var intersects = raycaster.intersectObjects(adblocks);

    if (intersects.length > 0) {

        intersects[0].object.material.color.setHex(Math.random() * 0xffffff);


    }
}

在 init() 中:

document.addEventListener('mousedown', onDocumentMouseDown, false);

我已经在另一个文档中完成了此操作,并且效果很好,但是,这次我尝试包含 FirstPersonControls.js。

在 FirstPersonControls.js 中,我通过注释掉监听器来禁用 mousedown 和 mouseup 监听器,如下所示:

//this.domElement.addEventListener( 'mousedown', bind( this, this.onMouseDown ), false );
//this.domElement.addEventListener( 'mouseup', bind( this, this.onMouseUp ), false );

效果很好。 FirstPersonControls.js 本身工作得很好。但是,当我为 MouseDown 事件添加额外的监听器时,键输入(w、a、s、d、q、r 和 f)停止响应。如果我在页面加载时立即按住某个键,该键将一直工作,直到我停止,然后一切都会停止响应。另外,另一件事我不明白,这可能是相关的,这就是我提到它的原因,如果我在 FirstPersonControls.js 中注释掉这一行:

this.domElement.addEventListener( 'mousemove', bind( this, this.onMouseMove ), false );

没有任何改变。一切都保持完全相同的功能,这对我来说没有意义,因为我认为这就是 mousemovement 事件绑定(bind)到文档的地方。

最佳答案

FirstPersonControl.js 脚本添加了 mousedown 事件的监听器函数。你的代码也是如此。当 mousedown 事件发生时,首先调用最后一个事件处理程序,通常,应随后调用其他事件处理程序。然而,这个:

event.preventDefault();

防止事件冒泡到其他事件处理程序。我相信删除这一行应该足以解决您所描述的问题。

关于javascript - 为什么添加另一个事件监听器后 FirstPersonControls.js 会停止运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18679022/

相关文章:

javascript - 如何消除javascript中 "Leave Site"的警报?

javascript - 在 three.js 中使用 THREE.GLTFLoader 导入和播放多个动画

javascript - 如何制作 iFrame 幻灯片?

javascript - 我的 reveal on hover 功能不起作用,为什么?

javascript - 在 JavaScript 中识别 lastclick

javascript - Three.js - 相机的良好 z 距离,可以看到盒子的全景

javascript - ThreeJS AdditiveBlending、ShaderMaterial、DepthTest问题

javascript - 使用 GLTFLoader : RangeError: Invalid typed array length: 4 加载 gltf 文件时出错

javascript - 如何使用 Javascript 验证 HTML?

mysql - 创建一个带条件的 mysql 事件