Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Обновление контента в div как остановить ?  (Прочитано 4414 раз)
0 Пользователей и 1 Гость смотрят эту тему.
pokk
Помогающий

ru
Offline Offline

« : 30-01-2014 01:12 » 

Здравствуйте, есть у меня меню  каждой кнопке которого соответствует
разный get запрос.  На второй кнопке он рекурсивно повторяется через 0.3 секунды(обновляет div).  При при нажатии на другую кнопки  он должен прекратится и отправится другой запрос. Примерно так и происходит  но вот время от времени  он не сбрасывается и получается отправляется  1 нужный запрос и кучу не нужных. Подскажите из за чего такое может происходить. И как точно остановить функцию showContent.



Функция showContent
Код:

      var intervalID;

    function showContent(link, divtarget) {
        var cont = document.getElementById(divtarget);
        (function _f() {
            var http = createRequestObject();
            if( http ) {
                http.open('GET', link, true);
                http.onreadystatechange = function () {
                    if (http.readyState == 4) {
                        cont.innerHTML = (http.status == 200) ? http.responseText : '.........';
intervalID = setTimeout(_f, 300);
                       // setTimeout(_f, 200);
                    }
                };
                http.send(null);
            } else {
                cont.innerHTML = 'error ajax';
intervalID = setTimeout(_f, 300);
                //setTimeout(_f, 200);
            }
        })();
    }

    function createRequestObject()
    {
        try { return new XMLHttpRequest() }
        catch(e)
        {
            try { return new ActiveXObject('Msxml2.XMLHTTP') }
            catch(e)
            {
                try { return new ActiveXObject('Microsoft.XMLHTTP') }
                catch(e) { return null; }
            }
        }
    }


Функция showContent_old  отправляет только 1 запрос.

Код:
    function showContent_old(link, divtarget) {
        var cont = document.getElementById(divtarget);
        var http = createRequestObject();
        if( http )
        {
            http.open('get', link);
            http.onreadystatechange = function ()
            {
                if(http.readyState == 4)
                {
                    cont.innerHTML = http.responseText;

                }
            }
            http.send(null);
        }
        else
        {
            cont.innerHTML = 'error';
        }
    }

Кнопки(меню)
Код:
function index() {
clearInterval(intervalID);
clearInterval(intervalID);

showContent_old('LED.CGI?table_Index','page_status')
}
function Page_var() {
clearInterval(intervalID);
clearInterval(intervalID);

showContent_old('LED.CGI?table_conteint','table_conteint')
showContent('LED.CGI?table_show','center_tabl_show')
}
function page_set() {
clearInterval(intervalID);
clearInterval(intervalID);

But_var[0].disabled=false;
showContent_old('LED.CGI?table_set','page_set')
}


При загрузки страницы выполняется
Код:
showContent_old('LED.CGI?table_conteint','table_conteint')
showContent('LED.CGI?table_show','center_tabl_show')


Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 30-01-2014 13:16 » 

Такие вещи программируются автоматом с состояниями. Должно быть два события: запуск таймера, остановка таймера. И состояние: запущен или выключен. Первое событие - из активации нужного пункта меню, второе - из активации любого другого. На каждое событие обработчик: если уже нужное состояние - ничего не делаем, если нет, то меняем состояние и выполняем операцию. Операции, соответственно, запуск и остановка таймера.

Аккуратно структурируй код под события и объекты, и всё получится без глюков.

Неплохо было бы всю эту логику с таймером выделить в отдельный объект, настраиваемый под любые действия.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 30-01-2014 13:38 » 

Ну.. здесь есть неявный автомат.

Думаю, что из кода все понятно.

Код:
<div>Старт</div>
<div>Стоп</div>

<script>
var status=1;
funcrion Start(){
 if (status){
  ajax({
   success: setTimeout(Start, 300)
  });
  status=1;
 }
}

funcrion Stop(){
   status=0;
}
</script>
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
pokk
Помогающий

ru
Offline Offline

« Ответ #3 : 30-01-2014 14:21 » 

Sla,  по пробую завтра  так сделать.
Как я понял ошибка была из за того, что если после отправки запроса  остановить таймер то после возвращения ответа таймер опять запустится.
Dimka ,  с классами и объектами не работал по этому для меня это пока тёмный лес.
Цитата
Такие вещи программируются автоматом с состояниями.
На такое похоже
http://chipenable.ru/index.php/programming-avr/item/90-realizatsiya-konechnogo-avtomata-state-machine.html
Может быть для саморазвития в качестве тренировке по пробую переделать.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 30-01-2014 14:44 » 

