Отмена выполнения ф-ии
Как сделать так
if (функция уже выполняется) игнорировать ее повторное выполнение |
|
Не помогло. Мне надо, что при выполнении функции (анимации), повторные клики/наведения мыши (события) не запускали ее сначала.
т.е. block.onmouseover = function() { // какой-то код, который игнорировал повторное наведение и перезапускал ф-ю сначала animate(.....) } что-то типо этого var process = arguments.callee; if (process.busy) return; process.busy = true; Перерыл весь рунет, так и не нашел инфы о busy, о arguments читал |
block.onmouseover = function() { block.onmouseover = null animate(.....) } |
Не помогает(
Смысл в том, что когда человек резко наводит/уводит несколько раз мышь с объекта, это объект прыгает, т.е. если наводит на div - объект выполняет анимацию, уводит - выполняет другую. Так и работает, но не когда человек наводит/уводит мышь, анимация выполняется несколько раз и получается некрасиво. Мне нужно что-то типо : block.onmouseover = function () { if(block.onmouseover > 1) return; // т.е. надо игнорировать другие клики, пока анимация не закончится animateProp(...) } В учебнике нашел такой пример http://learn.javascript.ru/play/tuto...jet/index.html там повторные клики игнорируются, но я ума не приложу как сделать это в моем случае... |
Цитата:
if (block.busy) return; block.busy = true; animateProp(... block.busy = false;) |
вставляю вот так
block.onmouseover = function () { if (block.busy) return; block.busy = true; animateProp(....) block.busy = false; } Но не выходит игнорировать =( А что такое busy? Это свойство объекта какого-то? В рунете инфу о нем не нашел... |
Цитата:
|
Что-то не выходит =(
Его надо ставить в вызов animateProp? Или после него? Надо ли ставить arguments.callee или этого флажка достаточно? |
Цитата:
|
???
block.onmouseover = function () { if (block.busy) return; block.busy = true; animateProp({start:0, end: -20, prop:'marginTop', duration:500, elem:logo}, block.busy = false) } |
Цитата:
{ block.busy = false } Цитата:
|
function animateProp(opts) { var start = opts.start, end = opts.end, prop = opts.prop; opts.step = function(progress) { opts.elem.style[prop] = (end - start) * progress + start+'px' } return animate(opts); } var logo = document.getElementById('logo'); logo.onmouseover = function () { if (logo.busy) return; logo.busy = true; animateProp({start:0, end: -20, prop:'marginTop', duration:500, elem:logo},function() { logo.busy = false; }) } logo.onmouseout = function () { if (logo.busy) return; logo.busy = true; animateProp({start:-20, end: 0, prop:'marginTop', duration:500, elem:logo},function() { logo.busy = false; }) } работает только при onmouseover |
hoax,
если вы знаите где останавливается ваша анимация туда и ставте logo.busy = false -- в вашем коде я не вижу остановки анимации. |
В jQuery это делается просто: $(el).stop().animate(..) и анимация срабатывает без всяких задержек, то есть не накапливается.
А тут какой-то велосипед animateProp, хз как тут такое сделать. Неясно зачем писать велосипедный код, который уже есть в jQuery и каждая собака умеет пользоваться этой либой. |
Часовой пояс GMT +3, время: 01:06. |