Jquery html callback
Есть ли обратная связь для функции html() или способ проверить, что она завершена. Например:
$("#some_div").html('something here');
if($("#some_div").html() == ''){
//do something here
}
Я устанавливаю html элемента из сообщения. Иногда он не загружается, поэтому, когда он не загружается, я хотел бы, чтобы он что-то сделал, возможно ли это. То, как я это делаю сейчас, всегда делает другое, потому что он не установил html к тому времени, когда он проверит, что у него есть html.
Ответы
Ответ 1
html()
- синхронная операция. Фактическое обновление DOM зависит от вашего содержимого html. Если у вас есть теги <img>
или <iframe>
, для загрузки потребуется время. Следующий оператор, следующий за html()
, должен сразу увидеть новое содержимое html.
Вы имели в виду load()
вместо этого?
[Изменить] Основываясь на вашем комментарии, вероятно, ваш отказ $.ajax
. Не html()
. Попробуйте подключить обработчик отказа к ajax-вызову и повторить попытку оттуда? Хотя, если ваш код на стороне сервера бесшумно выходит из строя с кодом 200, событие сбоя не вызывается. В этом случае вы можете проверить значение html, прежде чем устанавливать его в элемент.
Ответ 2
Ответ Chetan Sastry (самый высокий ответ сейчас) не на 100% правильный.
$('#some_div').html('<div id="new_div">some content</div>'); // code 1
$('#new_div').click(function(){ }); //code 2
Я не знаю почему, но в некоторых случаях код 2 будет выполнен до завершения кода 1.. Между кодом 1 и кодом 2 есть короткое время меньше 0 миллисекунд. Оно должно быть некоторыми специальными исполняемыми ордерами в Javascript.
Для решения проблемы вам нужно использовать cballou way (floor answer = _ =!). например.
var sync = function(fn, millisec){
var m = millisec ? millisec : 0; //in face, 0 is enough
return setTimeout(fn,m);
};
$('#some_div').html('<div id="new_div">some content</div>'); // code 1
var code2 = function(){
$('#new_div').click(function(){ }); // run code 2, here
};
sync(code2);
Ответ 3
Единственный способ, который я нашел с живым и обратным вызовом,
$('p').live('click', function() {
// delay dont work with html() // fcallback function
$(this).parent('div').slideUp('slow', function() {
// empty block
$(this).html('');
if($(this).html()==''){
// function
myFunction();
}
});
});
Ответ 4
Надеюсь, у кого-то есть лучшее решение, чем я. Быстрое обходное решение - использовать setTimeout(), чтобы задержать следующие вызовы, давая вашему блоку HTML достаточно времени для загрузки (так как время загрузки настолько миниатюрное).
$('#some_div').html('<div>some content</div>');
// set timeout for 250 milliseconds
setTimeout(callbackFunction, 250);
function callbackFunction() {
// do some cool sh*t
}
Обратите внимание, что если вы хотите передать любые переменные в свою функцию, вы можете сделать следующее:
$('#some_div').html('<div>some content</div>');
// set timeout for 250 milliseconds
var myParam = 'value';
setTimeout(function() { callbackFunction(myParam); }, 250);
function callbackFunction(myParam) {
// do some cool sh*t
alert(myParam);
}