Aframe WebVR应用:JavaScript拆分ID并设置animation属性问题
问题分析与修复方案
我一眼就看出你代码里的两个核心问题啦:一是事件回调里的this指向搞混了,二是你把拆分出来的字符串直接当成A-Frame元素来调用方法——字符串可没有setAttribute这个能力哦!咱们一步步把问题理顺:
1. 先搞定this的指向问题
你现在用的是普通function作为点击回调,这里面的this其实指向的是触发点击的那个DOM元素,但如果想更清晰地控制上下文,换成箭头函数会更省心——箭头函数不会绑定自己的this,它会直接继承外层组件实例的this,这样你想访问组件的el或者场景元素都会更方便。
2. 正确获取目标元素再操作
你拆分this.id得到的boxid是个字符串(比如原id是box-yellow的话,boxid就是"box"),直接对字符串调用setAttribute肯定会报错。你得先用这个id字符串找到对应的A-Frame元素,再去调用方法才行。
修复后的完整代码
AFRAME.registerComponent('remove-yellow', { init: function () { // 用箭头函数继承组件实例的this,避免上下文混乱 this.el.addEventListener('click', (evt) => { console.log(this.el.id); // 明确指向组件挂载的元素id const idSegments = this.el.id.split("-"); // 加个判断,防止id格式不符合预期导致报错 if (idSegments.length < 1) return; const boxId = idSegments[0]; console.log(boxId); // 通过场景容器查找目标元素,确保在A-Frame场景内精准定位 const targetBox = this.el.sceneEl.querySelector(`#${boxId}`); // 先检查元素是否存在,避免找不到元素时抛出错误 if (targetBox) { targetBox.setAttribute("animation__scale", "property: scale; from: 1 1 0.01; to: 0.001 0.001 0.001; dur: 150"); } else { console.warn(`找不到目标元素#${boxId}哦`); } }); } });
额外的小优化建议
- 用
const替代var,避免变量提升带来的潜在问题,代码可读性也更好; - 增加拆分后的长度判断,防止遇到不符合
xxx-xxx格式的id时出错; - 加上目标元素的存在性检查,避免控制台出现找不到元素的报错信息。
内容的提问来源于stack exchange,提问作者Daryl Tan
相关产品推荐
相关产品推荐

