Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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.
Ответить с цитированием
  #2 (permalink)  
Старый 17.03.2011, 09:32
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,147

Matre,
Как вариант
var flag = false;
$(window).scroll(function () {  if(flag) return;
flag = true;
//....
 if (request.readyState === 4 && request.status === 200) {  
 flag = false
Ответить с цитированием
  #3 (permalink)  
Старый 17.03.2011, 09:50
Профессор
Отправить личное сообщение для Matre Посмотреть профиль Найти все сообщения от Matre
 
Регистрация: 07.01.2011
Сообщений: 582

Спасибо.
Сейчас дождусь анбана IP и попробую.
Ответить с цитированием
  #4 (permalink)  
Старый 17.03.2011, 13:42
Профессор
Отправить личное сообщение для Matre Посмотреть профиль Найти все сообщения от Matre
 
Регистрация: 07.01.2011
Сообщений: 582

Да, всё отлично работает.
Ещё раз спасибо, рони.

P. S. я ведь ещё забыл про обновление значения переменной R после добавления строк, что ещё больше усугубляло проблему.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вытащить сведения из другой страницы с помощью js? makregistr Общие вопросы Javascript 6 28.12.2010 14:07
Как закрыть дочерние окно из родительского при помощи переключателя checkbox?? dieseln Общие вопросы Javascript 4 15.12.2010 16:30
Подскажите как при помощи JS hta в трею свернуть kimboo Общие вопросы Javascript 4 11.07.2008 16:00
Изменение шапки при обновлении страницы nasty blood (X)HTML/CSS 0 07.04.2008 13:13
Срабатывание скрипта при загрузке страницы bormax Общие вопросы Javascript 3 03.04.2008 09:57