Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.01.2014, 05:03
Кандидат Javascript-наук
Отправить личное сообщение для pokk Посмотреть профиль Найти все сообщения от pokk
 
Регистрация: 30.01.2014
Сообщений: 145

Где косяк ? функция showContent
Здравствуйте, есть у меня меню каждой кнопке которого соответствует
разный 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; }
            }
        }
    }


Кнопки(меню)
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')




Функция 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';
        }
    }
Ответить с цитированием
  #2 (permalink)  
Старый 30.01.2014, 07:46
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

1) Забей на всякие ActiveXObject - они уже давно не актуальны (IE6-7). Соответственно всякие if( http ) - тоже лишние проверки.
2) Происходит косяк тогда, когда клик пришелся в момент предыдущего запроса. То есть таймер мы сбросили, но когда придет ответ от сервера, то выполнится функция onreadystatechange, которая вновь запустит таймер. Решение - объявить http переменную выше, то есть рядом с intervalID. И при переходах на другую страницу помимо clearInterval вызывать http.abort()
3)
Сообщение от pokk
        clearInterval(intervalID);
        clearInterval(intervalID);
А че всего два раза? Надо продублировать строку трижды! Так надежнее!
И вобще, почти каждую строку кода надо для надежности дублировать несколько раз!
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #3 (permalink)  
Старый 30.01.2014, 09:33
Кандидат Javascript-наук
Отправить личное сообщение для pokk Посмотреть профиль Найти все сообщения от pokk
 
Регистрация: 30.01.2014
Сообщений: 145

danik.js, Благодарю за помощь сделал как вы сказали пару минут по нажимал на кнопки глюков больше не улавливаю =)
"А че всего два раза?" я проверял версию того что функция запускается два раза первый раз при загрузки страницы второй раз по кнопке.
Ответить с цитированием
  #4 (permalink)  
Старый 30.01.2014, 14:27
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от pokk
я проверял версию
Повторный вызов clearInterval (кстати, почему не clearTimeout?) лишен всякого смысла в любом случае!
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #5 (permalink)  
Старый 30.01.2014, 18:05
Кандидат Javascript-наук
Отправить личное сообщение для pokk Посмотреть профиль Найти все сообщения от pokk
 
Регистрация: 30.01.2014
Сообщений: 145

"кстати, почему не clearTimeout?"
А чем они отличаются ?
Скорее всего то что первое заработало или нашёл то и оставил =)
Так как с Javascript не знаком.
Ответить с цитированием
  #6 (permalink)  
Старый 30.01.2014, 20:41
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от pokk
А чем они отличаются ?
По-видимому ничем кроме названия. Но зачем запутывать код? Стираешь интервал - пиши clearInterval, стираешь таймаут - пиши clearTimeout. Разве это не очевидно?
__________________
В личку только с интересными предложениями
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JavaScript: функция возвращает undefined. Подскажите где я туплю fluffyMan2000 Общие вопросы Javascript 13 14.11.2013 11:21
Не могу понять где косяк в передаче или управлении. Mapcicc Общие вопросы Javascript 27 17.02.2013 22:34
Как узнать где находится функция, на которую указывает javascript:openTag('mgmt') amigo* Общие вопросы Javascript 13 11.04.2012 12:11
Где вызывается функция? cradis Общие вопросы Javascript 5 23.04.2011 13:47
Предполагается наличие объекта... не могу понять где косяк mp3moto Internet Explorer 3 18.06.2009 04:34