JQuery AJAX функция успеха с вложенным .each () - данные не определены - PullRequest
1 голос
/ 13 февраля 2011

Да, это может быть немного сложно объяснить.

У меня есть запрос 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-файлы создаются сторонним инструментом.

Я хочу прочитать значение атрибута name <node> s, а затем использовать его для извлечения значения из соответствующего <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 голосов
/ 13 февраля 2011
var types = ['typeOne', 'typeTwo']; 

types не является объектом jQuery, это массив, который вы можете перебирать с помощью функции each.

// This will not work 

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

Для переменной types используйте цикл forили преобразовать его в объект jQuery.

0 голосов
/ 13 февраля 2011

Это не совсем ответ на ваш конкретный вопрос, но вы можете использовать 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>');
0 голосов
/ 13 февраля 2011

Причина, по которой это не работает, заключается в том, что функция jQuery изменяет data и пытается установить для него фрагмент html, который, по ее мнению, вы передали.поэтому он устанавливает его неопределенным.Вам нужно скопировать данные в другую переменную, а не просто установить ссылку.

Попробуйте выполнить

var myData = data.substr(0);

...