使用 Mouseenter / MouseLeave 更改 JavaScript 中的 Div
Using Mouseenter / MouseLeave to Change Div in JavaScript
我正在尝试使用数组索引来允许一组 div ID 在触发 mouseenter 和 mouseleave 函数时从一个 ID 更改为另一个 ID。
我知道还有其他方法可以做到这一点 - 切换、悬停或 CSS 悬停。这对我来说只是学习,我很新。
下面的代码有注释,基本问题与为什么"largeID"(或smallID)的数组变量输出正确的值,但尝试使用索引值却没有。对于每个 for 语句,当鼠标进入 div 时,我希望将 smallID[i] 值替换为 largeID[i] 值,但我不想为每个语句编写代码,即“ largeID[1], largeID[2].
感谢指点!!
$(document).ready(function() {
var smallID = [];
var largeID = [];
var divList = document.getElementsByTagName('div')[1]; //get the second (radialMenu) div in the document
var radialDivList = divList.getElementsByTagName('div'); // get all divs under the second (radialMenu) div
for(var i = 0; i < radialDivList.length; i++) {
if (!radialDivList[i]) continue; //skip null, undefined and non-existent elements
if (!radialDivList.hasOwnProperty(i)) continue; //skip inherited properties
smallID[i] = radialDivList[i].id; //assign the list of four divs to the smallID array;
largeID[i] = smallID[i] + 'Full'; // add "Full" to each smallID element to make a largeID element
alert(smallID[i]); // alerts for smallID / largeID and smallID[i] / largeID[i]
alert(largeID[i]); // give rational and expected output
$('#' + smallID[i]).mouseenter(function () { //works for all four radial menu divs when mouse enters
//BUT largeID[i] is undefined
alert(largeID[i]); // undefined
alert(largeID); // gives expected output of full array
}).mouseleave(function () { //mouseleave function not working
});
}
您的 largeID[i] 在您的 mouseenter 函数中未定义的原因是 i 的最后一个值被记住并用于您的 mouseenter 事件。
当你使用一个变量时,它会 "out of scope" 自动创建一个闭包,以允许变量仍然存在于仍然需要它的函数中,并且你的 mouseenter 函数都引用同一个变量。
当 i 超过您使用 radialDivList.length 的 div 数量时,您的 for 循环将停止。每次尝试使用 i 引用数组中的索引现在都将超出范围。
本页的第一个答案解释得很好:
JavaScript closure inside loops – simple practical example
我已经修改了您的示例以使用它自己的 "i" 副本创建一个新函数。因此,当悬停在第一个 div 上时,我将等于 0,当悬停在第二个 div 上时,它将等于 1,等等
$(document).ready(function() {
var smallID = [];
var largeID = [];
var divList = document.getElementsByTagName('div')[1]; //get the second (radialMenu) div in the document
var radialDivList = divList.getElementsByTagName('div'); // get all divs under the second (radialMenu) div
var funcs = [];
for (var i = 0; i < radialDivList.length; i++) {
if (!radialDivList[i]) continue; //skip null, undefined and non-existent elements
if (!radialDivList.hasOwnProperty(i)) continue; //skip inherited properties
smallID[i] = radialDivList[i].id; //assign the list of four divs to the smallID array;
largeID[i] = smallID[i] + 'Full'; // add "Full" to each smallID element to make a largeID element
alert(smallID[i]); // alerts for smallID / largeID and smallID[i] / largeID[i]
alert(largeID[i]); // give rational and expected output
funcs[i] = function(i) {
$('#' + smallID[i]).mouseenter(function() { //works for all four radial menu divs when mouse enters
//BUT largeID[i] is undefined
alert(largeID[i]); // undefined
alert(largeID); // gives expected output of full array
}).mouseleave(function() { //mouseleave function not working
});
}.bind(this, i);
}
for (var i = 0; i < funcs.length; i++) {
funcs[i]();
}
});
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<title>Example</title>
</head>
<body>
<div>
<div>
<div id="one" style="background:green;height:40px">
</div>
<div id="two" style="background:red;height:40px">
</div>
<div id="three" style="background:blue;height:40px">
</div>
</div>
</div>
</body>
</html>
我正在尝试使用数组索引来允许一组 div ID 在触发 mouseenter 和 mouseleave 函数时从一个 ID 更改为另一个 ID。
我知道还有其他方法可以做到这一点 - 切换、悬停或 CSS 悬停。这对我来说只是学习,我很新。
下面的代码有注释,基本问题与为什么"largeID"(或smallID)的数组变量输出正确的值,但尝试使用索引值却没有。对于每个 for 语句,当鼠标进入 div 时,我希望将 smallID[i] 值替换为 largeID[i] 值,但我不想为每个语句编写代码,即“ largeID[1], largeID[2].
感谢指点!!
$(document).ready(function() {
var smallID = [];
var largeID = [];
var divList = document.getElementsByTagName('div')[1]; //get the second (radialMenu) div in the document
var radialDivList = divList.getElementsByTagName('div'); // get all divs under the second (radialMenu) div
for(var i = 0; i < radialDivList.length; i++) {
if (!radialDivList[i]) continue; //skip null, undefined and non-existent elements
if (!radialDivList.hasOwnProperty(i)) continue; //skip inherited properties
smallID[i] = radialDivList[i].id; //assign the list of four divs to the smallID array;
largeID[i] = smallID[i] + 'Full'; // add "Full" to each smallID element to make a largeID element
alert(smallID[i]); // alerts for smallID / largeID and smallID[i] / largeID[i]
alert(largeID[i]); // give rational and expected output
$('#' + smallID[i]).mouseenter(function () { //works for all four radial menu divs when mouse enters
//BUT largeID[i] is undefined
alert(largeID[i]); // undefined
alert(largeID); // gives expected output of full array
}).mouseleave(function () { //mouseleave function not working
});
}
您的 largeID[i] 在您的 mouseenter 函数中未定义的原因是 i 的最后一个值被记住并用于您的 mouseenter 事件。
当你使用一个变量时,它会 "out of scope" 自动创建一个闭包,以允许变量仍然存在于仍然需要它的函数中,并且你的 mouseenter 函数都引用同一个变量。
当 i 超过您使用 radialDivList.length 的 div 数量时,您的 for 循环将停止。每次尝试使用 i 引用数组中的索引现在都将超出范围。
本页的第一个答案解释得很好: JavaScript closure inside loops – simple practical example
我已经修改了您的示例以使用它自己的 "i" 副本创建一个新函数。因此,当悬停在第一个 div 上时,我将等于 0,当悬停在第二个 div 上时,它将等于 1,等等
$(document).ready(function() {
var smallID = [];
var largeID = [];
var divList = document.getElementsByTagName('div')[1]; //get the second (radialMenu) div in the document
var radialDivList = divList.getElementsByTagName('div'); // get all divs under the second (radialMenu) div
var funcs = [];
for (var i = 0; i < radialDivList.length; i++) {
if (!radialDivList[i]) continue; //skip null, undefined and non-existent elements
if (!radialDivList.hasOwnProperty(i)) continue; //skip inherited properties
smallID[i] = radialDivList[i].id; //assign the list of four divs to the smallID array;
largeID[i] = smallID[i] + 'Full'; // add "Full" to each smallID element to make a largeID element
alert(smallID[i]); // alerts for smallID / largeID and smallID[i] / largeID[i]
alert(largeID[i]); // give rational and expected output
funcs[i] = function(i) {
$('#' + smallID[i]).mouseenter(function() { //works for all four radial menu divs when mouse enters
//BUT largeID[i] is undefined
alert(largeID[i]); // undefined
alert(largeID); // gives expected output of full array
}).mouseleave(function() { //mouseleave function not working
});
}.bind(this, i);
}
for (var i = 0; i < funcs.length; i++) {
funcs[i]();
}
});
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<title>Example</title>
</head>
<body>
<div>
<div>
<div id="one" style="background:green;height:40px">
</div>
<div id="two" style="background:red;height:40px">
</div>
<div id="three" style="background:blue;height:40px">
</div>
</div>
</div>
</body>
</html>