О проектеГостеваяКарта сайта

Предложишь лучшее решение - получишь 100 рублей!

Счетчик кликов по ссылке (закачивания файла) на JS + jQuery

Задача: посчитать количество скачивайний какого-либо файла с сервера.

Плюсы данного метода: нет необходимости перенаправлять пользователя на какую-либо страницу, для поисковика ссылка остается "прямой".

Счетчик состоит из 2-х частей: браузерная ( на JS + jQuery)  и серверная на PHP

Пример обрабатываемого кода


Будут обрабатываться ссылки следующего вида:
  <a href="files/example.zip" name="dfile" filename="file" lineid="20" >

Решение

Браузерная часть
Javascript

<script type="text/javascript">
function RegisterDownload(obj){
  jQuery.post("file.php", {action:"RegisterDownload", FileName:obj.attr('FileName'), LineId:obj.attr('LineId')});
  document.location.href = obj.attr("a");
  }
  $(document).ready(function(){
  $("a[name='dfile']").click(function(){
  RegisterDownload($(this))
  });
  $("a[name='dfile']").each(function(){
  $(this).attr("a", $(this).attr("href"));
  $(this).attr("href", "javascript:void(0)");
  });
  });
</script>
 
Пример серверной части. Обработчик на PHP с записью кол-ва скачиваний в файл
PHP

<?php
if(isset($_POST['FileName']))
{
    $file=fopen($_SERVER['DOCUMENT_ROOT']."/exemple/js/16.txt","a+");
    flock($file,LOCK_EX);
        $count=fread($file,100);
        $count++;
    ftruncate($file,0);
    fwrite($file,$count);
    flock($file,LOCK_UN);
    fclose($file);
}
$file = fopen($_SERVER['DOCUMENT_ROOT']."/exemple/js/16.txt", "r");
    echo "Файл закачен ".fread($file,100)." раз";
fclose($file);
?>
 

 

 Этот код обрабатывает все элементы <a> с именем name="dfile". Всем подходящим элементам назначается событие onclick (пользователь нажал левой кнопкой мыши), при котором выполняется асинхронный запрос на сервер и отправляются переменные FileName и LineId, описывающие запись о файле. Вместо этих двух переменных можно использовать одну, содержащую имя файла – это кому как удобно.
Одновременно с этим скрипт блокирует атрибут href нашей ссылки на файл, заменяя его на "javascript:void(0)" – чтобы пользователь не смог скачать файл через меню по правой кнопке мыши.
В динамике кода это выглядит так:
Было: <a href = “путь к файлу”> 
Стало: <a href = “ javascript:void(0)” onclick=”RegisterDownload(this)”>
Для поисковиков ничего не меняется. Прямая ссылка остается прямой ссылкой, а вот пользователь теперь может скачать файл только по левому клику, но зато клик будет гарантированно отмечен функцией RegisterDownload, которая сперва отправляет асинхронный запрос, после чего ссылается на файл через document.location.href=’ путь к файлу’.

Источник: http://www.bifurcator.ru/blog.php?cmd=rus/home/blog/&select=PrimaryKey=18 Автор: Полтавский Михаил

Демо работы функции

Для примера, будем считать количество закачиваний скрипта на этой странице

Скачать скрипт
Файл закачен 460 раз

Рейтинг:

Теги: JavaScript счетчик количество скачивайний

Если вы знаете более оригинальное, красивое, ЛУЧШЕЕ решение этой задачи, у вас есть шанс заработать 100 рублей!!! Если ваше решение будет признано лучшим, деньги ваши! Мы гарантируем выплату!

PHP

 

Последние комментарии
  • phpguru

    Функция отличная только надо бы добавить для utf8 кодировку обработать строку, а то не все понимают как сделать подобное!
    $str = iconv_strlen($str,'UTF-8');
    Я так считаю!
    13-12-2013 в 12:59:38 ID# 454 посмотреть...


  • SnipCode.ru

    Возможно Вы правы, непонятно только зачем тут iconv_strlen (((
    13-12-2013 в 13:02:55 ID# 455 посмотреть...


  • Сергей

    поторопился, так надо в конце, пардон.
        return $v['pass'];
        }
    return FALSE;
    }

    02-12-2013 в 23:33:41 ID# 377 посмотреть...


  • Сергей

    Думаю все же логичней использовать foreach, т.к. можно промахнуться с ключами, а если массив ассоциативный (я раньше делал ключ = дата и время регистрации), то вообще работать не будет.
     
    function search($array,$login)
    {
       foreach ($array as $k=>$v)
        if($v['login'] == $login){
        return $v['pass'];
        }
    }
    return FALSE;
    Так, на минутку.
    Время исполнения смысла не имеет, авторизация используется 1 раз, если юзер не параноик)))

    02-12-2013 в 23:33:41 ID# 376 посмотреть...


  • Пабло

    Как сделана ваша система рейтинга,с учетом количеством людей,проголосовавших?
    11-11-2013 в 17:04:39 ID# 207 посмотреть...


  • SnipCode.ru

    ну...вобщем то все просто: берем общую оценку, делим на кол-во проголосовавших, получаем рейтинг
    11-11-2013 в 17:07:06 ID# 208 посмотреть...


  • Пабло

    Да,просто у меня возникли проблемы,при сохранении данных,в бд и отображение количество проголосовавших людей,у вас где нибудь на сайте описано как это сделано или будет?
     
    Мне нужна система рейтинга точно такая же как у вас=)
    11-11-2013 в 17:10:56 ID# 209 посмотреть...


  • KorniloFF

    Приведенный код обрезает до первой точки в строке, в случае, если в ней будет их несколько, что не соответствует теме.
    Вот код, обрезающий до последней точки:

    PHP

    $title= preg_replace("/([\s\S.]+)\.\w+$/","$1",$str)
     

    10-11-2013 в 10:45:29 ID# 205 посмотреть...


  • Виктор

    Все отлично работает! Извините , у меня есть задача отрезать после второй и до второй запятой , что нужно поправить в первом примере?
    Спасибо!
    30-09-2013 в 20:34:07 ID# 204 посмотреть...