![]() |
|
Модераторы: Sardar, Aliance |
![]()
|
|
| Dr.Zlo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 12.11.2007 Репутация: 1 Всего: 2 |
В больших скриптах сталкиваюсь с необходимостью разделения анимации и логики, т.е. к примеру сначала элемент нужно красиво показать\передвинуть\подсветить, потом загрузить в него инфу, после загрузки инфы задвинуть\переместить\раздвинуть элемент, и самое главное все эти действия нужно выполнять ПОСЛЕДОВАТЕЛЬНО, следующий этап начинается только после завершения предыдущего. В основном работаю с jQuery, но если кто знает решение с помощью стандартных средств js, пишите, буду только рад.
Мне нужно решение из серии: chain(animate1(), logic1(),animate2()...) или animate1().logic1().animate2()... Сразу скажу, стандартное решение jQuery для callback функций анимации меня не устраивает, т.е. $('#elem').animate({.....}, speed, 'linear', function(){ logic1() }) - это мне не подходит |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
А чем не устраивает стандарное решение, можно поподробнее?
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Dr.Zlo |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 12.11.2007 Репутация: 1 Всего: 2 |
Стандартное решение не утсраивает тем, что в таком случае в скрипте получается каша из визуальных эффектов и логических функций, к тому же если нам надо в каждую функцию передавать различные параметры, будет вообще ужас, если к примеру после анимации anim(x) надо выполнить logic(args), затем anim2(y), затем logic2(args2) нужно исполнять что-то вроде:
Другой пример: нам надо выполнять одну и ту же функцию anim() перед выполнением logic(args) и logic2(args2), тогда вообще получается жёсткая жесть:
И если не дай бог в args или args2 передаётся объект, тогда вообще придётся создавать глобальные переменные, а это вообще не фэн-шуй. Плюс ко всему было бы удобно и красиво, если бы вся анимация была в одном js файле, а вся логика в другом, а связывались бы они с помощью тех самых цепочечных вызовов функций, в таком случае было бы очень удобно менять эффекты не копаясь в логике или модифицировать логику, не разгребая эффекты. |
||||
|
|||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Дык взять и написать объект chain, который представляет собой массив функций, каждая из которых вместо callback'а вызывает chain.next()
chain.next обязан выкинуть из собственного массива первую функцию и вызвать ее.
пойдет? Это сообщение отредактировал(а) ksnk - 28.1.2008, 16:12 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Dr.Zlo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 12.11.2007 Репутация: 1 Всего: 2 |
- во-первых, такой способ принципиально не отличается от банального вызова следующей функции в конце предыдущей
- во-вторых опять же возникает проблема передачи переменных - в-третьих здесь функции жёстко привязываются к цепи, а ведь идея состоит в том, что функции могут вызываться как цепочечно, так и по отдельности. Нужна некая chain конструкция, для работы которой не пришлось бы залезать в функцию и прописывать ей callback вжёсткую. В данном случае основную проблему я вижу в том, чтоб определять момент, когда текущая функция цепочки закончила работу, чтоб передать управление следующей функции, просто мне мозга пока не хватает придумать, как это реализовать |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Dr.Zlo, Я не очень пока понимаю суть возражений. Напишите как бы вы хотели писать
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Dr.Zlo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 12.11.2007 Репутация: 1 Всего: 2 |
ksnk, в идеале хотелось бы так:
Но к сожалению уже на уровне передачи вызовов функций в качестве параметров для chain эти функции пытаются выполниться, так что можно что-то вроде : chain([{ 'start' : ['Hello!']}, {'process' : ['processing']}, {'end' : []}); |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Ну, более реально записать вот так
правда с таймаутом будет затык. Только сам таймаут знает когда он закончится... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Dr.Zlo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 12.11.2007 Репутация: 1 Всего: 2 |
В том-то и дело, у меня часто получаются конструкции из серии:
Так что если никто не знает как на завершение функции повесить событие, придётся мне смириться с тем, что в каждой функции нужно будет прописывать callback, что-нибудь вроде chain.next(); Кстати, тут ещё одна проблема. Если есть функция например с тремя параметрами start(a,b,c) и мы пишем: chain(start : ['first', 'second', 'third']).chain(...).chain(...) Как потом в теле chain вызвать start и передать ему эти 3 параметра? и что будет если один параметр- строка, второй- объект, 3й например число? |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Решением было бы зафиксировать интерфейс "функций анимации". К примеру - они принимают 2 параметра. Первый - параметри или объект с реальными параметрами функции, второй - callback, который должен вызваться по завершении функции. если CallBack'а нет - не вызываем ничего.
тогда примерно вот что получается
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
В соседней теме я уже даже сие применил... правда не особо показательно...
Окончательный интерфейсные соглашения
chain() - вызов без параметров инициализирует новый объект chain chain(a,b) - поместить в очередь вызов функции a с праметрами b и chain.next chain.run() - запуск очереди на выполнение. Можно вызывать неоднократно. Уже запущеннй процесс так не остановить. chain.clear() - остановить цепочку Каждая внешняя функция возвращает себя как результат и по этому можно писать цепочки таких вызовов... Листинг функции chain
Это сообщение отредактировал(а) ksnk - 29.1.2008, 09:49 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Dr.Zlo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 12.11.2007 Репутация: 1 Всего: 2 |
ksnk, спасибо!
Поюзал твою функцию, решил немного модифицировать, хочу чтоб выполняемые функции не пришлось сильно кромсать и передавать объект вместо набора переменных. Вот что получилось:
Вызов будет таким: chain(start_func , ['Превед ', ' всем ', ' патцанам!']).chain(alert_func , ['stop!!!']).run() Возникает 2 проблемы: 1. После выполнения последнего элемента chain, FireBug выдаёт ошибку: "x has no properties" 2. this.timeout=x.a(x.b[0], x.b[1], x.b[2], x.b[3], x.b[4], x.b[5], x.b[6],x.b[7],x.b[8],x.b[9]) - это позор программиста, но если никто не знает как это обойти и при этом передавать в функцию все переменные в нормальном виде, а не объектом, то я лучше оставлю так Это сообщение отредактировал(а) Dr.Zlo - 29.1.2008, 14:03 |
|||
|
||||
| ksnk |
|
||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
1. У меня чего-то не выдает... :(
2. написать вот так
Я, в принципе думал, что нужно бы проверять тип второго параметра и если это массив - вызвать apply, но меня остановило то, что в жизни бывают и "просто массивы" Добавлено @ 15:26 для пущего единообразия можно писать вот так.
Это сообщение отредактировал(а) ksnk - 29.1.2008, 15:26 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
||||
|
|||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
1. У меня тоже выдает.... :-( Посмотрим - поковыряем...
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Вот вариант, который получился в итоге. Правила оформления функций анимации несколько поменялись...
P.S. поправлена ошибка в функции chain.wait... P.P.S почищен код, благодаря AKS P.p.P.S поправлен метод clear, из-за чего были глюки с исполнением "аварийного" chain'а Это сообщение отредактировал(а) ksnk - 30.1.2008, 17:09 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
![]()
|
| Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |