Где косяк ? функция 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'; } } |
1) Забей на всякие ActiveXObject - они уже давно не актуальны (IE6-7). Соответственно всякие if( http ) - тоже лишние проверки.
2) Происходит косяк тогда, когда клик пришелся в момент предыдущего запроса. То есть таймер мы сбросили, но когда придет ответ от сервера, то выполнится функция onreadystatechange, которая вновь запустит таймер. Решение - объявить http переменную выше, то есть рядом с intervalID. И при переходах на другую страницу помимо clearInterval вызывать http.abort() 3) Цитата:
И вобще, почти каждую строку кода надо для надежности дублировать несколько раз! |
danik.js, Благодарю за помощь сделал как вы сказали пару минут по нажимал на кнопки глюков больше не улавливаю =)
"А че всего два раза?" я проверял версию того что функция запускается два раза первый раз при загрузки страницы второй раз по кнопке. |
Цитата:
|
"кстати, почему не clearTimeout?"
А чем они отличаются ? Скорее всего то что первое заработало или нашёл то и оставил =) Так как с Javascript не знаком. |
Цитата:
|
Часовой пояс GMT +3, время: 20:04. |