Ответ 1
setTimeout
принимает функцию и число в качестве параметра, попробуйте следующее:
setTimeout(function() {
$("#a" + json.id).fadeOut(300);
}, 500);
У меня есть var в jquery после запроса типа
type: 'POST',
data: data,
cache: false,
success: function (data) {
var json = jQuery.parseJSON(data);
Я пытаюсь использовать таймаут, чтобы запустить функцию ниже через пять секунд.
$("#a" + json.id).fadeOut(300);
В настоящий момент я делаю
setTimeout('$("#a" + json.id).fadeOut(300)', 500);
но он не работает
setTimeout
принимает функцию и число в качестве параметра, попробуйте следующее:
setTimeout(function() {
$("#a" + json.id).fadeOut(300);
}, 500);
Не уверен, что значение json.id изменится к моменту вызова обратного вызова таймаута.
Рассмотрим следующий пример:
for (var i=0;i<10;i++){
setTimeout(function(){console.log(i)},500);
}
Функция обратного вызова видит я = 10, потому что значение я к моменту запуска функции. Вы можете сделать предварительную привязку, используя закрытие:
var f=function(id){
setTimeout(function(){console.log(id);},500);
}
for (var i=0;i<10;i++) f(i);
Теперь, когда вы видите, как работают замыкание и предварительная привязка, вот более надежное решение вашего вопроса:
var f=function(id){
setTimeout(function(){$('#a'+id).fadeOut(300);},500);
}
f(json.id);
Ваш код не работает, потому что String вычисляется в глобальном контексте. Поэтому для его работы вы можете сделать json global (удалить var).
Кроме того, хотя я не уверен, что вы вызываете setTimeout
, но, полагая, что он находится внутри обратного вызова, вы также можете сделать идентификатор частью строки:
setTimeout('$("#a'+json.id+'").fadeOut(300)', 500);
Но, конечно, лучший вариант - избегать eval и globals любой ценой (checkout Eval is evil и Почему глобальное состояние - это дьявол для подробного объяснения) и передать в закрытие:
setTimeout(function(){ $("#a" + json.id).fadeOut(300); }, 500);