我正在使用横跨网页的整个宽度和长度的画布。每当我在画布上的任何地方点击,向任何方向移动我的鼠标,我都可以创建盒子,一旦我释放盒子就会创建。想想选择如何在任何桌面上工作,但在mouseup
上,选择框在画布上绘制。
我的问题是我想在mouseover
我创建的任何一个框时更新光标。我将它们存储在名为panels的数组中。
function mouseOverPanels(e) {
var mouseX = e.clientX, mouseY = e.clientY;
// loop through all the panels
for (var i = 0; i < panels.length; i++) {
// if cursor is within the bounds of one of the panels, update cursor
if ((mouseX >= panels[i].x && mouseX <= panels[i].x + panels[i].width) && (mouseY >= panels[i].y && mouseY <= panels[i].y + panels[i].height)) {
canvas.style.cursor = "pointer";
}
// if not, then set the cursor to "crosshair" (default)
else canvas.style.cursor = "crosshair";
}
}
此代码正常运行。当我第一次创建一个面板时,如果我将鼠标悬停在它上面,它会正确注册光标在其边界内并相应地更新光标。但是,每当我创建新面板时,此功能都会停止更新所有先前面板的光标,并且仅适用于创建的最新面板,即使每次鼠标悬停在前面板上时它都能正确注册,它也不会更新光标在其范围内。
思考?解决方案必须完全使用javascript实现,而不使用库。
答案 0 :(得分:3)
这是因为你的if/else
将在每个循环中发生 ,所以只有最终循环的结果才会相关,就好像你没有一个循环,只使用了panels[panels.length - 1]
。
相反,设置默认值,然后在找到相关条目时设置指针(并停止循环):
// loop through all the panels
var cursor = "crosshair";
for (var i = 0; i < panels.length; i++) {
// if cursor is within the bounds of one of the panels, update cursor
if ((mouseX >= panels[i].x && mouseX <= panels[i].x + panels[i].width) && (mouseY >= panels[i].y && mouseY <= panels[i].y + panels[i].height)) {
cursor = "pointer";
break;
}
}
canvas.style.cursor = cursor;