Где косяк ? функция 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, время: 01:40. |