2011-02-13 67 views
1

对,这可能有点难以解释。嵌套.each()的jQuery AJAX成功函数 - 数据未定义

我有一个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也是未定义的。

回答

0

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

尝试做

var myData = data.substr(0);

+0

它应该是jQuery的工作来克隆传入的选择器而不会损坏它的状态? – Raynos 2011-02-13 01:21:52

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

types不是一个jQuery对象,它是一个数组,你可以用each功能遍历。

// This will not work 

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

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

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>');