切换菜单的 A 框按钮不起作用

时间:2021-04-24 12:21:16

标签: html toggle aframe togglebutton

切换菜单工作不正常。它在某些情况下工作,例如“菜单二”工作正常。我认为,在其他菜单中完全相同,但那里的按钮不起作用。在菜单三、四和六中,我可以进入,但无法使用其他按钮。

我真的不明白这个问题。有人看到我的错误吗?我会很高兴。祝一切顺利,谢谢。

我在 WeTransfer 中上传了索引,因为很难确定代码的哪一部分有问题,请参见图片。

link preview

2 个答案:

答案 0 :(得分:0)

运行文件时出现以下错误:

<块引用>

未捕获的类型错误:无法读取 null 的属性 'querySelectorAll'
index.html:28

就是这一行:

28 | var menuItems = menu.querySelectorAll(".clickable");

这意味着“菜单”为空。在您的代码中:

26 | var menu = this.data;

这也意味着此代码将无法工作(甚至可能不会尝试,因为上面有错误)

66 |

for (var i = 0; i < menuItems.length; i++) {
    // classList.replace() is not currently supported in Microsoft Edge and Samsung Internet.
    // menuItems[i].classList.replace('clickable-disabled', 'clickable');
    // Workaround
    menuItems[i].classList.remove("clickable-disabled");
    menuItems[i].classList.add("clickable");
}

72 |

我不知道是什么元素抛出错误,但我希望这会为您指明正确的方向。

答案 1 :(得分:0)

感谢您的回答。实际上问题是我确实用平面而不是实体定义了按钮。所以我想通了。但是性能真的很差,我改变了光标,所以光标是鼠标,它的工作真的很糟糕。你知道我可以如何提高性能吗?

free

和:AFRAME.registerComponent("toggle-menu", { dependencies: ["raycaster"], schema: { type: "selector" }, // menu.object3D.visible doesn't show correct value when init() is used, possibly due to load order. Use play() instead. play: function() { var button = this.el; var scene = this.el.sceneEl; var cursor = scene.querySelector("[raycaster]"); var menu = this.data; var menus = scene.querySelectorAll(".menu"); var menuItems = menu.querySelectorAll(".clickable"); // Replace .clickable with .clickable-disabled for our menu if it's hidden and refresh raycaster. if (!menu.object3D.visible) { for (var i = 0; i < menuItems.length; i++) { // classList.replace() is not currently supported in Microsoft Edge and Samsung Internet // menuItems[i].classList.replace('clickable', 'clickable-disabled'); // Workaround menuItems[i].classList.remove("clickable"); menuItems[i].classList.add("clickable-disabled"); } // Refresh raycaster. cursor.components.raycaster.refreshObjects(); } // Define handler function for event listener. function clickHandler(e) { // If our menu is already visible, return and exit function. if (!!menu.object3D.visible) return; // Hide all menus. for (var i = 0; i < menus.length; i++) { // If menu is our menu, skip to next menu in the loop. if (menus[i] === menu) continue; // Get each menu's items. var items = menus[i].querySelectorAll(".clickable"); // Hide each menu. menus[i].object3D.visible = false; // Disable each menu's items by temporarily removing class. for (var j = 0; j < items.length; j++) { // Replace class. // classList.replace() is not currently supported in Microsoft Edge and Samsung Internet. // items[j].classList.replace('clickable', 'clickable-disabled'); // Workaround items[j].classList.remove("clickable"); items[j].classList.add("clickable-disabled"); } } // Only show our menu. menu.object3D.visible = true; // Make our menu's items clickable. for (var i = 0; i < menuItems.length; i++) { // classList.replace() is not currently supported in Microsoft Edge and Samsung Internet. // menuItems[i].classList.replace('clickable-disabled', 'clickable'); // Workaround menuItems[i].classList.remove("clickable-disabled"); menuItems[i].classList.add("clickable"); } // Refresh raycaster objects. cursor.components.raycaster.refreshObjects(); } // Add event listener to the button. button.addEventListener("click", clickHandler); } });