Делаем голосование (+/-) на AJAX

Суть использования AJAX заключается в передаче данных на сервер без перезагрузки страницы - что очень удобно для пользователей. Сегодня мы напишем простейший пример использования этого в виде digg-like голосования, без использования js-фреймворков (библиотек типа jQuery или MooTools). Это теоретическая статья для желающих ознакомиться с технологией AJAX, для прикладного использования существуют готовые скрипты и плагины.
Структура такова: на странице есть множество объектов с уникальным id (например, список постов). Для каждого из них нужно показать текущее количество голосов, а так же ссылки для голосвания за или против. При голосовании на сервер отправляется информация об id и типе голоса, данные добавляются в базу, высчитывается новый рейтинг и данные отправляются обратно на страницу, обновляя рейтинг (естественно, без перезагрузки страницы).
Начнем с основной функцией, реализующей асинхронную передачу данных (в разных источниках она выглдяит по разному и не всегда работает):
function getXmlHttp(){
var xmlhttp;
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
xmlhttp = new XMLHttpRequest();
}
return xmlhttp;
}
Я не буду останавливаться на подробном разборе этой функции, это не так уж важно, главное что она работает.
HTML-код, 17 - идентификатор объекта:
<div>
<a href="#" onclick="vote('rulez','17')">плюс</a>
<div id=votestatus17> 0 </div>
<a href="#" onclick="vote('sux','17')">минус</a>
</div>
Две ссылки для голосвания, хотя можно реализовать их как угодно - кнопками, картинками, главное сделать вызов нашей js-функции. В блоке votestatus[id] отображается текущий рейтинг и впоследствии обновленный (а так же статус загрузки).
А вот и основная функция, реализующая голосование:
function vote(type,id){
var req = getXmlHttp()
req.onreadystatechange = function() {
if (req.readyState == 4) {
if(req.status == 200) {
document.getElementById('votestatus' + id).innerHTML = req.responseText;
}
}
}
req.open('GET', 'vote.php?type='+type+'&id=' + id, true);
req.send(null);
document.getElementById('votestatus' + id).innerHTML = 'загрузка...';
}
Читаем код с конца
Как только функция вызывается, на место текущего рейтинга помещается заглушка (можно вставить gif-картинку к примеру). Данные отправляются скрипту vote.php через GET параметры, а как только запрос выполнится - отправляет на страницу возвращенный скриптом ответ.
Сам скрипт vote.php индивидуален, но к примеру он может быть таким:
<?
$type=$_GET['type'];
$id=$_GET['id'];
/*
//Обновляем рейтинг в базе
if($type=="rulez") mysql_query("UPDATE posts SET votes=votes+1 WHERE id='$id'");
if($type=="sux") mysql_query("UPDATE posts SET votes=votes-1 WHERE id='$id'");
//Получаем новый рейтинг и выводим его
$row=mysql_fetch_array(mysql_query("SELECT votes FROM posts WHERE id='$id'"));
echo $row['votes'];
*/
//А чтобы тестовый пример работал
echo rand(1,10);
?>
Естественно, сюда стоит добавить защиту от накрутки (по IP), красиво оформить кнопки голосования, блокировать (или просто скрывать) их после нажатия и т.д., но это выходит за рамки статьи.
Вот в принципе и всё
Автор: Spryt
Похожие записи:
- Показ/Скрытие блока
- Ajax в браузере IE7
- AJAX & JavaScript Barcode Generator: встраиваемый генератор штрих-кодов для web-приложений
- Google Chart API
- Визуальный редактор HTML


