2012-01-07 2 views
1

Я хочу передать id1, id2 и id3 через функцию ниже. Это работает просто отлично:Как передать идентификатор элемента через функции SetTimeout в jQuery?

function doSomething(id1,id2,id3) { 
    $(id1).fadeIn('slow',.25); 
    $(id1).fadeIn('slow',.25); 
    $(id1).fadeIn('slow',.25); 
}; 

Но это не работает:

function doSomething(id1,id2,id3) { 
    setTimeout(" $(id1).fadeIn('slow',.25) ", 300); 
    setTimeout(" $(id1).fadeIn('slow',.25) ", 300); 
    setTimeout(" $(id1).fadeIn('slow',.25) ", 300); 
}; 

Как получить второй один для работы? Я думал, что мне нужна пунктуация вокруг идентификатора. Или, возможно, я могу установить переменную для функции в скобках setTimeout. Есть идеи?

ответ

5

Плохая практика - получить setTimeout(), чтобы оценить строку. Вместо этого следует использовать анонимную функцию:

function doSomething(id1, id2, id3) { 
    setTimeout(function() { 
     $(id1).fadeIn('slow', 0.25); 
     $(id2).fadeIn('slow', 0.25); 
     $(id1).fadeIn('slow', 0.25); 
    }, 300); 
}; 

Обратите внимание, что я положил все свои fadeIn() S в один setTimeout(); он делает то же самое, что и все ваши таймауты будут срабатывать одновременно (300 мс). Если вы идентификаторы строк, вы можете сделать это тоже:

function doSomething(id1, id2, id3) { 
    setTimeout(function() { 
     $(id1 + ', ' + id2 + ', ' + id3).fadeIn('slow', 0.25); 
    }, 300); 
}; 

Хотя это немного грязный, но $.add() может сделать трюк.

3

setTimeout принимает функцию обратного вызова и тайм-аут. Обернув вызов функции в кавычки, вы передаете ему строку. Попробуйте это:

function doSomething(id1,id2,id3) { 
    setTimeout(function() { 
     $(id1).fadeIn('slow',.25); 
     $(id2).fadeIn('slow',.25); 
     $(id3).fadeIn('slow',.25); 
    }, 300); 
}; 

EDIT: Как @nnnnnn отметил, строка может быть принят, но это плохо idea. По сути, когда вы передаете строку, она вызывается с привилегиями вызывающего и, следовательно, не будет иметь доступа к переменным области видимости в «doSomething», но совершенно другой области.

+1

Передача строки в 'setTimeout' не является по своей сути неправильной - это, безусловно, правильный синтаксис. Проблема со строковым синтаксисом заключается в том, что код в строке не будет работать в правой области, чтобы использовать локальные 'id1' и другие параметры, которые исправляет ваш код. – nnnnnn

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