Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Проверка страницы на скролинг
цитата
27/04/10 в 19:12
 San_Tehnik
Возможно ли проверить скролилась ли при посещении страница или нет? Может кто-то видел что-нибудь подобное готовое.
цитата
27/04/10 в 19:34
 remorhaz
Повеситься на onscroll.
цитата
27/04/10 в 19:43
 remorhaz
Тупой пример на коленке на Prototype:

Код:

<html>
<head>
  <script type="text/javascript" src="http://prototypejs.org/assets/2010/4/1/prototype.js"></script>
  <script type="text/javascript">
  Event.observe(window, 'scroll', function(event) {
   alert('You scrolled me!');
  });
  </script>
</head>
<body>
  <p>scroll me</p>
  <p>scroll me</p>
  <p>scroll me</p>
...куча контента...
</body>
</html>
цитата
27/04/10 в 23:25
 San_Tehnik
remorhaz: Спасибо, то что нужно smail54.gif
цитата
28/04/10 в 01:07
 freeek
можно на чистом javascript

Код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <script type="text/javascript">
//<![CDATA[
    function WhileScroll() {
    alert("i'm scrolled!");
    /**
    Здесь что то делаем...
    */
    }

    function MouseScroll(event) {
    if (!event) event = window.event;
    (event.wheelDelta || event.detail) && (WhileScroll());
    }

    function init() {
    if (window.addEventListener) window.addEventListener('DOMMouseScroll', MouseScroll, false);
    window.onmousewheel = document.onmousewheel = MouseScroll;
    }
    (function (){init();}());
    //]]>
    </script>

    <title>Scroll Handler</title>
    <style type="text/css">
/*<![CDATA[*/
    div.c1 {width: 100%; height: 2000px;}
    /*]]>*/
    </style>
</head>

<body>
    <div class="c1">
        <span>Some content</span>
    </div>
</body>
</html>
цитата
28/04/10 в 02:09
 San_Tehnik
freeek: Спасибо и в репу smail54.gif А вот если такую проверку делать на сидже для каждого уника как будут обстоять дела с нагрузкой на сервер? не загнется?
цитата
28/04/10 в 08:06
 leroy_17
так это же на стороне юзера чекается , если вызываешь скрипт который просто пишет параметры то нормально должен отрабатывать
цитата
28/04/10 в 20:03
 San_Tehnik
leroy_17: Точно, натупил я немного. А как эти данные на сервер передать?
цитата
28/04/10 в 20:46
 NetSpider
San_Tehnik писал:
leroy_17: Точно, натупил я немного. А как эти данные на сервер передать?

Можно с помощью AJAX, только не увлекаться, чтобы не слалось слишком много данных (не часто). Скорее всего, привязать отправку к событию onMouseUp.
Простая легковесная библиотека - xajax, очень удобно.
цитата
28/04/10 в 20:47
 freeek
наверное через ajax
цитата
28/04/10 в 21:29
 alex.raven
NetSpider писал:

Можно с помощью AJAX, только не увлекаться, чтобы не слалось слишком много данных (не часто). Скорее всего, привязать отправку к событию onMouseUp.


так всё равно ж будет передавать кучу событий, а нам ведь нужно только одно? хотя, это тоже просто:

Код:

<script type="text/javascript>
var scrolled=0;
function onScroll()
{
    if (scrolled==0)
    {
        scrolled=1;
        call_my_ajax_function();
    }
}
</script>


NetSpider писал:

Простая легковесная библиотека - xajax, очень удобно.


странные какие-то у тебя понятия о легковесности smail101.gif
цитата
28/04/10 в 21:44
 Dr.Syshalt
jquery все ж лучше будет, имхо, да и стандартнее чуток
цитата
28/04/10 в 21:59
 alex.raven
Вот тебе готовый работающий пример:

index.html (страница, которая посылает событие onscroll php-скрипту, 1 раз независимо от того сколько её таскали туда-сюда):

Код:

<html>
<head>
<title>My page</title>
<script type="text/javascript" src="JsHttpRequest.js"></script>
</head>
<body onscroll="onScroll()">
<input type="hidden" id="scrolled" value="0" />
<script type="text/javascript">
function update_my_php_script()
{
    var req = new JsHttpRequest();
    req.onreadystatechange = function()
    {
        if (req.readyState == 4)
        {
            document.getElementById('debug').innerHTML = req.responseText;
        }
    }
    req.open('GET', 'my_php_script.php', true);
    req.send( { 'url': window.location } );
}

function onScroll()
{
    if (document.getElementById('scrolled').value=="0")
    {
        document.getElementById('scrolled').value="1";
        update_my_php_script();
    }
}
</script>

<div id="debug" style="padding:10px; border:1px dashed red; background-color:lightyellow"></div>

<!--
Здесь много-много контента, чтобы было, собственно, что скроллить =)
-->

</body>
</html>


а это собственно, my_php_script.php скрипт, который делает что-то, когда страницу скроллили, ему в $_GET[url] передаётся адрес страницы, которую скроллили:

Код:

<?php
require_once "JsHttpRequest.php";
$JsHttpRequest =& new JsHttpRequest("utf-8");

