2012-12-30 43 views
1

好吧,所以,我试图让用户看到图像的选择,然后单击一个图像来更改表格中的图像。它目前的方式只是添加数组的最后一个图像。我知道这是为什么(我想!),但努力寻找解决方案。看评论。一如既往,所有帮助表示赞赏。显示来自阵列的图像,让用户选择一个并更改节点中的图像

for (r = 0; r < howOften; r++) { 
    row = table.insertRow(-1); 
    for (c = 0; c < numDays; c++) { 
     col = row.insertCell(-1); 
     img = new Image(); 
     img.src = "../www/images/TEST.png"; 
     col.appendChild(img); 
     img.onclick = function() { 
      var myImages = new Array(); 
      myImages[0] = "../www/images/TEST3.png"; 
      myImages[1] = "../www/images/TEST4.png"; 
      myImages[1] = "../www/images/TEST2.png"; 
      for (var i = 0; i < myImages.length; i++) { 
       var allImages = new Image(); 
       allImages.src = myImages[i]; //I want to display this array to user somehow 
       //and for them to be able to choose one and for this.src to point to that. 
       var gogetImages = allImages.src; 
       this.src = (gogetImages); //I know this is wrong 
      }; 
     }; 
    }; 
}; 

//LATEST VERSION STARTS FROM HERE 
     function addImage (col) { 
    var img = new Image(); // Note that a new img variable will be declared each time this function is called 
    img.src = "../www/images/TEST.png"; 
    col.appendChild(img); 
    img.onclick = function() { 
     var myImages = new Array(); 
     myImages[0] = "../www/images/TEST3.png"; 
     myImages[1] = "../www/images/TEST2.png"; 
     myImages[2] = "../www/images/TEST4.png"; 

     for (var i = 0; i < myImages.length; i++) { 
      var allImages = new Image(); 
      allImages.src=myImages[i]; 


      var newList = document.createElement("ul"); 
      var newContent = allImages; 
      newList.appendChild(newContent); 
      my_div = document.getElementById("showPics"); 
      document.body.insertBefore(newList, my_div); 
      }; 

      allImages.onclick = function(){ 

      alert("the click is working");//it is but only for the last image...grrrrr 
      //this.src = ????; 
      }; 
     }; 
    }; 

for (r = 0; r < howOften; r++) { 
    row = table.insertRow(-1); 
    for (c = 0; c < numDays; c++) { 
     col = row.insertCell(-1); 
     addImage(col); 
    }; 
}; 
    document.getElementById('holdTable').appendChild(table); 
    }; 
+0

需要遍历图像数组并为每个图像创建(并追加)一个新图像。点击处理程序会改变主图像'src' – charlietfl

+0

嗨charlietfl,我环绕数组并按照建议追加。用户现在可以看到图像但不能点击添加。请参阅上面的编辑代码。 (最新版本)。谢谢你的帮助。 – Inkers

+1

需要将'allImages.onclcik'移动到'for'循环的正上方,以便在创建每个图像时获取clcik处理程序...因为它只是在循环之后,所以只有最后一个图像才能得到它......可能会考虑使用jQuery代码...可以在大约4-6行代码中编写整个代码并且更易于阅读 – charlietfl

回答

0

那么,在你的情况,你正在使用IMG =新的图像

(); 将一个值赋给一个变量而不声明它“在一个函数内部使用var”会创建一个全局变量。

因此,在你的代码中,你正在创建一个全局的“img”变量,并将其重新分配给一个新的图像,这对你造成了问题。

我建议你把代码分解成如下的函数。

function addImage (col) { 
    var img = new Image(); // Note that a new img variable will be declared each time this function is called 
    img.src = "../www/images/TEST.png"; 
    col.appendChild(img); 
    img.onclick = function() { 
     var myImages = new Array(); 
     myImages[0] = "../www/images/TEST3.png"; 
     myImages[1] = "../www/images/TEST4.png"; 
     myImages[1] = "../www/images/TEST2.png"; 
     for (var i = 0; i < myImages.length; i++) { 
      var allImages = new Image(); 
      allImages.src = myImages[i]; //I want to display this array to user somehow 
      //and for them to be able to choose one and for this.src to point to that. 
      var gogetImages = allImages.src; 
      this.src = (gogetImages); //I know this is wrong 
     }; 
    }; 
} 

for (r = 0; r < howOften; r++) { 
    row = table.insertRow(-1); 
    for (c = 0; c < numDays; c++) { 
     col = row.insertCell(-1); 
     addImage(col); 
    }; 
}; 

希望它现在适合你。

+0

嗨js,感谢您的回复。我已经实施了你的建议。不过,我仍然有点麻烦。我已经设法将图像显示给用户,但onclick只能处理最后一张图像。我也有点不确定如何将它传递给this.src/img.src。 – Inkers

+0

哦......我错过了要清楚地提到变量的作用域而不是块(比如for循环)......这里,'var allImages = new Image();'for for循环不会创建每次都有一个新的变量,它在C++语言中重用(并覆盖)相同的'allImages' ...,在{}}块中声明的变量不能在{}'块之外访问,即使在在JavaScript中,即使在'{}'块中声明变量的相同函数在整个函数中都是可访问的... 您可以用相同的方式解决它,我将单个代码分解为一个新函数。 –

+0

我建议你通过变量范围和匿名函数(立即调用)...对于新来JS的人来说,变量范围是最令人困惑但最强大的功能之一。 –

相关问题