2013-04-18 1 views
2

Я думаю, что сойду с ума.Невозможно получить размеры данных AJAX при последующих вызовах

Все, что я хочу сделать, это получить размеры данных, загружаемых через AJAX, независимо от того, сколько раз звонок был сделан. Он работает отлично в первый раз, но я всегда получаю значение 0 с каждым последующим вызовом - несмотря на то, что он появляется на странице, как и следовало ожидать.

// The AJAX part 
function getDetails(request){ 
    $placehold.empty(); 
    return jQ.get(request); 
}; 

// Filter & render AJAX data 
function renderData(data){ 
    var endResult = $(data).find('#productDetails'); 
    endResult.fadeTo(0,0).appendTo($placehold); 
    $placehold.removeClass('loading'); 
    endResult.fadeTo(300,1); // <- Added as per request 
    // Console log previously uncalled data works fine 
    // Called again, I get zero every single time 
    console.log(jQ('#anyElementInAJAXData').outerHeight(false)); 
}; 

// Click handler 
jQ('#slides').on('click', '.slideLink', function(e){ 
    e.preventDefault(); 
    var target = jQ(this).attr("href"); 
    $placehold.fadeIn(360).addClass('loading'); 
    getDetails(target) 
     .done(function(result) { 
      renderData(result); 
     }) 
}); 

Что я делаю неправильно?

+1

Каков результат 'console.log (jQ ('# anyElementInAJAXData'). Length)' в последующих вызовах? – Matt

+0

Почему вы угасаете «endResult», но не заставляете его снова появляться? – m90

+0

@Matt возвращает «1» каждый раз – verism

ответ

0

Ваша проблема, кажется, лежит в endResult.fadeTo (0,0) .appendTo ($ placehold); метод. Приложение будет появляться только после завершения fadeTo, но остальная часть вашего метода выполняется, пока fadeTo только что начался. Это может «решить»:

var endResult = $(data).find('#productDetails'); 
endResult.fadeTo(0,0, function() { 
    $(this).appendTo($placehold); 
    $placehold.removeClass('loading'); 
    $(this).fadeTo(300,1); // <- Added as per request 
    // Console log previously uncalled data works fine 
    // Called again, I get zero every single time 
    console.log(jQ('#anyElementInAJAXData').outerHeight(false)); 
}); 
+0

Спасибо за ваше предложение, но это не проблема. Метод 'append()' является синхронным - это означает, что он заканчивается перед выполнением любого следующего кода. Все, что я делаю, заключается в том, что перед тем, как вставить его, «endResult» имеет непрозрачность 0. Затем, когда он скрыт, (теоретически) измеримый и в нужном месте, остальное выполняется. – verism

+0

Метод append, конечно, не является синхронным (он будет выполнен после fadeTo, но код после этой цепочки будет выполняться непосредственно после запуска fadeTo). Однако он может выглядеть синхронно, потому что вы используете продолжительность 0. Проверьте эту скрипту, чтобы понять, что я имею в виду: http://jsfiddle.net/UM4Ed/ (она использует консольный журнал, и вы видите «check 1» и после одна секунда «проверка 2»). Скрипка действительно показывает правильную высоту, но ... Может быть, вы должны изменить строку 'endResult.fadeTo (0.0) .appendTo (...)' to' endResult.css ({opacity: 0}). AppendTo (. ..) '. Таким образом, это будет синхронно. – Toverbal

+0

... также, высота кажется правильной только тогда, когда элемент (слегка) виден, возможно, изменение значения непрозрачности до 0,1 поможет. Я убежден, что проблема в этом. – Toverbal

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