У меня на странице есть пара функций, которые влияют на отображение элементов, когда на них наводишь. Но если быстро передвинуть мышку с одного на другой элемент, то начинает выполняться первая функция, а когда курсор доходит до второго элемента, то первая функция прерывается, не завершив свою задачу, и начинается вторая. Получается, что в JS две функции не умеют выполняться одновременно. Но тогда как сделать так, чтобы другая функция не начинала выполняться до тех пор, пока выполнение текущей не завершиться? Полагаю, что есть решение, если в тело события ставить проверку на возможность выполнения функции, но как мне кажется, это тоже далеко не самый лучший вариант, но он хоть как-то решает проблему, вроде бы: HTML: <script type="text/javascript"> funcname() { func_rule = false; //code func_rule = true; } </script> <span onClick="if (func_rule == true) funcname()"> Кто-нибудь сталкивался с этим?
В JS две функции не умеют выполняться одновременно. Вообще в браузере ничего не умеет выполняться одновременно. И обрываться никакие функции не умеют. И не сталкивался никто с этим, потому что такого не бывает. Приведите нормальный код и опишите что там не то происходит.
Два элемента (один под другим) с разными id, естественно. Если курсор навести на слово в одном из элементов, то из-под него выезжает див. Если функцию вызвать на первом элементе и во время выплывания дива навести курсор на слово на втором элементе, то положение первого дива зависает (и в виду кода функции он не отвисает), а второй див начинает нормальное движение. [js]function showbox(id) { object = document.getElementById(id); var second = 100; if (object.style.top == "") { //На раскрытие var flag = 1; var i = 0; } else if (Number(object.style.top.substr(0, 3)) >=115) { //На закрытие var flag = 0; var i = 118; } if (flag == 0 || flag == 1) { function thistimer() { if (i > 115 && flag == 1) { return false; } else if (i <= 0 && flag == 0) { object.style.top = ""; return false; } object.style.top = i+"px"; i = (flag == 0) ? i-5 : i+5; setTimeout(thistimer, second); second = ((second - 35) > 1) ? (second - 35) : 1; } thistimer(); } } [/js]
вёрстку бы показали, чтобы запустить можно было. единственное на что при первом взгляде можно обратить внимание - object определяется без var и всегда используется одна глобальная переменная. так же заметьте, что никакого параллельного выполнения и прерывания исполнения кода тут нет. выезжание реализуется за счёт последовательного вызова функции по таймеру.
vasa_c Действительно сделал небольшую ошибку, что сделал object глобальной, но роли никакой это не играет. AlexGousev А как по другому? Ставить переменную, которая блокирует thistimer внутри функции (при первом запуске) до тех пор, пока i не станет 118 (или 0)? Посмотреть можно здесь - http://muse.hopto.org/#discography Наведите на Singles на одном элементе и очень быстро наведите на другой (попробуйте несколько раз). Или наведите на "Поиск" вместо второго элемента, а ведь там нет thistimer
Если навести курсор в одном месте на Singles, и во время того, как будет выезжать див, навести на Singles в другом месте, но происходит как раз то, о чем я и говорю - останавливается первая функция и начинает работать вторая. Да-да, я все его делаю. Инст блин...
thistimer там не переопределяется, он каждый раз новый. другое дело, что статическое определение функции внутри IF может нести различные глюки в разных браузерах. Лучше так: [js]function thistimer() {...} if (...) { thistimer(); }[/js] не сумел там воспроизвести описанного. всё раскрывается до конца, на что ни наводи.
vasa_c Спасибо! Это помогло! Посмотрел как выглядел старый код в других браузерах - все нормально. Ага, значит это только в FF 2... Еще раз спасибо!