2013-11-11 1 views
0

Я столкнулся с небольшой обманкой с моим кодом - ниже мой код:Получения й ChildNodes от переменного объекта

var actionsAllowed = $(packet).find('actionsAllowed'); 

Это возвращает мне следующее в Firebug консоли:

Объект [действияAllowed]

Нажав «actionsAllowed», я попал в пакет и в нужный раздел, где я вижу два перечисленных действия.

можно расширить объект и в конечном итоге увидеть следующее:

Object[actions] 

0 
    actions 

remove 
    remove() 

attributes 
    [] 

baseURI 
    "http://localhost:9000/testget#" 

childElementCount 
    2 

childNodes 
    NodeList[ActionOne, ActionTwo] 

0 
    ActionOne 

1 
    ActionTwo 

length 
    2 

item 
    item() 

iterator 
    iterator() 

__proto__ 
    NodeListPrototype { item=item(), iterator=iterator()} 

Так под NodeList я вижу правильные действия.

Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как получить эти действия оттуда и перечислить или даже просто предоставить их в качестве отдельных переменных.

Моя попытка получения затем регистрации каждого ребенка:

function getActionsAllowed() { 
    var children = actionsAllowed.childNodes; 
     for (var i = 0; i < children.length; i++) { 
      console.log(children); 
     } 
} 

Проблема, ".childNodes" продолжает возвращаться, как "неопределенный".

Есть ли другой, лучший способ сделать это? Или это правильно, но я допустил ошибку?

спасибо.

С наилучшими пожеланиями,

Гэри Shergill

EDIT:

рабочий код только для одного результата:

var currentState = $(packet).find('currentState').text(); 
var actionsBanned = $(packet).find('actionsBanned').text(); 

EDIT 2:

Обновленный код:

$(packet).find('actionsAllowed').each(function() { 
    var children = this.childNodes; 
     for (var i = 0; i < children.length; i++) { 
     var action = children[i].nodeName 
      console.log(action); 
     } 
}); 

Это работает =) Оно регистрирует каждое действие по одному, поэтому оно работает. Просто вопрос, как изменить console.log() на что-то более полезное (нужно определить каждый отдельно).

Создает новую тему, если у меня возникнут проблемы и свяжу ее здесь.

(моя связанная нить: Returning Arrays and ChildNodes)

+0

может у предоставить объект как таковой? –

+0

Я вставлял то, что показывает объект, когда я вхожу в него. Это не все из этого, конечно, это большое количество строк, но показаны узлы внутри «действий», которых должно быть достаточно? – Gary

+0

Полный объект с правильными значениями позволит всем нам предоставить ответ быстрее, чем пытаться выполнить пробную/ошибку. –

ответ

1

Вы всегда можете извлечь DOM узлов из объекта JQuery с помощью toArray или get.

var actionsAllowed = $(packet).find('actionsAllowed').get(); 

Но это вообще не обязательно, поскольку сам объект jQuery реализует обширный API для управления узлами.

E.g.зацикливание по узлам

$(packet).find('actionsAllowed').each(function() { 
    //looping over childnodes 
    $(this).children().each(function() { 
     console.log($(this).text()); 
    }); 
}); 

Если вы просто хотите, чтобы дети actionsAllowed узлов напрямую, вы также можете сделать:

$(packet).find('actionsAllowed > *').each(function() { 
    console.log($(this).text()); 
}); 
+0

Я подозреваю, что он разбирает XML, поэтому 'actionsAllowed', вероятно, является именем тега, а не классом. – Barmar

+0

@Barmar Да, это, вероятно, правильное предположение. Я добавил комментарий, чтобы игнорировать мои изменения, если мои собственные предположения ошибочны. – plalx

+0

Привет, это правильно, это XML-вход, действияAllowed не является классом. Входящий XML имеет несколько тегов, большинство из которых - только отдельные результаты (например, var currentState = $ (пакет) .find ('currentState'). Text();), с которыми не приходится иметь дело. – Gary