(27 голосов, средний: 4.19 из 5)
В демо я нажал плюс и прибавилось 5, нажал минус – стало 9. Странности какие-то.
В демо рандом. В живую пример можно посмотреть, к примеру, на сайте feedbang.ru (только там блокировка только один голос от человека учитывается)
Я-то понимаю, что в демо. Но может стоит сделать более презентабельное? Ибо в итоге не рандом получается же…
Вообщем-то, это обучающая статья по использованию технологии AJAX, а не математического алгоритма голосования. Как пример кода, вполне.
watches storeReplica Cartier WacthesReplica Bell Ross WacthesReplica WacthesFake Replica Wacthesreplica Baume & Mercier CapeLand watches salePatek Philippebuy Cartier Montres Ballon bleu watchesReplica Casio Baby-G WatchesRado watches online
wedding dresses wedding gowns wedding dress bridal dressesflower girls dressesdiscount wedding dressescelebrity wedding dressesquinceanera dressesdesigner evening dressesSpecial Occasion Dresse
christian louboutin outletlouboutin outletoutlet christian louboutinoutlet louboutinchristian louboutin shoeslouboutin outletchristian louboutin sneakerschristian louboutin mary janeschristian louboutin sneakerschristian louboutin bridal
discount boots
Christian Louboutin
christian louboutin sale
christian louboutin boots
louboutin shoes
replica watches
fake watches
A. Lange & Sohne
A. Lange & Sohne Watches
A. Lange & Sohne Watches sale
.Collectors of such watches will certainly visit a number of sites in the daytime.The more varieties an individual might offer, the far more business are going to be conducting which will make them more money.A full web shop is some sort of store that will make income.
Companies find Switzerland army designer watches at yard sales, fine art auctions, and by way of ads set newspapers.They are willing to even purchase from other on-line vendors.You need to be trustworthy about products that particular would want to sell on the net.If a watch is nicked, the buyer have to be told over it.Chances are generally, they will certainly still tend to bid for the watch.If you are not, there are going to be others who will not have trouble with a the start
tiffany and co tiffany cotiffany silverbuy tiffany jewellerytiffany online storeTiffany BraceletsTiffany Cuff Link OutletTiffany Chains saletiffany ringsTiffany Key Chain
Canada Goose Jacket Women
canada goose outlet
canada goose sale
canada goose outlet
canadagoose
Canada Goose Online Canada
Ladies Parkas
Canada Goose Ladies Trillium Parka
Canada Goose 2010
Jacket Canada Goose
.To acquire more information about the wedding, please see http://gov.wowgao.comAbout that Gao Types Companies:WowGao Inc.(www.wowgao.com) an affiliate of GAO Party, is a great award being successful leading party management organization that makes, since 2003, internationally known conferences together with expositions in which address modern innovations along with developments during the information products industry.Much of our featured activities include:Government & Well-being Technologies Convention and Expo, The spring of 15 & 18, 2008Wireless & Phone Expo together with Conference, August 15 & 18, 2008RFID Site, July 15 & 18, 2008Financial Expertise Technology Community forum, October 2008GAO Inserted Inc
Tiffany JewelryBuy Tiffany JewelleryTiffany & co OutletTiffany Jewellery on SaleTiffany Jewelry Outlettiffany&co earringskey pendant tiffanytiffany banglestiffany accessories for saletiffany sets
north facethe north facenorthfacenorth face jacketsnorth face outlet northface jackets for kidsgore tex pro shellthe north face gore texsnow pantsnorth face realization jacket
shoes sale
Christian Louboutin
christian louboutin sale
christian louboutin boots
louboutin shoes
Canada Goose JacketsCanada Goose ChilliwackCanada GeeseCanada Goose Jackets Sale Canada Goose Trillium Parka Goose Canada Canada Goose Parkas Sale Canada Goose Down ParkaMen’s Canada Goose Jacket CanadaGoose
ugg boots clearanceugg saleugg outletugg boots on saleugg storeUGG Roxy BootsUgg Classic Argyle Knit SaleUGG Roxy Short BootsUGGs Accessories on SaleUGG Tassel Boot Short 5835
Подскажите пожалуйста как избавится от кеширования??
По примеру сделал свой первый AJAX Скрипт, и не Знаю что куда дописывать((!
Если можно, поподробнее и самый верный способ.
Уже Разобрался!!!
Спасибо))!
Просто не выводило результат! Я не до конца поменял исходники((!
ugg bootsugg onlineugg boots stroeugg boots onlineugg boots clearanceugg broome boots on salediscount ugg langley bootsugg roxy short outletugg bailey button triplet bootsugg cable knit boots
watches onlinewatches online coReplica WacthesFake Replica WacthesReplica Omega WacthesRichard Mille watches salereplica Breguet watches for saleReplica Chopard Imperiale watchesGaGa watchesdicount Bell & Ross Collection Vintage watches
Replica Tag Heuer WacthesReplica Omega WacthesReplica Cartier WacthesReplica Bell Ross WacthesReplica Wacthesfake Rolex Daytona SS Wacthesbuy Breguet CLASSIQUE WacthesReplica U BOAT Classico 45mm Wacthesdiscount Longines Evidenza Collection WacthesReplica Cartier Wacthes
dre beatsbeats by dre headphonesbeats by dr dre studio modsmonster beatsbeats by dr dreMonster lady gaga headphones2011 New Dr Dre Studio For Christmas Giftsmonster beats for saleBeats Studio Lamborghini outletMonster Beats Studio Lamborghini
ugg boot saleugg clearanceugg on saleugg boots onlineugg boots australiaUGG Roxy Short Bootsugg boots onlineUGG BOOTS ONLINE UGG Classic ShortUGG Boots On Sale