为什么addEventListener只执行我的函数,而不为其创建鼠标悬停/鼠标打开事件
Why is addEventListener only executing my function but not creating a mouseover/mouseon event for it?
我有一个作业,我似乎无法弄清楚这一部分:我编写了一个 Javascript 函数来预加载/预缓存每个图像标签的两个图像,基于 img-html 标签的 ID 从"img"文件夹中。这部分工作正常。
但是,使用 addEventListener
更改mouseover
和mouseout
图像的功能似乎不起作用,我似乎无法弄清楚为什么!如果我调试,我可以看到图像加载正常并且没有错误。然而,mouseover
它似乎不起作用!
网页:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="author" content="Nilay Panchal"/>
<meta name="description" content="Part 1 Assignment 3"/>
<title>HomePage</title>
<script src="js/breadcrumb.js"></script>
<script src="js/preloader.js"></script>
<script type="text/javascript">
function animal(name,scientificName,typeOfFood,sleepingPattern,size) {
this.name = {
realName:name,
scientificName:scientificName
};
this.typeOfFood = typeOfFood;
this.sleepingPattern = sleepingPattern;
this.size = size;
}
function makeNewAnimal(name, scientificName, typeOfFood,sleepingPattern,size) {
var animalClicked = new animal(name, scientificName, typeOfFood,sleepingPattern,size);
var finalStringObject = "{"+myOwnRecursiveToStringMethod(animalClicked,"")+"}";
document.getElementById("stringOfObject").value = finalStringObject;
var backToObject = parseStringAndConvertToObject(finalStringObject);
document.getElementById("jsonDisplay").value = backToObject;
}
function myOwnRecursiveToStringMethod(objectToParse, outputString) {
var first = 1;
for(nameOfProperty in objectToParse){
if(objectToParse[nameOfProperty] instanceof Object) {
outputString += nameOfProperty+":{";
outputString = myOwnRecursiveToStringMethod(objectToParse[nameOfProperty],outputString);
outputString += "},";
} else{
outputString = outputString + nameOfProperty +":'"+ objectToParse[nameOfProperty]+"',";
}
}
if(outputString.charAt(outputString.length-1) == ',') {
outputString = outputString.slice(0,-1);
}
return outputString;
}
function parseStringAndConvertToObject(finalString) {
eval("var backToObject = "+finalString);
return backToObject;
}
</script>
</head>
<body>
<h3>Navigation List:</h3>
<nav id="navigationBar" style="border-style: double ;border-width: 10">
<ul>
<li><a href="#">Assignment 3 Root</a></li>
<li><a href="Animals/index.html">All Animals</a>
<ul>
<li><a href="Animals/Insects.html">Insects.html</a></li>
<li><a href="Animals/Birds/index.html">Birds-Aves</a>
<ul>
<li><a href="Animals/Birds/Pelican/index.html">The Mighty Pelican</a></li>
</ul>
</li>
<li><a href="Animals/Giraffe/index.html">The Tall Giraffe</a></li>
<li><a href="Animals/Rhino/index.html">The Hefty Rhinoceros</a></li>
</ul>
</li>
</ul>
</nav>
<div style="border-style:groove;padding-bottom: 10px;padding-left: 10px">
<h4><u>BREADCRUMB:</u></h4>
<div id="breadcrumb"></div>
</div>
<div style="text-align: center">
<h3><u>Please click on any of the images below and the JSON object of the animals data will be displayed in the text area below!</u></h3>
<a href="javascript:void(0);" onclick="makeNewAnimal('Pelican','Pelecanus','Pescatarian','Diurnal','Small')"><img style="width:300px;height:300px" id='pelican' alt="Pelican"/></a>
<a href="javascript:void(0);" onclick="makeNewAnimal('Rhinoceros','Rhinocerotidae','Herbivore','Diurnal','Large')"><img style="width:500px;height:300px" id="rhino" alt="Rhinoceros"/></a>
<br>
<a href="javascript:void(0);" onclick="makeNewAnimal('Giraffe','Giraffa camelopardalis','Herbivore','Diurnal','Very Large')"><img style="width:500px;height:300px" id="giraffe" alt="Giraffe"/></a>
<a href="javascript:void(0);" onclick="makeNewAnimal('Owl','Strigiformes','Carnivore','Nocturnal','Very Small')"><img style="width:300px;height:300px" id='owl' alt="Owl"/></a>
</div>
<hr>
<h5>Animal Objects to String:</h5>
<textarea style="width:100%" id="stringOfObject"></textarea>
<h5>Animal Strings back to Objects</h5>
<textarea style="width:100%" id="jsonDisplay"></textarea>
</body>
<script type="text/javascript">
window.onload = precacheAndLoad();
makeBreadcrumb(location.pathname);
</script>
</html>
Javascript文件:
/*
*
* Below I wrote a function to perform all the image operations and precaching too. To add a new image simply do the following:
* 1) Include, the JS file and add a new img tag on the HTML page. The ID of this img tag should be the name of the animal (eg. hippo).
* 2) Save two images named the same as the animal, with a suffix of 1 and 2 for default image and hover over image. (eg. hippo1.jpg and hippo2.jpg)
* The script will take care of the rest!
*/
var allImageVariables = new Array();
function precacheAndLoad() {
var allImages = document.getElementsByTagName("img");
for(imageCount=0; imageCount<allImages.length ; imageCount++) {
currentImageId = allImages[imageCount].id;
eval("var "+currentImageId+"1 = new Image(300,300)");
eval("var "+currentImageId+"2 = new Image(300,300)");
eval(currentImageId+"1.src = 'img/"+currentImageId+"1.jpg'");
eval(currentImageId+"2.src = 'img/"+currentImageId+"2.jpg'");
allImageVariables[imageCount] = eval(currentImageId+"1");
allImageVariables[imageCount+allImages.length] = eval(currentImageId+"2");
allImages[imageCount].src = eval(currentImageId+"1.src");
allImages[imageCount].addEventListener("mouseover", hoverImage(currentImageId,imageCount+allImages.length), false);
allImages[imageCount].addEventListener("mouseout", outImage(currentImageId,imageCount), false);
}
}
function hoverImage(currentImageId, arrayIndexOfImageVariable) {
eval("document.getElementById('"+currentImageId+"').src = allImageVariables[arrayIndexOfImageVariable].src");
}
function outImage(currentImageId, arrayIndexOfImageVariable) {
eval("document.getElementById('"+currentImageId+"').src = allImageVariables[arrayIndexOfImageVariable].src");
}
因为您在执行函数并传递返回结果,而不是在使用 addEventListener()
时传递对函数的引用。 当您在函数名称上使用()
时,它会立即执行。 要仅传递引用,只需传递函数的名称,或者如果您需要像您这样的自定义参数,则需要创建一个可以传递的 shell 函数。
此外,您尝试在事件处理程序中使用for
循环变量,因此您需要创建一个闭包,以便在for
循环完成后很长时间内为事件处理程序保留这些变量的值:
更改此设置:
allImages[imageCount].addEventListener("mouseover", hoverImage(currentImageId,imageCount+allImages.length), false);
allImages[imageCount].addEventListener("mouseout", outImage(currentImageId,imageCount), false);
对此(为便于阅读而添加了换行符):
(function(imageCount, currentImageId) {
allImages[imageCount].addEventListener("mouseover", function() {
hoverImage(currentImageId,imageCount+allImages.length);
}, false);
allImages[imageCount].addEventListener("mouseout", function() {
outImage(currentImageId,imageCount);
}, false);
})(imageCount, currentImageId);
还有,你到底为什么要像你一样使用eval()
。 您可以在没有它的情况下进行编码,并且拥有更好的代码,更好的性能,在某些情况下,更安全。
例如,这个:
eval("var "+currentImageId+"1 = new Image(300,300)");
eval("var "+currentImageId+"2 = new Image(300,300)");
eval(currentImageId+"1.src = 'img/"+currentImageId+"1.jpg'");
eval(currentImageId+"2.src = 'img/"+currentImageId+"2.jpg'");
可以是这样的:
var images = [];
images.push(new Image(300,300));
images.push(new Image(300,300));
images[0].src = 'img/'+currentImageId+'1.jpg');
images[1].src = 'img/'+currentImageId+'2.jpg');
与其用eval()
声明变量,不如使用对象或数组并将动态变量放入其中,然后从那里引用它们,而不是通过直接变量名称。 这是创建动态变量的常用方法。
相关文章:
- D3.js:如何在svg上移动鼠标时创建弹出事件
- 是否可以使用鼠标动态创建“html5画布”
- 可缩放容器鼠标上的可拖动元素在创建时从辅助对象上浮动
- 创建随机图像交换并禁止鼠标悬停事件
- 为Mozilla创建鼠标事件
- 正在创建一个事件以更改鼠标悬停时的图片
- 我可以在HTML5画布中创建图形形状对象吗?以及当用户将鼠标悬停在形状上时如何将光标显示为指针
- Jquery:当鼠标指针进入和离开元素时,创建一个弹出窗口
- 如何在鼠标光标周围创建形状
- 使用单击和悬停事件在jquery中创建虚拟鼠标垫
- 我想在不使用额外插件的情况下使用鼠标拖动来创建图像滑块
- 使用 html5 画布创建形状后使用鼠标拖动形状
- 如何创建鼠标对 Div 的抵抗力,就像磁铁效应一样
- 如何使“按钮”在鼠标按下时创建一个可移动的 DIV,并将“鼠标按下”切换到新的 DIV
- 为什么addEventListener只执行我的函数,而不为其创建鼠标悬停/鼠标打开事件
- 如何在 D3 中创建工具提示,以便在图形中节点上的鼠标悬停上获取图像
- 在SVG元素上使用Javascript以创建鼠标事件
- 如何将鼠标悬停在链接上时在链接旁边创建弹出框
- 鼠标悬停事件仅适用于上次创建的传单地图
- 在谷歌地图上按下鼠标创建标记,并立即拖动它而不释放鼠标按钮