pokk, классов в JavaScript нет. А с объектами работать можно.

Например, в твоём случае.
Код: (Javascript)
                        // Конструктор объекта "Повторитель"
                        function Reapeater() {
                       
                                // Поле внутри объекта, снаружи не видно.
                                var _timerID = null;
                               
                                // Метод узнать состояние объекта
                                this.enabled = function() {
                                        return _timerID != null;
                                }
                               
                                // Метод включить
                                // action - функция, выполняющая действие
                                this.enable = function(action) {
                                        if(!this.enabled()) {
                                                // срабатывает, только если не включен - включает
                                                action(); // первым делом немедленно выполняет действие
                                                _timerID = window.setInterval(action, 300); // настраивает повтор через 0,3 сек.
                                        }
                                }
                               
                                // Метод выключить
                                this.disable = function() {
                                        if(this.enabled()) {
                                                // срабатывает, только если включен - выключает повторы
                                                window.clearInterval(_timerID);
                                                _timerID = null;
                                        }
                                }
                                                               
                        }                      
                       
                        // Глобальная переменная с объектом
                        var repeater = new Repeater(); // создаём один общий для всех обработчиков объект
                       
                        // Обработчики
                        // В одном включаем, в остальных выключаем
                       
                        function action1() {
                                repeater.disable(); // выключили
                                // Действия
                        }
                       
                        function action2() {
                                repeater.enable( // включаем
                                        function() {
                                                // Действия
                                        }
                                );
                        }
                       
                        function action3() {
                                repeater.disable(); // выключили
                                // Действия                            
                        }
                       
                        // И т.д.
« Последнее редактирование: 30-01-2014 23:31 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 30-01-2014 15:15 » 

pokk, м... предупреждаю... мой код не рабочий - это только концепт.
Для работы нужна еще одна функция

В моем коде, после того как нажата кнопка стоп, то сколько не жмакай старт ничего не произойдет.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 30-01-2014 23:32 » 

Я тоже у себя одну важную строчку пропустил - добавил.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 31-01-2014 11:28 » 

Как-то странно видеть от Dimka такой смешанный код
а именно  в этой части

Код:
                       // Глобальная переменная с объектом
                        var repeater = new Repeater(); // создаём один общий для всех обработчиков объект
                       
                        // Обработчики
                        // В одном включаем, в остальных выключаем
                       
                        function action1() {
                                repeater.disable(); // выключили
                                // Действия
                        }
                       
                        function action2() {
                                repeater.enable( // включаем
                                        function() {
                                                // Действия
                                        }
                                );
                        }
                       
                        function action3() {
                                repeater.disable(); // выключили
                                // Действия                           
                        }
Далее должен был последовать объект с необходимыми методами
Или же методы actionN должны быть описаны в repeater'е

зы Как я понимаю, это некий встроенный терминал, с управлением через веб интерфейс.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 31-01-2014 16:36 » 

Sla, так это ж обработчики. Я же не знаю, кто как и к чему их назначает.

Я в последнее время вообще ограничиваюсь:
Код: (HTML)
<script type="text/javascript">
  // ..

  window.onload = function() {
    application.initialize();
  }

  window.onunload = function() {
    application.finalize();
  }
</script>

Т.е. HTML-вёрстку вообще не делаю. И полагаю, что изобретаемые MS всякие WPF - это всё неправильно, а было правильно как раньше: генераторы кода на основе графического дизайна страницы. Потому что любая вёрстка - это статика. И её очень трудно комбинировать с динамикой.
« Последнее редактирование: 31-01-2014 16:43 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
pokk
Помогающий

ru
Offline Offline

« Ответ #9 : 07-02-2014 06:07 » 

Благодарю за помощь. Проблему решил  воткнул  http.abort()
сейчас по пробую ваш вариант.
Цитата
зы Как я понимаю, это некий встроенный терминал, с управлением через веб интерфейс.
Ага  вкл/выкл устройства + опрашивание датчиков и вывод данных на страницу.  И это всё на  stm32+wiznet 5500.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines