Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как сделать такую функцыю... (https://javascript.ru/forum/misc/7242-kak-sdelat-takuyu-funkcyyu.html)

sms9 22.01.2010 11:02

Как сделать такую функцыю...
 
Здраствуйте!
У меня есть функция которая прорисовует div елемент на страницы:
function anim(ob, x, dx, t){
if(t<0) return true;
document.getElementById(ob).style['top']=x+dx;
setTimeout(function(){anim(ob, x, dx, t-1)}, 10);}

Например у меня есть код который нужно выполнить:
function hhh(){
anim('div',1,1,25);
alert('алерт')
}

Как усовершенствовать функцию anim() чтобы alert('алерт') выполнилась после завершения функции прорисовки на не вовремя того как объект div перемещается по экрану!!!
Ну можно сделать от так:
function anim(ob, x, dx, t){
if(t<0) aaa();
document.getElementById(ob).style['top']=x+dx;
setTimeout(function(){anim(ob, x, dx, t-1)}, 10);}

function aaa(){alert('алерт')};

anim('div',1,1,25);

Но етот метод очень сложен, может можно как то проще всё это реализовать, потому что при использовании этого метода используется дополнительная функция aaa(). Ну а если нужно использовать большое количество функций anim(), то дополнительных функций нужно очень и очень много!!!

Gvozd 22.01.2010 11:31

function anim(ob, x, dx, t,callback){
if(t<0) callback();
document.getElementById(ob).style['top']=x+dx;
setTimeout(function(){anim(ob, x, dx, t-1)}, 10);}

anim('div',1,1,25,function(){alert('алерт')});

это называется анонимная функция

sms9 22.01.2010 11:42

Я знаю этот метод... А можно ли так делать чтобы после функции это все делалось?
Например чтобы было на подобие:
function hhh(){
var txt;
for(var i in document)
if(typeof(document[i])=='string') txt+=i+"="+document[i]+"<br>";
return txt}

//ну и теперь исполнение
hhh();
alert('алерт');

Здесь alert('алерт') выполняется после hhh(), а не вовремя!!!
Может можно функцию anim() как то переделать?

Niar 22.01.2010 13:13

5 за орфографию =)
Чтобы alert выполнялся во время функции вы не думали засунуть его в функцию?
И вообще что за бред. Как он может выполнятся во время функции если стоит он позже?

sms9 22.01.2010 15:16

http://sms9.byethost5.com/test.html
Тут пример! Как зделать чтоб алерт был после виполнения функцыы!!!! А не вовремя!!

Niar 22.01.2010 15:17

Используйте задержку во времени

Niar 22.01.2010 15:27

А лучше используйте событие загрузки.

e1f 22.01.2010 16:01

А что куда загружается-то О_о?

Niar 22.01.2010 16:02

Ну у него в функции что-то там двигаетсо. И alert должен появитсо только когда это окончательно передвинетсо.
То есть когда функция завершит свою работу.

e1f 22.01.2010 16:37

Цитата:

Сообщение от Niar (Сообщение 41537)
Ну у него в функции что-то там двигаетсо. И alert должен появитсо только когда это окончательно передвинетсо.
То есть когда функция завершит свою работу.

Цитата:

Сообщение от Niar (Сообщение 41522)
А лучше используйте событие загрузки.

Так каким боком тут некое "событие загрузки"? Ну и что это, все же?

Niar 22.01.2010 16:39

Я еще толком не читал про события но где-то боком слышал о onload. Который срабатывает когда что-то полностью загружено(выполнено).

sms9 22.01.2010 16:48

Для #6: Ну если я точно не знаю сколько времени должно пройти!
В этой функции да можно вычислить через которое время она завершиться но для других подобных НЕТ!
function anim(ob, x, dx, t,callback){
if(t<0) callback();
document.getElementById(ob).style['top']=x+dx;
setTimeout(function(){anim(ob, x, dx, t-1)}, 10);}

Если б не функция setTimeout то можно било бы сделать
так:
function anim(ob, x, dx, t,callback){
if(t<0) callback();
document.getElementById(ob).style['top']=x+dx;
return anim(ob, x, dx, t-1)}

Но при таком раскладе элемент прорисован сначала и в конце своего движения!!!!
Есть ли такая функция в js аналог sleep() в php?
sleep() в PHP делает паузу при выполнении скрипта...
Если есть то она поможет в этом вопросе! Жду Ваших ответом!!!!

sms9 22.01.2010 16:51

При чем тут onload! Я же не загружаю ничего....

e1f 22.01.2010 16:55

Вам Gvozd уже написал. Поправить немного надо было, всего-то:
function anim(ob, x, dx, t,callback) { 
    if(t<0) return callback();
    document.getElementById(ob).style['top']=x+dx; 
    setTimeout(function(){anim(ob, x, dx, t-1, callback)}, 10);
} 

anim('div',1,1,25,function(){alert('алерт')});


Niar,
так если боком слышали, зачем советуете? Тем более что onload тут как не пришей ... рукав.

Niar 22.01.2010 16:58

Виноват. Надо было сначала уточнить точное действие события.

sms9 22.01.2010 17:18

Да я понял про использования callback! Я знал етод метод но не то я хотел...
например нужно мне переместить див с верха экрана в низ, выполнить некоторою функцию, потом переместить его назад и выполнить новою функцию...
если использовать посоветованный вами метод код будет иметь вид:
anim(ob, 150, 2, 15, function(){alert('Привет!'); anim(ob2, 100, -2, 13, function(){alert(2); Ище какаято функцыя...; anim(ob, 150, 2, 7)})})

А мне б хотелось что би не все так запутано било и это же имело такой вид:
anim(ob, 150, 2, 15);
alert('Привет!');
anim(ob2, 100, -2, 13);
alert(2);
Еще какая то функция...;
anim(ob, 150, 2, 7);

Так мне кажется намного проще!!!
Скажет кто то по поводу функцию аналог sleep() в php?

Niar 22.01.2010 17:20

Вот аналоги php функций в JS http://javascript.ru/php
Про sleep ни чего нету

e1f 22.01.2010 17:23

Реализовавать самому. Можно почитать исходники jQuery, к примеру, там есть query.

Kolyaj 22.01.2010 17:24

Цитата:

Сообщение от sms9
Так мне кажется намного проще!!!

Но так нельзя.

Цитата:

Сообщение от sms9
нужно мне переместить див с верха экрана в низ, выполнить некоторою функцию, потом переместить его назад и выполнить новою функцию...

Поменьше анонимных функций, если не нравится вложенность. И не надо вытягивать код в одну строку, не так страшно будет.
function downUp(downCallback, upCallback) {
    anim(bla, bla, function() {
        downCallback();
        anim(bla, bla, function() {
            upCallback();
        })
    });
}

downUp(function() {
    // ...
}, function() {
    // ...
});


sleep в JavaScript нет и не надо. Хотите писать на JS -- привыкайте к асинхронному коду.

subzey 23.01.2010 15:27

Niar,
мне кажется, sms9 может быть вполне украинцем

sms9,
Если Вам нужно, чтобы код выполнился сразу же после завершения потока, используйте setTimeout:
function testInner(){
	alert('Тут мы стартовали');
	setTimeout(function(){alert('Отложенный запуск')}, 0);
	alert('Тут мы закончили');
}

function testOuter(){
	alert('Запускаем внутреннюю функцию');
	testInner();
	alert('Вышли из внутренней функции');
}

testOuter();


Часовой пояс GMT +3, время: 09:07.