Javascript 无法将数组值传递给单击函数

Javascript 无法将数组值传递给单击函数,javascript,jquery,arrays,Javascript,Jquery,Arrays,我计划在页面上显示一些图像,当用户按下up按钮时,会显示一些相关的新图像。我通过更改已有的图像html标记的“src”属性来实现这一点 我有像[[“a”,“b”],[“c”,“d”]这样的json数据,它给出了像a.jpg,b.jpeg等图像的名称 问题是我无法将数组值传递给jquery click对象。我的javascript功能如下: var a; // a global variable holding the json array [["a","b"],["c","d"]] funct

我计划在页面上显示一些图像,当用户按下up按钮时,会显示一些相关的新图像。我通过更改已有的图像html标记的“src”属性来实现这一点

我有像
[[“a”,“b”],[“c”,“d”]
这样的json数据,它给出了像a.jpg,b.jpeg等图像的名称

问题是我无法将数组值传递给jquery click对象。我的javascript功能如下:

var a; // a global variable holding the json array [["a","b"],["c","d"]]

function rileri(){ //img next
var ix=parseInt($("#up").attr('rel'));
ix=(ix+1)%a.length; 
for(var i=0;i<2;i+=1){ 
   $("#k"+i).attr("src","img/m/t/"+a[ix][i]+".jpg"); 
   $("#k"+i).click(function() { rgetir(a[ix][i]);}); //problem is here!!
 }
$("#up").attr('rel',ix); // i keep index data of appearing img on "rel"
}

function rgetir(n){ //img down ajax
$("#brc").load("data/rgetir.php", {'name':n});
}
var a;//包含json数组[[“a”、“b”]、[“c”、“d”]]的全局变量
函数rileri(){//img next
var ix=parseInt($(“#up”).attr('rel');
ix=(ix+1)%a.长度;

对于(var i=0;i,这里有一个简单的小提琴,显示您的问题

问题是您的ix和i变量是闭包,因此在事件运行时,它们的值是错误的,正如您在本例中看到的


我试着写一些代码来完成我认为您在下面要做的事情。如果我知道您要做的事情(用例),可能会更容易。也许这就是您想要的

var a; // a global variable holding the json array [["a","b"],["c","d"]]

function rileri(){ //img next
   $("#k0").click(function() { handleClick(0); });
   $("#k1").click(function() { handleClick(1); });
}


function handleClick(index) {
  var ix=parseInt($("#up").attr('rel'));
  ix=(ix+1)%a.length; 

  $("#k"+index).attr("src","img/m/t/"+a[ix][index]+".jpg"); 

  $("#up").attr('rel',ix); 

}

这里有一个简单的小提琴,显示你的问题

问题是您的ix和i变量是闭包,因此在事件运行时,它们的值是错误的,正如您在本例中看到的


我试着写一些代码来完成我认为您在下面要做的事情。如果我知道您要做的事情(用例),可能会更容易。也许这就是您想要的

var a; // a global variable holding the json array [["a","b"],["c","d"]]

function rileri(){ //img next
   $("#k0").click(function() { handleClick(0); });
   $("#k1").click(function() { handleClick(1); });
}


function handleClick(index) {
  var ix=parseInt($("#up").attr('rel'));
  ix=(ix+1)%a.length; 

  $("#k"+index).attr("src","img/m/t/"+a[ix][index]+".jpg"); 

  $("#up").attr('rel',ix); 

}

问题与“多维数组”无关这是因为您在指定的单击值内使用了
i
,并且
i
随着循环的每次迭代而变化。每个指定的单击值都包含对
i
的引用,因此当
rileri
完成时,每个点都指向相同的值。您需要打破引用,通常通过将
i
传递到一个节点来完成单击并绑定,然后单击此处

使用函数中断引用有多种方式,但由于您使用的是jQuery并迭代数组,因此我们将使用
$。每个

(以下内容未经测试,但应作为示例)


问题与“多维数组”无关这是因为您在指定的单击值内使用了
i
,并且
i
随着循环的每次迭代而变化。每个指定的单击值都包含对
i
的引用,因此当
rileri
完成时,每个点都指向相同的值。您需要打破引用,通常通过将
i
传递到一个节点来完成单击并绑定,然后单击此处

使用函数中断引用有多种方式,但由于您使用的是jQuery并迭代数组,因此我们将使用
$。每个

(以下内容未经测试,但应作为示例)



如果您将警报添加到此“rgeir(a[ix][i]);”。您会得到什么?函数和变量的描述性名称会有所帮助。至少在您试图向他人解释代码的功能时是这样。NullUserExceptionఠ_ఠ 你是对的,我需要更正它们。我尝试了alert(rgeir(a[ix][i]);如果将alert(a[ix][i])添加到此“rgeir(a[ix][i]);”中,则alert(a[ix][i])都会给出“未定义”的警报。你得到了什么?为函数和变量提供描述性名称很有帮助。至少当你试图向人们解释你的代码时是这样做的。NullUserExceptionఠ_ఠ 你是对的,我需要更正它们。我尝试了alert(rgeir(a[ix][i]);alert(a[ix][i])都给出了“未定义”的代码,但是[newImageIndex][index]应该是imageArray[newImageIndex][index]。我认为代码很短,并使用注释来解释函数的用途,但是你们都在fb页面的generali saw data()函数中,我将尝试使用它。我需要绑定一个单击事件,当我在rgeir()中放入一个常量时,上面的代码会触发单击并立即调用rgeir(),但它与数组元素一起工作,不可能。最后,我看到一些源代码提到传递值或引用问题,但我不是编码专家。我无法解决案例+1在我键入答案时,您将答案更改为指向正确的问题。代码相同,但[newImageIndex][index]应为imageArray[newImageIndex][index]。我认为代码很短,并使用注释来解释函数的用途,但是你们都在fb页面上的generali saw data()函数中,我将尝试使用它。我需要绑定一个单击事件,当我在rgeir()中放入一个常量时,上面的代码会触发单击并立即调用rgeir(),它可以工作,但与数组元素,没有办法。最后,我看到了一些源中提到的关于传递值或引用问题,但我不是编码专家。我无法解决案例+1在我键入答案时,您将答案更改为指向正确的问题。这给了我一个很好的视觉效果,但不知怎的,当我单击图像时,它会启动一个infine循环并使IE崩溃,在Firefox中没有响应。但这似乎是一个可行的解决方案code@JAAuldeclick binder中的“this”指的是html图像对象。我找不到reason@aliaktas很抱歉,在绑定中使用
单击
之前,我忘了在
每个
中获取对
的引用。我已经编辑了代码示例对你来说,完整的解决方案就是这个,不过两者都帮了大忙。谢谢你,这给了我一个很好的视觉效果,但不知怎的,当我点击一个图像时,它会启动一个内联循环,并使IE崩溃,在Firefox中没有任何响应。但这看起来像是一个可行的解决方案code@JAAuldeclick binder中的“this”指的是html图像对象。我找不到reason@aliaktas对不起,我在绑定中使用
之前,忘记在
每个
中获取对
的引用。我已经为您编辑了代码示例。完整的解决方案是这个,但是两者都有很大帮助。谢谢
function rileri(){
  var ix=parseInt($("#up").attr('rel'),10);
  ix=(ix+1)%a.length; 

  $.each(a[ix], function (i) {
    var img_name = this;

    $("#k"+i)
      .attr("src","img/m/t/"+img_name+".jpg")
      .click(function () {
        rgetir(img_name);
      });

      if (i >= 2)
      {
        return false;
      }
  });

  $("#up").attr('rel',ix);
}