2012-02-05 68 views
0
urlMap = { 
    '0': {'6b4247404960fd4e418d242f3b7f0412': 'http://google.com', '123':'http://ibm.com'}, 
    '1': {'4c27ffaef99b7a6dbe838b46bcc09779' : 'http://yahoo.com', '456':'http://abc.com'} 

}; 

    $(function() { 
    var l = new Array(1,2,3,4); 
    for (var i = 0; i < l.length; i++){ 
      $("#"+i.toString()+".foo").change(function() { 
      g = i.toString(); 
       window.location.href = urlMap[g][$(this).val()]; 
    })}}); 

我试图使用urlMap [i]它不起作用。当我硬编码urlMap ['0']它的作品。我怎么不能像这样查找关联数组?

从Firebug的,我看到这个

urlMap[g] is undefined 
[Break On This Error] 

window.location.href = urlMap[g][$(this).val()]; 

我怎么想查找字典?

谢谢。

+1

那么,你的'for'语句迭代从0到3,但你的'urlMap'对象只有一个'“0''和'” 1''成员... – 2012-02-05 23:31:06

+0

我想改变功能只有在有变化时才被调用。这是一种选择形式,对不起,如果我没有提及它。当用户从选项中选择某个选项时,其中一个选项将匹配urlMap并重定向用户。 – CppLearner 2012-02-05 23:34:30

+0

另外,元素ID不能以数字开头。 – SLaks 2012-02-05 23:36:39

回答

4

很难说出你想要做什么。您的地图有两个条目,其中键为"0""1",但是您有一个循环遍历值0,1,2和3,然后使用这些值查找地图中的内容。

至少有三个问题的引用代码:

  1. 你试图访问键"0""1""2",和对象,只有拥有钥匙"0""1""3"

  2. 你正在创建一个循环这是在可变i的盖的功能,所以只能看到的i价值为,然后关闭被调用。这是因为闭包会收到一个实时参考给变量,而不是创建它时的值的副本。因此,所有click处理程序函数都将尝试使用密钥"4"(循环完成后的值为i),该值在映射中不存在。

  3. 你没有在任何地方声明g,所以下降到The Horror of Implicit Globals

这是我最好的猜测在你实际上要做的:

urlMap = { 
    '0': {'6b4247404960fd4e418d242f3b7f0412': 'http://google.com', '123':'http://ibm.com'}, 
    '1': {'4c27ffaef99b7a6dbe838b46bcc09779' : 'http://yahoo.com', '456':'http://abc.com'} 

}; 

$(function() { 
    for (var i = 0; i < 2; i++){ 
     $("#"+i.toString()+".foo").change(createHandler(i)); 
    } 

    function createHandler(index) { 
     return function() { 
      window.location.href = urlMap[index][$(this).val()]; 
     }; 
    } 
}); 

变化:

  1. 我只尝试访问元素"0"和地图的"1",因为这是它唯一的元素。

  2. 我使用createHandler功能,以确保我们创造的处理程序关闭在index参数createHandler,而不是在循环中i值。参数index不会改变,而i会(如我所述)随着循环的继续而改变。

  3. 我摆脱了g,这是我们不需要的,只是直接使用index。属性名称为总是字符串(even when the object is an "array");任何时候你索引到一个对象,如果你提供的索引值是一个数字,它会变成一个字符串,所以你不必明确地做(如果你愿意,你可能会这样做)。

+0

Crowder。谢谢。我不是一个Javascript作家..非常可怕的一个。所以请忍受我。实际上选择了一个元素时,是否应该调用.change()?我登录了var g,它被称为“2”,它在地图中不存在。谢谢。 – CppLearner 2012-02-05 23:46:11

+0

@Crowder。谢谢。修复工程。现在我明白我做错了什么。谢谢。 TIme再次从O'realiy读我的旧的JavaScript书! – CppLearner 2012-02-05 23:50:06

+0

@CppLearner:很酷,很高兴帮助! – 2012-02-05 23:51:58

1

由于错误明确指出,urlMap[g]不存在。
您需要先创建它。

+0

谢谢。但我该怎么看?我无法硬编码urlMap ['1']。例如,var g应该是'0'或'1'。 – CppLearner 2012-02-05 23:32:15

+0

好吧,事实并非如此。如果'g'是'0'或'1',它就会起作用。 – SLaks 2012-02-05 23:34:44

+0

实际上这意味着未定义urlMap [“2”], – ocanal 2012-02-05 23:35:39

相关问题