我正在努力使我的代码更简洁(即重复代码更少)。我已经从我的主管那里得到了一些关于如何使我最近的代码更简洁的建议,但我不确定如何做到这一点。
我有一些坐标用于检查用户是否在div的某个区域内点击。我被告知我应该将所有坐标放在一个数组中并“循环”以便在需要时获取它们。我想 - 我理解他的建议,但由于我还缺乏编程经验,所以我无法完全理解它。这是我到目前为止所做的工作,因此您可以更好地了解正在发生的事情:
$("#div1").click(function(e)
{
// Arrays containing the x and y values of the rectangular area around a farm
// [minX, maxX, minY, maxY]
var div1_Coord_Area1= [565, 747, 310, 423];
var div1_Coord_Area2= [755, 947, 601, 715];
if(areaX >= Reg2_Coord_Farm1[0] && areaX <= Reg2_Coord_Farm1[1] && areaY >= Reg2_Coord_Farm1[2] && areaY <= Reg2_Coord_Farm1[3])
{
alert("You clicked in the first area");
}
if(areaX >= Reg2_Coord_Farm2[0] && areaX <= Reg2_Coord_Farm2[1] && areaY >= Reg2_Coord_Farm2[2] && areaY <= Reg2_Coord_Farm2[3])
{
alert("You clicked in the second area");
}
});
不要担心我如何进行计算;我把这个代码留在了方法之外,因为它基本上是无关紧要的,但如果你想知道的话就是。
我为每组坐标创建了一个数组,然后简单地调用它们。然而,这并不是“遍历”一个充满了每个区域的所有坐标的巨大阵列。你能想出一种做到这一点的方法,或者是我现在能做的最好的事情吗?
答案 0 :(得分:2)
从第一次和非常快速的一瞥,您可以将点击区域提取到一个单独的功能中。
像这样。
$("#div1").click(function(e)
{
// Arrays containing the x and y values of the rectangular area around a farm
// [minX, maxX, minY, maxY]
var div1_Coord_Area1= [565, 747, 310, 423];
var div1_Coord_Area2= [755, 947, 601, 715];
if(inArea(div1_Coord_Area1, someStructForMouseLocation))
{
alert("You clicked in the first area");
}
if(inArea(div1_Coord_Area2, someStructForMouseLocation))
{
alert("You clicked in the second area");
}
});
function inArea(coordArea, mouseLocation)
{
return mouseLocation.X >= coordArea[0] && mouseLocation.X <= coordArea[1] && mouseLocation.Y >= coordArea[2] && mouseLocation.Y <= coordArea[3]
}
你似乎在var div1_Coord_Area1= [565, 747, 310, 423];
和var div1_Coord_Area2= [755, 947, 601, 715];
中也有一些'魔术'数字我会考虑将它们作为全局变量,因此它们不在点击功能的范围内。
它会像
一样// Arrays containing the x and y values of the rectangular area around a farm
// [minX, maxX, minY, maxY]
var div1_Coord_Area1= [565, 747, 310, 423];
var div1_Coord_Area2= [755, 947, 601, 715];
$("#div1").click(function(e)
{
if(inArea(div1_Coord_Area1, someStructForMouseLocation))
{
alert("You clicked in the first area");
}
if(inArea(div1_Coord_Area2, someStructForMouseLocation))
{
alert("You clicked in the second area");
}
});
function inArea(coordArea, mouseLocation)
{
return mouseLocation.X >= coordArea[0] && mouseLocation.X <= coordArea[1] && mouseLocation.Y >= coordArea[2] && mouseLocation.Y <= coordArea[3]
}
希望您能看到我的流程是进一步完善之一。首次创建方法时,不要期望编写干净的代码。之后你必须看看它,看看它是否讲述了一个故事。另一个变化是div1_Coord_Area1
的名称,该名称是否真的重新计算变量的意图?不会。HotSpotArea1
意味着更多吗?请记住,您正在使用代码讲述故事。你做的越多,下一个人使用最少的脑循环来更好地阅读代码。
你必须不断完善以获得非常干净的代码。
答案 1 :(得分:2)
我认为他的意思更像是这样:
$("#div1").click(function(e){
// Arrays containing the x and y values of the rectangular area around a farm
// For each array: [area1, area2, area3, ... areaX]
var minX = [565, 755];
var maxX = [747, 947];
var minY = [310, 601];
var maxY = [423, 715];
for (var i = 0; i < minX.length; i++) {
if (areaX >= minX[i] && areaX <= maxX[i] && areaY >= minY[i] && areaY <= maxY[i]) {
alert("You clicked in area " + (i+1));
}
}
});
这样,您可以检查更多区域,但不必更改循环,因为它将始终遍历数组中的所有项目,如上面的2,或10或100。
答案 2 :(得分:1)
如果我是你,我会把你的区域对象:
// think of this as your ClickArea class
function ClickArea(minX, maxX, minY, maxY, description) {
this.minX = minX;
this.maxX = maxX;
this.minY = minY;
this.maxY = maxY;
this.description = description;
};
ClickArea.prototype.isInside = function(areaX, areaY) {
return (areaX >= this.minX && areaX <= this.maxX && areaY >= this.minY && areaY <= this.maxY);
};
现在,您可以创建一个ClickArea对象:
var area = new ClickArea(565, 747, 310, 423, "Area 1");
但是你会想要它们在数组中,所以我建议像这样创建它们:
var areas = [
new ClickArea(565, 747, 310, 423, "Area 1"),
new ClickArea(365, 745, 330, 423, "Area 2")
];
// you can also add new ClickAreas using the array's push method:
areas.push(new ClickArea(333, 444, 555, 566, "Area 3"));
然后,您可以使用for循环遍历它们:
for(var i = 0; i < areas.length; i++) {
if(areas[i].isInside(areaX, areaY)) {
alert("You clicked in " + areas[i].description);
}
}