единожды выполнить callback после .hide() нескольких элементов.
здравствуйте.
Столкнулся с такой проблемой: при выполнении jquery функции .hide(duration, callback)callback выполняется для каждого скрываемого элемента, (это подтверждается документацией и моими экспериментами). А как быть, если необходимо чтобы callback выполнился строго 1 раз, после скрытия всех элементов? |
callback функция имеет два параметра, один из которых индекс элемента в наборе, проверив который с длиной набора можно определить выполнение чего либо.
|
понял! спасибо за наводку, попробую воспользоваться.
А я прочитал здесь: http://jquery.page2page.ru/index.php...ементов что в callback не передается параметров. или там устаревшая инфа? |
Цитата:
|
Цитата:
var obj = $(selector).hide(300, function() { здесь можно узнать является ли this последним в наборе obj }) |
Можно так: https://jsfiddle.net/7dtre9gL/
|
Воспользовался вариантом по ссылке от Nexus. так работает.
А как узнать через this последний ли это элемент, я так и не понял. |
Цитата:
|
Цитата:
как-то не очень лаконично получается. |
winch, самый короткий вариант вам написал Nexus.
|
хотя можно конечно сохранить полученный набор в переменную, а потом уже с ней работать...
Ладно, всё понятно, вопрос решен. всем спасибо! |
Цитата:
Но если это для - выполняем что-то для элементов набора, а если последний в наборе, то ... Иначе вам нужно то, что писал Nexus. Правда уже скрытый скрывать за время Т ни к чему, корректней такая тогда запись $('div').not(':last').hide(300).end().last().hide( 300,function() .... PS. Если выполнить раз, не важно в какой последовательности, то $(selector).hide(time).last().hide(function() {....}) так как скрытый уже не будет вновь скрываться, просто функция выполнится после скрытия всех. |
Цитата:
$('div').hide(300).last().stop(true).hide(300,callback); |
Усложним задачу: а если на некоторых из этих элементов уже висят какие-то анимации (поэтому они скроются позже последнего), а колбэк надо выполнить только когда все элементы будут скрыты? ;-)
|
Белый шум, как вариант
var counter = 0, callback = () => { ++counter >= len && alert('Complete'); }, len = $('div').hide(300, callback).length; |
Цитата:
|
Цитата:
Окончательный код я сделал такой: var sel = $(".menu1 .MenuItem > div"); var i = 1; sel.slideUp(700, function(){ if (sel.length == i++) DoCallback(); }); |
var sel = $(".menu1 .MenuItem > div").slideUp(700, function(){ if (sel.last() == this) DoCallback(); }); и считать ничего не надо. |
Цитата:
|
Ну если строго так нужно, тогда да.
|
Часовой пояс GMT +3, время: 16:41. |