Захотел сделать такой скрипт, для форума.
Код не доработанный, ещё не всё переписал с jQuery, но суть от этого не меняется.
Работает он так:
В таблице .gTable есть TR, имеющие ID ttномер_темы — они мне и нужны, в них содержится ссылка на тему, профиль ТС и прочее. Я вычисляю позицию последнего такого TR среди всех строк в таблице, чтобы можно было добавить новую строку через .insertRow. При прокрутке я делаю запрос на следующую страницу раздела форума, перегоняю все нужные TR в текущую страницу.
Теперь, собственно, сама проблема:
При прокрутке вместо одной страницы раздела подгружаются примерно 10-20, видимо, из-за множественного срабатывания события scroll. И сервер всё время блокирует мой IP, подозревая DDoS. Пытался поставить тайм-аут между запросами в таком виде:
if (L < 1000) return; // прервать выполнение функции
...
L = new Date - L; // время между прошлым и текущим запросом
Но запросы всё равно отсылаются по несколько десятков раз.
Как бы можно было решить эту проблему?
Вот исходник, на всякий:
var gTable = document.getElementsByClassName("gTable")[0];
function getLastTrIndex() {
var elems = gTable.getElementsByTagName("TR"),
R = 0,
L;
for (var i = 0; i < elems.length; i++) {
R++;
if (elems[i].id.indexOf("tt") === 0) L = R;
}
return L;
}
jQuery(function ($) {
var T = $("#forumbody"),
R = T.position().top + T.height(),
I = 2,
L = 1001;
$(window).scroll(function () {
if (document.body.scrollTop + document.body.offsetHeight > R && L > 1000) {
L = new Date - L;
var request = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(),
cat = location.href.match(/m\/(\d+)/)[1];
request.open("GET", "/forum/" + cat + "-0-" + I++, true);
request.onreadystatechange = function () {
if (request.readyState === 4 && request.status === 200) {
var doc = document.createElement("DIV");
doc.innerHTML = request.responseText;
var elems = doc.getElementsByTagName("TR"),
U = getLastTrIndex();
for (var i = 0; i < elems.length; i++) {
if (elems[i].id.indexOf("tt") === 0) {
var TR = gTable.insertRow(U);
for (var j = 0; j < elems[i].cells.length; j++) {
var TD = TR.insertCell(j);
TD.innerHTML = elems[i].cells[j].innerHTML;
TD.className = elems[i].cells[j].className;
}
}
}
}
};
request.send(null);
}
});
});