$url = $_GET['url'];
echo "the page {$url} was scrolled!";
?>


для этой всей байды использовалась библиотека JsHTTPRequest Дмитрия Котерова (dklab, denwer), всего 2 файла общим объёмом 38кб (без компрессии, с компрессией меньше 20): http://www.dklab.ru/lib/JsHttpRequest/

почему именно эта библиотека? я в своё время перелопатил много чего разного (jQuery, prototype), но ничего компактнее и проще в использовании не нашёл.
цитата
29/04/10 в 00:39
 NetSpider
alex.raven писал:
Вот тебе готовый работающий пример:
...
для этой всей байды использовалась библиотека JsHTTPRequest Дмитрия Котерова (dklab, denwer)


JsHTTPRequest - согласен, забыл за нее. =)
xajax использовал потому что она самая простая, по крайней мере раньше была, сейчас ее немного переделали.

Код:
if(document.getElementById('scrolled').value=="0")


а чем плоха 1 булева переменная?
Код:
<script type="text/javascript">
var ScrollReported = false;
function update_my_php_script()
...
if (!ScrollReported)
...
update_my_php_script();
ScrollReported = !ScrollReported;
// или ScrollReported = true;
цитата
29/04/10 в 00:54
 alex.raven
NetSpider писал:

а чем плоха 1 булева переменная?


не знаю, где-то протупил, не работало у меня, т.е присваиваю глобальной переменной внутри функции 1, а в результате она всё равно 0 icon_smile.gif
цитата
29/04/10 в 02:57
 Sterx
>почему именно эта библиотека? я в своё время перелопатил много чего разного (jQuery, prototype), но ничего компактнее и проще в использовании не нашёл.
Оффтопик: забавно, единственный плюс ее для меня это грузить файло без флеша и айфреймов, в остальном довольно громоздка
цитата
29/04/10 в 21:12
 remorhaz
ТС, а тебе для чего данные-то передавать, для статистики? Просто, если с GoogleAnalytics работаешь, то там можно прямо через его API данные о скроллинге в статистику добавлять, не мудрствуя лукаво.
цитата
29/04/10 в 21:25
 Yury


если для статсов, то очень полезная штука clicktale.com
узнаешь много нового
цитата
29/04/10 в 22:15
 San_Tehnik
remorhaz: Хочется подобную проверку сделать для своих трейдеров. По идее, если скрола страницы небыло, но были клики по тумбам, которые без скролинга не увидеть, то по идее это бот. Вот только, если боты и такой вариант эмулируют, то не имеет смысла все это закручивать.
цитата
29/04/10 в 23:51
 remorhaz
Эмулировать это не проблема, но, думаю, многие боты на этом заморачиваться не будут. Это ж нужно еще догадаться, что у тебя такая проверка происходит. Но внимательный человек догадается, конечно же.
цитата
29/04/10 в 23:56
 remorhaz
Достаточно в общем-то отследить HTTP-поток при помощи, например, Tamper Data - и сразу будет видно, что идут лишние обращения к серверу. Так что это в общем так, от дурачка защита.
цитата
01/05/10 в 06:15
 San_Tehnik
Действительно, может метод далеко и не лучший, но если боты до сих пор и по скрытым ссылкам кликают и тд. То может худо бедно и поможет такой вариант. Может кто-нибудь разовьет идею дальше?
цитата
01/05/10 в 09:57
 NetSpider
Где-то читал, что боты не умеют эмулировать событие OnMouseMove, правда/нет - не знаю. Можно и его фиксировать и анализировать статистику.
цитата
01/05/10 в 15:55
 alex.raven
Вообще-то, боту нет необходимости скроллить страницу, чтобы добраться до тумбы, которая без прокрутки не видна - т.к бот получает сразу всю страницу, и соответственно, может имитировать клики по любым. В таком случае надо вешать проверку и onscroll и onclick, чтобы проверять что это были клики именно из браузера, а не имитация скриптом.
цитата
01/05/10 в 17:30
 x123p
alex.raven: Скажу честно идея хороша и стремление правильное. Но есть пару но: лично я знаю 2 способа как превратить обычный браузер в бота и все события будут и всё остальное. И эти способы никакое не читерство, а просто средства автоматизации действий. А от простых ботов достаточно следующих проверок:
- линки скрытые (впрочем как и невидимые тумбы с линками)
- поддержка JS
- прогрузка всего контента полностью
А развивая твою идею тебе необходима следующая инфа на сервере чтобы сказать что это был бот:
- страница на которой был произведён клик.
- номер тумбы по которой был произведён клик(судя по всему ajax запрос придёться слать по каждому клику что может добавить тормозов юзеру)
- высота клиентской области юзера
- была ли страница проскролена
- желательно бы ещё писать User-Agent
Зная все эти параметры можно почти со стопроцентной вероятностью найти не слишком умного бота. Но возникают проблемы такие: В некоторых браузерах этот скрипт может например не работать или работать не правильно. первое что приходит на ум это например мобильные устройства или экзотика какая-нить ещё.

В общем дерзай. Если какая-то помощь техническая понадобиться стучи.
Стр. 1, 2  >  последняя »


Эта страница в полной версии