Показать сообщение отдельно
  #1 (permalink)  
Старый 17.03.2011, 08:46
Профессор
Отправить личное сообщение для Matre Посмотреть профиль Найти все сообщения от Matre
 
Регистрация: 07.01.2011
Сообщений: 582

Подгружаемый контент при прокрутке страницы как Вконтакте
Захотел сделать такой скрипт, для форума.

Код не доработанный, ещё не всё переписал с 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);

		}
	});
});

Последний раз редактировалось Matre, 17.03.2011 в 09:05.
Ответить с цитированием