JavaScript setTimeout не умрет. - PullRequest
0 голосов
/ 12 декабря 2011

Я сделал фотогалерею и работает на AJAX. Ниже приведены соответствующие фрагменты кода.

    if (isset($_POST['stopss'])){
    echo'<script type="text/javascript">
    clearTimeout(setss);
    </script>';
    }

    if (isset($_POST['startss'])){
    ?>
    <script type="text/javascript">
    var setss = window.setTimeout('delayer(\''+src+'\',\''+dir+'\',\''+title+'\',\''+width+'\',\''+height+'\',\''+img+'\')',5000);
    </script>
    <?
    }

Функция отсрочки передает параметры для нового окна модального окна (новый запрос AJAX). Проблема, как я это вижу. Тайм-аут начинается, когда пользователь нажимает кнопку «Слайд-шоу». Даже несмотря на то, что они нажимают кнопку «Остановить слайд-шоу» (это перезагружает страницу AJAX), таймер все еще работает (в фоновом режиме) и в clearTimeout (наборы) наборы больше не доступны (из-за нового запроса страницы AJAX), поэтому clearTimeout не удается очистить.

Есть ли способ убить время ожидания в фоновом режиме? Даже если окно modalbox закрыто, через 5 секунд оно открывается и успешно продолжает показ слайдов.

Кстати, это вызов modalbox. Modalbox.show ('../ b-gal-scripts / ajaxgal.php', {title: title, overlayOpacity: .1, ширина: ширина, высота: высота, метод: 'post', параметры: {src: next, dir: dir, img: img, ssimg: next}}); вернуть ложь;

Ответы [ 2 ]

2 голосов
/ 12 декабря 2011

Проблема

При перезагрузке страницы старый код JavaScript (для предыдущего запроса) перестает работать, а новый выполняется.

Проблема заключается в том, что вы сначала вызываете clearTimeout(setss) и позже определите, что на самом деле является setss.

Пара дополнительных проблем

Несколько советов:

  1. Не смешивайте стили цитирования , вы создаете беспорядок таким образом.
  2. Если вы хотите, чтобы цитаты были в кавычках, просто используйте тот факт, что существуют различные кавычки , например:

    var setss = window.setTimeout("delayer('"+src+'","'+dir+'","'+title+'","'+width+'","'+height+'","'+img+'")',5000);
    
  3. ... и желательно привыкнуть к программированию на основе событий и замыканиям при кодировании JavaScript, например:

    var sets = window.setTimeout(function(){
        delayer(src, dir, title, width, height, img);
    }, 5000);
    

Окончательная версия вашего кода

Ваш код должен выглядеть следующим образом:

if (isset($_POST['startss']) && !isset($_POST['stopss'])){
    ?>
    <script type="text/javascript">
        var setss = window.setTimeout(function(){
            delayer(src, dir, title, width, height, img);
        }, 5000);
    </script>
    <?
}

Он использует тот факт, что вам не нужно сначала выводитьскрипт, который выполняется только для немедленной остановки, если он не нужен.Просто сделайте условие PHP, чтобы проверить, хотите ли вы, чтобы оно выполнялось, выведите его.

Во-вторых, JS был изменен с использования строк (что совершенно беспорядочно) на использование анонимных функций.Посмотрите на это поближе.

Помогло ли это?

1 голос
/ 12 декабря 2011

У меня небольшие трудности с пониманием вашей проблемы, но я надеюсь, что это поможет.

  1. Когда страница перезагружается, предыдущий экземпляр страницы и любое связанное с ним состояние перестает существовать. В результате тайм-аут был остановлен. По сути, если глобальное setSS не существует, то и время ожидания, к которому оно относится, также не может быть причиной запуска слайд-шоу.

  2. Когда активная страница обслуживается из чего-то вроде PHP, работа сервера (WRT создание любого содержимого страницы) завершена. В дальнейшем контент не может быть записан на страницу. Ваш clearTimeout по сути бесполезен, так как он может очистить только тайм-аут, установленный во время загрузки страницы. Он не будет записывать новый элемент скрипта на существующую страницу.

  3. Переменные не распределяются между страницами, поэтому, если вы устанавливаете время ожидания на одной странице и сбрасываете его на другой, это не сработает.

Итак, чтобы очистить тайм-аут, вам нужно вызвать clearTimeout на той же странице (и экземпляре этой страницы), что и setTimeout, и этот вызов должен быть выполнен после setTimeout.

Если ничего из вышеперечисленного не применимо к вашей ситуации, то возможно ли, чтобы $_POST['startss'] и $_POST['stopss'] были установлены в одном запросе? Если это так, новая страница создаст новое время ожидания после попытки его очистки и, следовательно, отобразит слайд-шоу.

(кроме того, использование замыкания для создания функции для передачи в setTimeout будет более читабельным, чем компиляция строки, которая вызывает функцию).

...