Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么addEventListener只执行my函数,而不为其创建mouseover/mouseon事件?_Javascript_Image_Dom Events_Addeventlistener - Fatal编程技术网

Javascript 为什么addEventListener只执行my函数,而不为其创建mouseover/mouseon事件?

Javascript 为什么addEventListener只执行my函数,而不为其创建mouseover/mouseon事件?,javascript,image,dom-events,addeventlistener,Javascript,Image,Dom Events,Addeventlistener,我有一项任务,但我似乎无法理解这一部分: 我已经编写了一个Javascript函数,根据img html标记的ID从“img”文件夹为每个图像标记预加载/预缓存两个图像。这部分很好用 但是,使用addEventListener在mouseover和mouseout上更改图像的功能似乎不起作用,我就是不明白为什么!如果我调试,我可以看到图像加载良好,没有错误。然而,在鼠标上方它似乎不起作用 HTML页面: <!DOCTYPE HTML> <html> <hea

我有一项任务,但我似乎无法理解这一部分: 我已经编写了一个Javascript函数,根据img html标记的ID从“img”文件夹为每个图像标记预加载/预缓存两个图像。这部分很好用

但是,使用
addEventListener
mouseover
mouseout
上更改图像的功能似乎不起作用,我就是不明白为什么!如果我调试,我可以看到图像加载良好,没有错误。然而,在
鼠标上方
它似乎不起作用

HTML页面:

<!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>

主页
功能动物(名称、科学名称、食物类型、睡眠模式、大小){
this.name={
realName:name,
科学名称:科学名称
};
this.typeof食品=食品类型;
this.sleepingPattern=sleepingPattern;
这个。大小=大小;
}
函数makeNewAnimal(名称、科学名称、食物类型、睡眠模式、大小){
var animalClicked=新动物(名称、科学名称、食物类型、睡眠模式、大小);
var finalStringObject=“{”+myownRecursiveToString方法(animalClicked“”+“}”;
document.getElementById(“stringOfObject”).value=finalStringObject;
var backToObject=parseStringAndConvertToObject(finalStringObject);
document.getElementById(“jsonDisplay”).value=backToObject;
}
函数myownRecursiveToString方法(objectToParse,outputString){
var first=1;
对于(objectToParse中的财产名称){
如果(objectToParse[nameOfProperty]对象实例){
outputString+=nameOfProperty+“:{”;
outputString=MyownRecursiveToString方法(objectToParse[nameOfProperty],outputString);
outputString+=“},”;
}否则{
outputString=outputString+nameOfProperty+“:”+objectToParse[nameOfProperty]+“,”;
}                                                   
}
if(outputString.charAt(outputString.length-1)=','){
outputString=outputString.slice(0,-1);
}
返回输出字符串;
}
函数parseStringAndConvertToObject(最终字符串){
eval(“var backToObject=“+finalString”);
返回到对象;
}
导航列表:
面包屑: 请单击下面的任何图像,动物数据的JSON对象将显示在下面的文本区域中!

要字符串的动物对象: 动物字符串返回到对象 window.onload=precacheAndLoad(); makeBreadcrumb(location.pathname);
Javascript文件:

/*
* 
*下面我编写了一个函数来执行所有的图像操作和预处理。要添加新图像,只需执行以下操作:
*1)包括JS文件,并在HTML页面上添加新的img标记。这个img标签的ID应该是动物的名字(例如河马)。
*2)保存两个与动物名称相同的图像,默认图像后缀为1和2,并将鼠标悬停在图像上。(如hippo1.jpg和hippo2.jpg)
*脚本将处理剩下的部分!
*/
var allImageVariables=新数组();
函数precacheAndLoad(){
var allImages=document.getElementsByTagName(“img”);

对于(imageCount=0;imageCount,因为在使用
addEventListener()
时,您正在执行函数并传递返回结果,而不是传递对函数的引用
在函数名上,它会立即执行。要仅传递引用,只需传递函数名,或者如果需要自定义参数,则需要创建一个可以传递的shell函数

此外,您正试图在事件处理程序内使用
for
循环变量,因此需要创建一个闭包,以便在
for
循环完成后很长时间内为事件处理程序保留这些变量的值:

更改此项:

/*
 * 
 * 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");
} 
为此(为了可读性增加了换行符):


还有,你到底为什么要像现在这样使用
eval()
。你可以不用它编写代码,而且代码更好,性能更好,在某些情况下更安全

例如,这:

(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("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'");

而不是使用
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');