2012-05-20 3 views
0

Как я уже говорил выше, никакой код не будет выполнен после моей функции .each. Я думал, что каждый код будет выполнен после того, как каждая функция будет готова ?!После функции jquery .each код не выполняется

Heres мой JS-файл:

function onUploadLoad() { 
    $.ajax({ 
     type: "POST", 
     url: "headlines_getter.php", 
     dataType: 'json', 
     cache: false, 
     success: function (data1) { 
      console.log("debug 2"); 
      var i = 0; 
      var $element = ""; 
      $.each(data1[i].main, function() { 
       console.log("debug 3 "); 
       $element += '<div data-role="collapsible"><h3>' + data1[i].main + '</h3>'; 
       var j = 0; 
       $.each(data1[i].sub, function() { 
        console.log("debug 4"); 
        $element += '<span><input type="checkbox" name="headlines" data-mini="true" value="blub" /> ' + data1[i].sub[j] + ' </span>'; 
        j++; 
       }); 
       $element += '</div>'; 
       i++; 
       var $elements = $($element).appendTo($('#headlinesgroup')); 
       $elements.collapsible(); 
      }); 
    alert("ok"); // <- this alert is not shown!! 
    console.log("debug 12"); // <- also not this console.log! 
     } 
    }); 
} 

Если я делаю предупреждение перед каждой-функции, все работает нормально ?!

Заранее спасибо. С уважением, Джон.

+4

Что говорит консоль? – Joseph

+0

ничего неожиданного. просто мои отладочные номера, но не отладка-номер 12! Я изменил свой вопрос, потому что я поставил предупреждение после ajax, а не после каждой функции (что является проблемой)! –

+0

Ваши циклы '.each()' все не так - вы не должны пытаться управлять своими счетными переменными и одновременно использовать '$ .each()'. В моем ответе я догадался о структуре JSON, возвращенной как объект data1 в вашем обратном вызове Ajax, и предоставил некоторый соответствующий код, но, очевидно, я, возможно, догадался, что, пожалуйста, обновите свой вопрос, чтобы показать JSON (а затем кто-то даст вам ответ, показывающий, как его обрабатывать). – nnnnnn

ответ

1

Эта строка из кода:

$.each(data1[i].main, function() { 

говорит перебрать свойства/элементы data1[i].main. То есть, учитывая, что i равно 0 в этой точке, он ожидает, что .main свойство data1[0] будет либо массивом, либо объектом. Учитывая способ, которым вы затем пытаетесь продолжать использовать data1[i].main внутри цикла, и вы увеличиваете число i себя, я подозреваю, что .main не является массивом или объектом вообще, поэтому ни одна из ваших петель $.each() не работает, как вы думаете.

Просто угадать здесь, но структура ваших data1 данных на самом деле что-то вроде этого:

[ 
    { "main" : "some heading 1", "sub" : [ "item1", "item2", "item3" ] }, 
    { "main" : "some heading 2", "sub" : [ "item1", "item2", "item3" ] }, 
    { "main" : "some heading 3", "sub" : [ "item1", "item2", "item3" ] } 
] 

Эта структура соответствует тому, что вы, кажется, пытается сделать внутри ваших $.each() петель, но вы ушли неправильно, пытаясь использовать $.each() одновременно с управлением отдельными i и j счетчиками контуров. Вы хотите использовать либо , либо традиционный цикл for, но это похоже на то, что вы пытаетесь сделать оба одновременно.Если предположить, что выше структура похожа на вашу, что нужно сделать что-то вроде этого:

success: function (data1) { 
     console.log("debug 2"); 
     var $element = ""; 
     $.each(data1, function (i, currentObj) { 
      console.log("debug 3 "); 
      $element += '<div data-role="collapsible"><h3>' + currentObj.main+ '</h3>'; 
      $.each(currentObj.sub, function (j, currentSub) { 
       console.log("debug 4"); 
       $element += '<span><input type="checkbox" name="headlines" data-mini="true" value="blub" /> ' +currentSub + ' </span>'; 
      }); 
      $element += '</div>'; 
      var $elements = $($element).appendTo($('#headlinesgroup')); 
      $elements.collapsible(); 
     }); 
     alert("ok"); 
     console.log("debug 12"); 
    } 

Обратите внимание, что нигде в любом $.each() цикле я на самом деле сделать использование i и j переменных, поскольку JQuery устанавливает currentObj равным data1[i] и также он устанавливает currentSub, равный currentObj.sub[j] (также data1[i].sub[j]).

+0

ничего себе, как магия. теперь все работает отлично! Большое спасибо. кажется законным, что мне не нужно иметь дело с счетчиками циклов i i, поскольку jquery делает это для меня! Спасибо! –

+0

Добро пожаловать. (Вы, безусловно, можете _use_ счетчики циклов внутри циклов - хотя это не обязательно, если вы делаете что-то похожее на то, что я показал, - но вы определенно не должны _change_ циклы счетчиков себя. И убедитесь, что они объявлены как параметры в функциях, а не отдельно перед '.each()'.) – nnnnnn

+0

У меня есть один вопрос. Я изменил свой файл json php, чтобы теперь получить данные в этой форме: '[{" main ":" Mainheadline1 "," sub ": [{" name ":" Subheadline1 "," sID ":" 5 " }, {"name": "Subheadline2", "sID": "6"}, {"name": "Subheadline3", "sID": "8"}]}, ... '. я изменил во второй функции '.each' значение от' currentSub' до 'currentSub.name', но оно не отображает имя (оно ничего не отображает). Вы знаете, что случилось? –

0

попробуйте добавить error параметров к $.ajax запросу, как:

function onUploadLoad() 
{ 
    console.log("debug start"); 
    $.ajax({ 
     type: "POST", 
     url: "headlines_getter.php", 
     dataType: 'json', 
     cache: false, 
     success: function (data1) { 
      console.log("debug success"); 
     }, 
     error: function() { 
      console.log("debug error"); 
     } 
    }); 
    console.log("debug end"); 
}​ 

Поскольку вопрос изменилось ...

Вы можете разместить здесь ответ РНР? Для того, чтобы увидеть, если вы манипулируя data1 так, как он должен манипулировать ...

+0

спасибо. Я добавил этот фрагмент, но нет ошибки в запросе ajax. Я изменил свой вопрос, потому что я поставил предупреждение после ajax, а не после каждой функции (что является проблемой)! –

+0

А, хорошо, это меняет проблему, на самом деле ... – ChristopheCVB

0

Если вы идете к документации .each() вы можете увидеть, что прототип функции обратного вызова необходимо два параметра

jQuery.each (сбор, обратный вызов (indexInArray, valueOfElement))

поэтому вы могли бы сделать это следующим образом:

$.each(data1[i].main, function (index, element) { 

//code inside each 

}); 
+2

jQuery передаст эти параметры функции обратного вызова, которую вы предоставляете, но они отнюдь не нужны. – jbabey

Смежные вопросы