嵌套.each()的jQuery AJAX成功函数 - 数据未定义

时间:2011-02-13 00:35:25

标签: jquery each

是的,这可能有点难以解释。

我有一个jQuery AJAX请求正在读取一个XML文件,其布局类似于:

<root>
    <nodes>
        <node type="typeOne" name="nodeNameOne" />
        <node type="typeOne" name="nodeNameTwo" />
        <node type="typeTwo" name="nodeNameThree" />
        <node type="typeThree" name="nodeNameFour" />
        <node type="typeFour" name="nodeNameFive" />
    </nodes>

    <otherNodes>
        <otherNode name="nodeNameOne">Some value</otherNode>
        <otherNode name="nodeNameTwo">Some value</otherNode>
    </otherNodes>
</root>

这不是我可以控制的; XML文件由第三方工具生成。

我想要做的是读取<node> s'name属性的值,然后使用它来从相应的<otherNode>中提取值(如果存在)。

这就是我在成功回调函数中所拥有的:

function ParseFile(data, status, request){
    var types = ['typeOne', 'typeTwo']; //I don't care about all the <node>s

    alert(typeof data); //displays "object"

    types.each(function(entry, index){
        alert(typeof data); //displays "object"
        var typeNodes = jQuery(data).find('node[type="'+entry+'"]');

        typeNodes.each(function(){
            alert(typeof data); //displays "undefined"
            var name = jQuery(this).attr('name');
            /* The data object is undefined once you get inside this loop,
               so the following doesn't work. */
            var otherNode = jQuery(data).find('otherNode[name="'+name+'"]').text();
        });
    });
}

问题是,我似乎无法从第二个.else()循环中访问数据变量。即使我在第一个var newData = data;内声明了一个变量,newData也是未定义的。

3 个答案:

答案 0 :(得分:0)

这不起作用的原因是jQuery函数修改data并尝试将其设置为它认为您已传入的html片段。但是,您没有将有效的html传递到它,所以它将其设置为undefined。您需要将数据复制到另一个变量,而不是仅仅设置一个引用。

尝试

var myData = data.substr(0);

答案 1 :(得分:0)

var types = ['typeOne', 'typeTwo']; 

types不是jQuery对象,它是一个数组,您可以使用each函数进行迭代。

// This will not work 

types.each(function(entry, index){
  //... iteration processing
}; 

对于types变量,使用for循环或将其转换为jQuery对象。

答案 2 :(得分:0)

这不是您具体问题的答案,但您可以使用map()将其简化为源于此的内容:

// Returns an array of ["Some value", "Some value", ""]
$xml.find('node[type=typeOne], node[type=typeTwo]').map(function() { 
  return $xml.find('otherNode[name=' + this.getAttribute('name') + ']').text(); 
});

假设$ xml是包含jQuery包装的XML的变量。例如,我在控制台上将其定义为:

var $xml = $('<root>
  <nodes>
    <node type="typeOne" name="nodeNameOne" />
    <node type="typeOne" name="nodeNameTwo" />
    <node type="typeTwo" name="nodeNameThree" />
    <node type="typeThree" name="nodeNameFour" />
    <node type="typeFour" name="nodeNameFive" />
  </nodes>

  <otherNodes>
    <otherNode name="nodeNameOne">Some value</otherNode>
    <otherNode name="nodeNameTwo">Some value</otherNode>
  </otherNodes>
</root>');