0

My goal is to mouse over an image and have the title appear under its corresponding image. I have made it so the title will appear, but always on the last image in the list. I have been stuck for hours trying to figure this out and I can't seem to do it. What am I doing wrong?

   function processResponse()
 {
  // if request completed successfully and responseXML is non-null
  if ( asyncRequest.readyState == 4 && asyncRequest.status == 200 && 
     asyncRequest.responseXML )
  {
     clearImages(); // prepare to display a new set of images

     // get the covers from the responseXML
     var covers = asyncRequest.responseXML.getElementsByTagName(
        "cover" );

     // get the title of the covers from the resonseXML
     var titles = asyncRequest.responseXML.getElementsByTagName("title");

     // get base URL for the images
     var baseUrl = asyncRequest.responseXML.getElementsByTagName( 
        "baseurl" ).item( 0 ).firstChild.nodeValue;

     // get the placeholder div element named covers
     var output = document.getElementById( "covers" );

     // create an unordered list to display the images
     var imagesUL = document.createElement( "ul" );

     // place images in unordered list
     for ( var i = 0; i < covers.length; ++i )
     {
        var cover = covers.item( i ); // get a cover from covers array

        // get the image filename
        var image = cover.getElementsByTagName( "image" ).
           item( 0 ).firstChild.nodeValue;

        // get the title of the cover
        var title = cover.getElementsByTagName( "title" ).item( 0 ). firstChild.nodeValue;

        // create li and img element to display the image
        var imageLI = document.createElement( "li" );
        var imageTag = document.createElement( "img" );
        var titleText = document.createElement( "p" );
        var tt = "text"+i;
        var ii = "img"+i;


        // set img element's src attribute
        imageTag.setAttribute( "src", baseUrl + escape( image ) );
        imageTag.setAttribute( "alt", title);
        imageTag.setAttribute( "id", ii);
        titleText.setAttribute( "id", tt);
        imageLI.appendChild(imageTag);
        imageLI.appendChild(titleText);
        imagesUL.appendChild( imageLI ); // place li in ul

        imageTag.addEventListener("mouseover", function() {
            var alt = this.alt;
            titleText.textContent = alt;
        });
        imageTag.addEventListener("mouseleave", function() {
            titleText.textContent = null;
        });
     } // end for statement
Kaval Patel
  • 670
  • 4
  • 20

2 Answers2

0

Try adding the event listener before appending the node

function processResponse()
{
 // if request completed successfully and responseXML is non-null
 if ( asyncRequest.readyState == 4 && asyncRequest.status == 200 && 
 asyncRequest.responseXML )
{
 clearImages(); // prepare to display a new set of images

 // get the covers from the responseXML
 var covers = asyncRequest.responseXML.getElementsByTagName(
    "cover" );

 // get the title of the covers from the resonseXML
 var titles = asyncRequest.responseXML.getElementsByTagName("title");

 // get base URL for the images
 var baseUrl = asyncRequest.responseXML.getElementsByTagName( 
    "baseurl" ).item( 0 ).firstChild.nodeValue;

 // get the placeholder div element named covers
 var output = document.getElementById( "covers" );

 // create an unordered list to display the images
 var imagesUL = document.createElement( "ul" );

 // place images in unordered list
 for ( var i = 0; i < covers.length; ++i )
 {
    var cover = covers.item( i ); // get a cover from covers array

    // get the image filename
    var image = cover.getElementsByTagName( "image" ).
       item( 0 ).firstChild.nodeValue;

    // get the title of the cover
    var title = cover.getElementsByTagName( "title" ).item( 0 ). firstChild.nodeValue;

    // create li and img element to display the image
    var imageLI = document.createElement( "li" );
    var imageTag = document.createElement( "img" );
    var titleText = document.createElement( "p" );
    var tt = "text"+i;
    var ii = "img"+i;


    // set img element's src attribute
    imageTag.setAttribute( "src", baseUrl + escape( image ) );
    imageTag.setAttribute( "alt", title);
    imageTag.setAttribute( "id", ii);
    titleText.setAttribute( "id", tt);

    (function(imageTag,titleText){
         imageTag.addEventListener("mouseover", function() {
            var alt = this.alt;
            titleText.textContent = alt;
         });
        imageTag.addEventListener("mouseleave", function() {
            titleText.textContent = null;
         });         
    }(imageTag,titleText));


    imageLI.appendChild(imageTag);
    imageLI.appendChild(titleText);
    imagesUL.appendChild( imageLI ); // place li in ul

 } // end for statement
Nick Cordova
  • 724
  • 6
  • 16
0

It was because of closures.

Before:

    imageTag.addEventListener("mouseover", function() {
        var alt = this.alt;
        titleText.textContent = alt;
    });
    imageTag.addEventListener("mouseleave", function() {
        titleText.textContent = null;
    });

After:

    imageTag.addEventListener("mouseover", display(titleText, title));
    imageTag.addEventListener("mouseleave", remove(titleText));
    function display(i,j){
        return function() {i.textContent = j;}
    }
    function remove(i){
        return function() {i.textContent = null;}
    }