За последние 24 часа нас посетили 24389 программистов и 1725 роботов. Сейчас ищут 1920 программистов ...

Одновременное выполнение двух функций

Тема в разделе "JavaScript и AJAX", создана пользователем Kreker, 9 июл 2008.

  1. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    У меня на странице есть пара функций, которые влияют на отображение элементов, когда на них наводишь. Но если быстро передвинуть мышку с одного на другой элемент, то начинает выполняться первая функция, а когда курсор доходит до второго элемента, то первая функция прерывается, не завершив свою задачу, и начинается вторая. Получается, что в JS две функции не умеют выполняться одновременно.
    Но тогда как сделать так, чтобы другая функция не начинала выполняться до тех пор, пока выполнение текущей не завершиться?

    Полагаю, что есть решение, если в тело события ставить проверку на возможность выполнения функции, но как мне кажется, это тоже далеко не самый лучший вариант, но он хоть как-то решает проблему, вроде бы:
    HTML:
    1.  
    2. <script type="text/javascript">
    3. funcname() {
    4.   func_rule = false;
    5.   //code
    6.   func_rule = true;
    7. }
    8. <span onClick="if (func_rule == true) funcname()">
    9.  
    Кто-нибудь сталкивался с этим?
     
  2. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    В JS две функции не умеют выполняться одновременно.
    Вообще в браузере ничего не умеет выполняться одновременно.
    И обрываться никакие функции не умеют.
    И не сталкивался никто с этим, потому что такого не бывает.
    Приведите нормальный код и опишите что там не то происходит.
     
  3. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Два элемента (один под другим) с разными 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]
     
  4. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    вёрстку бы показали, чтобы запустить можно было.
    единственное на что при первом взгляде можно обратить внимание - object определяется без var и всегда используется одна глобальная переменная.
    так же заметьте, что никакого параллельного выполнения и прерывания исполнения кода тут нет. выезжание реализуется за счёт последовательного вызова функции по таймеру.
     
  5. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Ну так у тебя указатель на thistimer переопределяется :)
     
  6. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    vasa_c
    Действительно сделал небольшую ошибку, что сделал object глобальной, но роли никакой это не играет.

    AlexGousev
    А как по другому? Ставить переменную, которая блокирует thistimer внутри функции (при первом запуске) до тех пор, пока i не станет 118 (или 0)?

    Посмотреть можно здесь - http://muse.hopto.org/#discography
    Наведите на Singles на одном элементе и очень быстро наведите на другой (попробуйте несколько раз). Или наведите на "Поиск" вместо второго элемента, а ведь там нет thistimer
     
  7. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Kreker
    Я не понял, а что там не так работает?

    З.Ы. Где-то мне, кажется, я этот сайт видел…
     
  8. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Если навести курсор в одном месте на Singles, и во время того, как будет выезжать див, навести на Singles в другом месте, но происходит как раз то, о чем я и говорю - останавливается первая функция и начинает работать вторая.

    Да-да, я все его делаю. Инст блин...
     
  9. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    thistimer там не переопределяется, он каждый раз новый.
    другое дело, что статическое определение функции внутри IF может нести различные глюки в разных браузерах.
    Лучше так:
    [js]function thistimer() {...}
    if (...) {
    thistimer();
    }[/js]


    не сумел там воспроизвести описанного.
    всё раскрывается до конца, на что ни наводи.
     
  10. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    vasa_c
    Спасибо! Это помогло!

    Посмотрел как выглядел старый код в других браузерах - все нормально.
    Ага, значит это только в FF 2...
    Еще раз спасибо!
     
  11. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    Kreker
    Чет ты с юзабилити перемудрил!
    Хотя играться весело )))