2010-08-30 5 views
1

Почему эта часть кода не работает в Chrome 4.0, но работает на FF 3.5. Возникает проблема: селектор $ ('li # node -' + nodes [i] .id + ''). Функция append не работает в chrome, но отлично работает в firefox. Есть ли проблема с добавлением элементов DOM, которые были созданы во время выполнения в Chrome? Должен ли я использовать Jquery.live()?Необходимая помощь JQery - выбор элемента dom сразу после его создания


$.getJSON("/data/all" , function(data){ 
        nodes = data; 
        len = nodes.length; 
    for(i=0; i<len; i++){ 
         if(i==0){ 
          // works on FF && Chrome 
          $('ul#root').append('<li id="node-'+ nodes[i].id +'"><input type="checkbox" name="">'+ nodes[i].name); 

          // works on FF only 
          $('li#node-'+nodes[i].id +'').append('<ul id="' + nodes[i].id +'>'); 

         } 
         else{ 
          ... 
          ... 
         } 
+0

Chrome JS работает быстро? – Frankie

+0

Вы видите ту же проблему здесь http://jsbin.com/elozi5/2/edit? этот упрощенный пример работает во всех браузерах для меня? – Daveo

+0

@Daveo - Да, упрощенный пример работает во всех браузерах. Однако, когда я ввожу узел массива [], он перестает работать. узел [] имеет следующую структуру узел = [{идентификатор, имя, parent_id, PARENT_NAME}, {..}, ...] Я вставил свой код здесь http://jsbin.com/ifayu3/изменить. Посмотрите, я пытаюсь создать быструю и грязную иерархию флажков. Спасибо. – papdel

ответ

4

Ваш HTML-код недействителен, и Chrome не принял его. Firefox был более снисходительным в том, что он разрешил. Всякий раз, когда из-за динамического значения существует множество открытий и закрытий цитат, лучше использовать создание элемента стиля объекта в jQuery, а не делать все это в строке. Проблема с этой линии:

$('li#node-'+nodes[i].id +'').append('<ul id="' + nodes[i].id +'>'); 

Выход уль он производит (обратите внимание недостающую цитату):

<ul id="1> 

Для создания сложных селекторов, гораздо лучше использовать замену строки:

var li = "li#node-{id}".replace("{id}", nodes[i].id); 

для создания элементов с динамическими атрибутами, использовать объекты для инициализации:

var ul = $('<ul>', { 
    id: nodes[i].id 
}); 

Код ниже, хотя немного подробный и, возможно, немного медленный, трудно ошибиться, особенно на языке, таком как JavaScript, где недостающая цитата может сделать хаос, как мы только что стали свидетелями.

var li = "li#node-{id}".replace("{id}", nodes[i].id); 
var ul = $('<ul>', { 
     id: nodes[i].id 
    }); 
$(li).append(ul); 
+0

Я понимаю, что я могу работать со ссылкой, но я до сих пор не уверен, почему Chrome не будет работать, в то время как FF явно игнорирует любые проблемы. Я больше хочу понять причину этого. – papdel

+0

@papdel - Это дух. Можете ли вы опубликовать воспроизводимый пример на http://jsfiddle.net или что-то в этом роде? – Anurag

+0

Добавлено в комментарий к исходному вопросу (jsbin.com/ifayu3/edit) – papdel

1

Рассмотрим, прежде чем вставить его создания узла в качестве элемента, а затем у вас есть ссылки на него и может пропустить позже поиск. Что-то вроде:

$.getJSON("/data/all" , function(data){ 
       nodes = data; 
       len = nodes.length; 
for(i=0; i<len; i++){ 
        if(i==0){ 
         // works on FF && Chrome 
         var newNode = $('<li id="node-'+ nodes[i].id +'"><input type="checkbox" name="">'+ nodes[i].name); 
         $('ul#root').append(newNode); 

         // works on FF only 
         newNode.append('<ul id="' + nodes[i].id +'>'); 

        } 
        else{ 
         ... 
         ... 
        } 
+0

Проблема все еще сохраняется в браузерах. См. Комментарий выше – papdel