За последние 24 часа нас посетили 17425 программистов и 1716 роботов. Сейчас ищут 1594 программиста ...

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

Тема в разделе "JavaScript и AJAX", создана пользователем Vantedur, 9 июл 2010.

  1. Vantedur

    Vantedur Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    779
    Симпатии:
    2
    нашел готовый скрипт голосования по система плюса (+) и минуса (-)

    не могу понять как заставить его определять в какой именно пост было произведено голосование, а также отличать голования в пост от голосований в комментарии.

    адрес дэмки
    http://demos.99points.info/digg_style_rating/

    код скрипта
    http://vtrigazety.ru/ajax.rar

    ну или возможно вам известен какой нить готовый скриптик отвечающий этим требованиям

    в принципе я хочу написать так чтобы скрипт отправлял данные в комментарии и в профиль юзера или в пост и в профиль юзера
    а также вел историю голосований дабы один и тодже пользователь не мог дважды проголосовать за один пост или комментарий

    не подскажите как это сделать? или быть может вам известен готовый скрипт соответствующий этим параметрам?

    то что в идеале хочу получить можно посмотреть здесь http://jquery.vtrigazety.ru/

    Оживить пытаюсь вот это

    Код (Text):
    1. <div class="blogpostsminus"><a href="#">-</a></div>
    2. <div class="blogpostsplus"><a href="#">+</a></div>
    3. <div class="blogpostsball"><a href="#"></a></div>
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    [js]
    $(document).ready(function(){

    $('.vwidget').children('a').click(function(){
    var a = $(this).attr("id");
    if(a == 1)
    var container = 'upcount';
    else
    var container = 'downcount';

    $.post("rating.php?value="+a, {
    }, function(response){
    //$('.upcount').fadeOut();
    $('.'+container).html(unescape(response));
    $('.'+container).fadeIn();
    });
    });

    $('#diggs0').click(function(){

    $.post("rating.php?v=1", {
    }, function(response){
    $('#diggs-strong').html(unescape(response));
    $('#diggs-strong').fadeIn();
    });
    });
    }); [/js]

    в 4 строке он интересуется атрибутом "id" в теге "a" которые лежат в ком-то класса "vwidget". Если этот "id" равен единице, то считается что это "upcount", иначе - "downcount". А что это?.. Смотрим пример.

    HTML:
    1.         <div id="vwidget-419919" class="vwidget">      
    2.          <a class="upcount" href="#" id="1"><?php echo $row['up_rated']?></a>
    3.          <a class="downcount" href="#" id="2"><?php echo $row2['down_rated']?></a>
    4.         </div>
    О том, за кого голосуется - он мог бы узнать из id="vwidget-419919", но видимо такими мелочами данный код вобще не заморачивается.

    Мягко скажем код мне не нравится =)
     
  3. Vantedur

    Vantedur Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    779
    Симпатии:
    2
    это вывод инфы на сайте в варианте кода который в демке,

    но я хочу сделать так чтобы цеплялось
    Код (Text):
    1. <div class="blogpostsminus"><a href="#">-</a></div>
    2. <div class="blogpostsplus"><a href="#">+</a></div>
    3. <div class="blogpostsball"><a href="#"></a></div>
    сделать нечто вроди

    Код (Text):
    1.  
    2. пост1
    3. <div class="blogpostsminus"><a class="upcount" href="javascript: void(0)" id="1">-</a></div>
    4. <div class="blogpostsplus"><a class="upcount" href="javascript: void(1)" id="1">+</a></div>
    5. <div class="blogpostsball"><a href="#"></a></div>
    6.  
    7. пост2
    8. <div class="blogpostsminus"><a class="upcount" href="javascript: void(0)" id="2">-</a></div>
    9. <div class="blogpostsplus"><a class="upcount" href="javascript: void(1)" id="2">+</a></div>
    10. <div class="blogpostsball"><a href="#"></a></div>
    11.  
    12. и тд
    13.  
    14.  
    15.  
    16. коммент1
    17. <div class="blogcommentsminus"><a class="upcount" href="javascript: void(0)" id="1">-</a></div>
    18. <div class="blogcommentsplus"><a class="upcount" href="javascript: void(1)" id="1">+</a></div>
    19. <div class="blogcommentsball"><a href="#"></a></div>
    20. коммент2
    21. <div class="blogcommentsminus"><a class="upcount" href="javascript: void(0)" id="2">-</a></div>
    22. <div class="blogcommentsplus"><a class="upcount" href="javascript: void(1)" id="2">+</a></div>
    23. <div class="blogcommentsball"><a href="#"></a></div>
    24.  
    25. ну или както по другому, в общем чтобы работало
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    <a onclick="vote(1123421,'u')"></a>
    <a onclick="vote(1123421,'d')"></a>
    <a onclick="vote(1123421,'1')"></a><a onclick="vote(1123421,'2')"></a><a onclick="vote(1123421,'3')"></a>...

    В функции уже обрабатывать номер поста и оценки или че там... И делать выводы, действия и т.п. Ломиться аяксом на пхп скрипт, получать результаты голосования, выписывать их...

    А в чем беда-то так сделать?
     
  5. Vantedur

    Vantedur Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    779
    Симпатии:
    2
    можно так
    Код (Text):
    1. <a onclick="vote(1123421,'u')"></a> + балл к посту id 1123421
    2. <a onclick="vote(1123421,'d')"></a>  - балл к посту id 1123421
    здесь тогда что будет?
    [js]<script type="text/javascript">
    // <![CDATA[
    $(document).ready(function(){

    $('.vwidget').children('a').click(function(){
    var a = $(this).attr("id");
    if(a == 1)
    var container = 'upcount';
    else
    var container = 'downcount';

    $.post("rating.php?value="+a, {
    }, function(response){
    //$('.upcount').fadeOut();
    $('.'+container).html(unescape(response));
    $('.'+container).fadeIn();
    });
    });

    $('#diggs0').click(function(){

    $.post("rating.php?v=1", {
    }, function(response){
    $('#diggs-strong').html(unescape(response));
    $('#diggs-strong').fadeIn();
    });
    });
    });
    // ]]>
    </script>[/js]
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Vantedur
    здесь тогда что будет?

    Ничего там не будет. на эту каку вобще смотреть не надо.
    http://api.jquery.com/jQuery.ajax/

    надо делать типа примерно так
    [js]
    function vote (id, action) {

    reply = jQuery.ajax({
    type: "POST",
    url: "vote.php",
    data: "id="+id+"&action="+action
    }).responseText;

    }[/js]

    и в пхп уже плясать как нравится. Эта... Можно json запрос мутить. он jquery хорошо поддерживается и обрабатывается удобно.
     
  7. Vantedur

    Vantedur Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    779
    Симпатии:
    2

    не пойму что не так?
    [js]<script type='text/javascript'>
    function vote (id, action) {

    reply = jQuery.ajax({
    type: "POST",
    url: "post.php",
    data: "id="+id+"&action="+action
    }).responseText;

    }
    </script>[/js]


    Код (Text):
    1. <a onclick="vote(<?php echo $line[0];?>,'u')">-</a>
    PHP:
    1. <?php
    2. $id = $_POST['id'];
    3. $blogpostsminus = $_POST['action'];
    4. $sql="SELECT id, ball FROM blogposts WHERE id='".$id."'";
    5. $cur_votes = $line[1];
    6. $post_minus = $cur_votes[0]-1;
    7. $sSQL="UPDATE blogposts SET ball='".$post_minus."' WHERE id='".$id."'";
    8.  
    9. ?>
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а что не так?

    кстати апдейт лучше делать не задавая абсолютных значений. мало ли что.
     
  9. Vantedur

    Vantedur Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    779
    Симпатии:
    2
    нарыл отличную голосовалку однако она столь огромная что не понятно как её с php завязать.
    http://vtrigazety.ru/lepra.png принт скрин

    линк на код http://leprosorium.ru/js/voting.js?rev=121


    [js]function initVoting(type, parentElementId){
    var voteBlocks = getElementsByClassName($(parentElementId), 'div', 'vote');
    if(voteBlocks.length == 0) return;

    switch (type){
     case "posts":
      VoteBlock.type = VoteBlock.typePost;
      VoteBlock.theChoiceElement = $('vote_choice');
      VoteBlock.initChoiceElements();
      for (var i=0; i<voteBlocks.length; i++){
       new VoteBlock(voteBlocks);
      }  
      break;
     case "comments":
      VoteBlock.type = VoteBlock.typeComment;
      for (var i=0; i<voteBlocks.length; i++){
       new VoteBlockComments(voteBlocks);
       //initShrink(voteBlocks.parentNode);
      }  
      break;
     case "lepraposts":
      VoteBlock.type = VoteBlock.typePost;
      for (var i=0; i<voteBlocks.length; i++){
       new VoteBlockComments(voteBlocks);
      }
      break;
     default:
      break;
    }
    }


    function initShrink(parent){
    if(getElementsByClassName(parent, 'a', 'show_link').length == 0) return;

    var showLink = getElementsByClassName(parent, 'a', 'show_link')[0];
    showLink.onclick = function (){
     removeClass(this.parentNode.parentNode.parentNode, 'shrinked');
     return false;
    }
    }


    /* Класс VoteBlock (для голосования с плюсом и лопатой)
    ***************************************************************/
    function VoteBlock(htmlObj){
    this.htmlObj = htmlObj; // контейнер, содержащий все элементы голосования
    if (getElementsByClassName(this.htmlObj, 'a', 'plus').length == 0){
     return;
    }
    this.htmlObjChildren = this.htmlObj.getElementsByTagName('*');

    this.htmlGlobalParent = htmlObj.parentNode.parentNode;  // родительский контейнер всего поста
    //this.htmlGlobalParent = htmlObj.parentNode;  // родительский контейнер
    this.plusBtn = getElementsByClassName(this.htmlObj, 'a', 'plus')[0];  // контейнер с кнопкой +
    this.minusBtn = getElementsByClassName(this.htmlObj, 'a', 'minus')[0]; // контейнер с кнопкой -
    this.rating = getElementsByClassName(this.htmlObj, 'span', 'rating')[0].firstChild; // контейнер с рейтингом


    this.htmlObj.obj = this;
    this.plusBtn.obj = this;
    this.minusBtn.obj = this;
    this.rating.obj = this;

    this.voteType = VoteBlock.type;

    this.initChoiceEvents();

    }

    // Статическое свойство VoteBlock.theChoiceElement
    VoteBlock.theChoiceElement = {}; // html контейнер с элементами выбора, перемещаемый по дереву документа (всегда имеет родителем this.htmlGlobalParent)
    VoteBlock.theChoiceElement.elements = []; // массив всех элементов списка VoteBlock.theChoiceElement
    VoteBlock.theChoiceElement.currentObj = {}; // ссылка на объект класса VoteBlock, внутри которого сейчас находится VoteBlock.theChoiceElement
    VoteBlock.urlVoting = "/rate/?"; // url при голосовании + -
    VoteBlock.type = "";
    VoteBlock.typeComment = 0;  // для указания, что голосуем по комментам
    VoteBlock.typePost = 1; // для указания, что голосуем по постам
    VoteBlock.wtf = ""; //

    // Статический метод, инициализирующий объект VoteBlock.theChoiceElement и все его элементы
    VoteBlock.initChoiceElements = function(){
    VoteBlock.theChoiceElement.elements = VoteBlock.theChoiceElement.getElementsByTagName('a');
    for (var i=0; i<VoteBlock.theChoiceElement.elements.length; i++){
     VoteBlock.theChoiceElement.elements.onclick = function(){
      if(matchClass(this, 'voted')){
       return false;
      } else {
       var currentObj = VoteBlock.theChoiceElement.currentObj;
       var postId = currentObj.htmlGlobalParent.getAttribute('id').substring(1);
       var choiceValue = this.getAttribute('choiceValue');
       var url = VoteBlock.urlVoting + "wtf=" + VoteBlock.wtf + "&type=" + this.obj.voteType + "&id=" + postId + "&value=" + choiceValue;

       currentObj.setChoiceVoted(choiceValue); // отрисовываем выбранный элемент
       addClass(currentObj.htmlGlobalParent, 'loading'); // ставим прелоадер
       ajaxLoad(url, currentObj.onLoad, currentObj); // отправляем/получаем данные
       return false;
      }
     }
    }
    }

    VoteBlock.prototype.initChoiceEvents = function (){
    this.htmlObj.onmouseout = function(e){
     if(!e) e = window.event;
     this.obj.hideChoice(e);
    }

    // Кнопка +
    this.plusBtn.onmouseover = function(e){
     if(!e) e = window.event;
     this.obj.hideChoice(e, this);
    }

    this.plusBtn.onclick = function(){
     this.blur();
     if(matchClass(this, 'voted')){
      return false;
     } else {
      var postId = this.obj.htmlGlobalParent.getAttribute('id').substring(1);
      var choiceValue = 1;
      var url = VoteBlock.urlVoting + "wtf=" + VoteBlock.wtf + "&type=" + this.obj.voteType + "&id=" + postId + "&value=" + choiceValue;

      this.obj.setChoiceVoted(null);
      addClass(this, 'voted'); // отмечаем сделанный выбор
      addClass(this.obj.htmlGlobalParent, 'loading'); // ставим прелоадер
      ajaxLoad(url, this.obj.onLoad, this.obj); // отправляем/получаем данные
      return false;
     }
    }

    // Кнопка -
    this.minusBtn.onmouseover = function(){
     this.obj.showChoice();

     // отвратительный хак против IE6- (заставляет не скакать правую колонку)
     if(typeof document.body.style.maxWidth == 'undefined' && $('content_right_inner')){
      $('content_right_inner').style.display = "none";
      $('content_right_inner').style.display = "block";
     }
    }

    this.minusBtn.onclick = function(){
     this.blur();
     return false;
    }
    }

    // Отрисовка блока VoteBlock.theChoiceElement
    VoteBlock.prototype.showChoice = function(){
    if (typeof VoteBlock.theChoiceElement == 'undefined') return;

    VoteBlock.theChoiceElement.currentObj = this; // создаем ссылку на новый родительский объект у VoteBlock.theChoiceElement
    addClass(VoteBlock.theChoiceElement.currentObj.htmlGlobalParent, 'inuse'); // располагаем htmlGlobalParent поверх отсальных

    this.showChoiceVoted(); // отрисовываем текущий голосованный элемент

    this.htmlObj.appendChild(VoteBlock.theChoiceElement);
    VoteBlock.theChoiceElement.style.display = 'block';
    }

    VoteBlock.prototype.hideChoice = function(e, obj){
    if (typeof VoteBlock.theChoiceElement == 'undefined') return;

    // если mouseover на кнопке "плюс", скрываем чойс бокс
    if(obj && matchClass(obj, "plus")){
     addClass(this.htmlGlobalParent, 'inuse'); // располагаем htmlGlobalParent поверх отсальных
     VoteBlock.theChoiceElement.style.display = 'none';
     return;
    }

    // если элемент, на который передвигаем мышь, лежит внутри чойс блока, выходим
    if (e.relatedTarget) {
     var where = e.relatedTarget;
     if (where == this.htmlObj) return;
     if (where.nodeType == 3) where = where.parentNode;
     for(var i=0; i<this.htmlObjChildren.length; i++){
      if (where == this.htmlObjChildren) {
       return;
      }
     }
    } else if (e.toElement && this.htmlObj.contains(e.toElement)) {
     return;
    }

    removeClass(this.htmlGlobalParent, 'inuse'); // снимаем свойство с htmlGlobalParent лежать поверх отсальных
    VoteBlock.theChoiceElement.style.display = 'none';
    }

    // Отрисовка пункта, за который проголосовали, в списке элементов VoteBlock.theChoiceElement
    VoteBlock.prototype.showChoiceVoted = function (){
    var currentChoiceValue = this.minusBtn.getAttribute('choiceValue');
    for (var i=0; i<VoteBlock.theChoiceElement.elements.length; i++){
     var currentElement = VoteBlock.theChoiceElement.elements;
     if (currentElement.getAttribute('choiceValue') == currentChoiceValue){
      addClass(currentElement, 'voted');
     } else {
      removeClass(currentElement, 'voted');
     }
    }
    }

    // Установка нового выбранного значения в списке элементов VoteBlock.theChoiceElement
    VoteBlock.prototype.setChoiceVoted = function(choiceMinusValue){
    this.minusBtn.setAttribute('choiceValue', choiceMinusValue);
    if(matchClass(this.plusBtn, 'voted')) {
     removeClass(this.plusBtn, 'voted');
    }
    this.showChoiceVoted();
    }

    VoteBlock.prototype.onLoad = function (ajaxObj){
    var newRating = ajaxObj.responseText;
    this.rating.innerHTML = newRating;
    removeClass(this.htmlGlobalParent, 'loading'); // убираем прелоадер
    }




    /* Подкласс VoteBlockComments (для голосования с плюсом и минусом)
    *************************************************************************/
    function VoteBlockComments (htmlObj){
    VoteBlockComments.baseConstructor.call(this, htmlObj);
    }
    VoteBlockComments.inheritFrom(VoteBlock);

    VoteBlockComments.prototype.initChoiceEvents = function (){

    this.htmlObj.onmouseout = function(e){
     if(!e) e = window.event;
     this.obj.hideChoice(e);
    }

    // Кнопка +
    this.plusBtn.onmouseover = function(e){
     return false;
    }

    this.plusBtn.onclick = function(){
     this.blur();
     if(matchClass(this, 'voted')){
      return false;
     } else {
      var postId = this.obj.htmlGlobalParent.getAttribute('id');
      var choiceValue = 1;
      var url = VoteBlock.urlVoting + "wtf=" + VoteBlock.wtf + "&type=" + this.obj.voteType + "&id=" + postId + "&value=" + choiceValue;

      addClass(this, 'voted'); // отмечаем сделанный выбор
      removeClass(this.obj.minusBtn, 'voted') // снимаем отметку о противоположном голосовании
      addClass(this.obj.htmlGlobalParent, 'loading'); // ставим прелоадер

      ajaxLoad(url, this.obj.onLoad, this.obj); // отправляем/получаем данные

      return false;
     }
    }

    // Кнопка -
    this.minusBtn.onmouseover = function(){
     return false;
    }

    this.minusBtn.onclick = function(){
     this.blur();
     if(matchClass(this, 'voted')){
      return false;
     } else {
      var postId = this.obj.htmlGlobalParent.getAttribute('id');
      var choiceValue = -1;
      var url = VoteBlock.urlVoting + "wtf=" + VoteBlock.wtf + "&type=" + this.obj.voteType + "&id=" + postId + "&value=" + choiceValue;

      addClass(this, 'voted'); // отмечаем сделанный выбор
      removeClass(this.obj.plusBtn, 'voted') // снимаем отметку о противоположном голосовании
      addClass(this.obj.htmlGlobalParent, 'loading'); // ставим прелоадер
      addClass(this.obj.htmlGlobalParent, 'shrinked');

      ajaxLoad(url, this.obj.onLoad, this.obj); // отправляем/получаем данные
      return false;
     }
     return false;
    }

    this.rating.onmouseover = function(){
     this.obj.showChoice();
    }
    }

    VoteBlockComments.prototype.showChoice = function(){
    addClass(this.htmlGlobalParent, 'inuse');
    }

    VoteBlockComments.prototype.hideChoice = function(e, obj){

    // если элемент, на который передвигаем мышь, лежит внутри чойс блока, выходим
    if (e.relatedTarget) {
     var where = e.relatedTarget;
     if (where == this.htmlObj) return;
     if (where.nodeType == 3) where = where.parentNode;
     for(var i=0; i<this.htmlObjChildren.length; i++){
      if (where == this.htmlObjChildren) {
       return;
      }
     }
     //e.relatedTarget.style.border = "none"; // странно, но это побороло баг в Opere :/
    } else if (e.toElement && this.htmlObj.contains(e.toElement)) {
     return;
    }

    removeClass(this.htmlGlobalParent, 'inuse');
    }



    /* Класс VoteBlockUser (для голосования с 2 плюсами и 2 минусами по юзеру)
    *************************************************************************/
    function initVotingUser (parentObjId){
    var parentObj = $(parentObjId);
    var voteBlocks = parentObj.getElementsByTagName('strong');
    if(voteBlocks.length == 0) return;

    var ratingBlock = getElementsByClassName(parentObj, 'span', 'rating')[0].firstChild; // контейнер с рейтингом

    for (var i=0; i<voteBlocks.length; i++){
     new VoteBlockUser(voteBlocks, ratingBlock);
    }
    }


    function VoteBlockUser(htmlObj, ratingBlock){
    this.htmlObj = htmlObj;

    this.htmlGlobalParent = htmlObj.parentNode.parentNode;  // родительский контейнер всего поста
    this.plusBtn = getElementsByClassName(this.htmlObj, 'a', 'plus')[0];  // контейнер с кнопкой +
    this.minusBtn = getElementsByClassName(this.htmlObj, 'a', 'minus')[0]; // контейнер с кнопкой -
    this.rating = ratingBlock;

    this.htmlObj.obj = this;
    this.plusBtn.obj = this;
    this.minusBtn.obj = this;
    this.rating.obj = this;

    this.initChoiceEvents();
    }

    VoteBlockUser.urlVoting = "/karma/"; // url при голосовании + -
    VoteBlockUser.wtf = ""; //

    VoteBlockUser.prototype.initChoiceEvents = function (){
    this.plusBtn.onclick = function(){
     this.blur();
     if(matchClass(this, 'voted')){
      return false;
     } else {
      var userId = this.obj.htmlGlobalParent.getAttribute('uid');
      var choiceValue = this.getAttribute('choiceValue');
      var url = VoteBlockUser.urlVoting;
      var data = "wtf=" + VoteBlockUser.wtf + "&u_id=" + userId + "&value=" + choiceValue;

      addClass(this, 'voted'); // отмечаем сделанный выбор
      removeClass(this.obj.minusBtn, 'voted') // снимаем отметку о противоположном голосовании
      addClass(this.obj.htmlGlobalParent, 'loading'); // ставим прелоадер

      ajaxLoadPost(url, data, this.obj.onLoad, this.obj); // отправляем/получаем данные
      return false;
     }
    }

    this.minusBtn.onclick = function(){
     this.blur();
     if(matchClass(this, 'voted')){
      return false;
     } else {
      var userId = this.obj.htmlGlobalParent.getAttribute('uid');
      var choiceValue = this.getAttribute('choiceValue');
      var url = VoteBlockUser.urlVoting;
      var data = "wtf=" + VoteBlockUser.wtf + "&u_id=" + userId + "&value=" + choiceValue;
     
      addClass(this, 'voted'); // отмечаем сделанный выбор
      removeClass(this.obj.plusBtn, 'voted') // снимаем отметку о противоположном голосовании
      addClass(this.obj.htmlGlobalParent, 'loading'); // ставим прелоадер

      ajaxLoadPost(url, data, this.obj.onLoad, this.obj); // отправляем/получаем данные
      return false;
     }
     return false;
    }

    }

    VoteBlockUser.prototype.onLoad = function (ajaxObj){
    var newRating = ajaxObj.responseText;
    this.rating.innerHTML = newRating;
    removeClass(this.htmlGlobalParent, 'loading'); // убираем прелоадер
    }



    /* Альтернативные функции */
    var wtf_vote = null;

    function vote (linkBtn, post_id){
    linkBtn.blur();
    if(matchClass(linkBtn, 'voted')) return false;

    var linkGlobalParent = linkBtn.parentNode.parentNode.parentNode.parentNode;
    var id = linkGlobalParent.id;
    var linkParent = linkBtn.parentNode;
    var rating = getElementsByClassName(linkParent, 'span', 'rating')[0].firstChild; // контейнер с рейтингом
    var value;
    var oppositeBtn;
    var showLink = getElementsByClassName(linkGlobalParent, 'a', 'show_link')[0];

    if (matchClass(linkBtn, 'plus')){
     value = 1;
     oppositeBtn = getElementsByClassName(linkParent, 'a', 'minus')[0];  
    } else {
     value = -1;
     oppositeBtn = getElementsByClassName(linkParent, 'a', 'plus')[0];

     if(typeof noShrink != 'undefined'){
      noShrink(showLink);
     }
     //addClass(linkGlobalParent, 'shrinked');  
    }

    addClass(linkBtn, 'voted'); // отмечаем сделанный выбор
    removeClass(oppositeBtn, 'voted') // снимаем отметку о противоположном голосовании
    addClass(linkGlobalParent, 'loading'); // ставим прелоадер

    var url = "/rate/";
    var data = "type=0&wtf=" + wtf_vote + "&id=" + id + "&value=" + value + "&post_id=" + post_id;
    var params = {r:rating, gp:linkGlobalParent};

    ajaxLoadPost(url, data, voteonLoad, window, params, votePostonError); // отправляем/получаем данные
    return false;
    }

    function voteonLoad(ajaxObj, params){
    var rating = params.r;
    var linkGlobalParent = params.gp;
    var newRating = ajaxObj.responseText;

    rating.innerHTML = newRating;
    removeClass(linkGlobalParent, 'loading'); // убираем прелоадер
    }

    function showChoice(link){
    var linkGlobalParent = link.parentNode.parentNode.parentNode.parentNode;
    addClass(linkGlobalParent, 'inuse');
    }

    function hideChoice(e, obj){
    var objChildren = obj.getElementsByTagName('*');
    var objGlobalParent = obj.parentNode.parentNode;

    // если элемент, на который передвигаем мышь, лежит внутри чойс блока, выходим
    if (e.relatedTarget) {
     var where = e.relatedTarget;
     if (where == obj) return;
     if (where.nodeType == 3) where = where.parentNode;
     for(var i=0; i<objChildren.length; i++){
      if (where == objChildren) {
       return;
      }
     }

     //e.relatedTarget.style.border = "none"; // странно, но это побороло баг в Opere :/
    } else if (e.toElement && obj.contains(e.toElement)) {
     return;
    }

    removeClass(objGlobalParent, 'inuse');
    }

    function votePost(linkBtn){
    linkBtn.blur();
    if(matchClass(linkBtn, 'voted')) return false;

    var linkGlobalParent = linkBtn.parentNode.parentNode.parentNode.parentNode;
    var id = linkGlobalParent.id;
    var linkParent = linkBtn.parentNode;
    var rating = getElementsByClassName(linkParent, 'span', 'rating')[0].firstChild; // контейнер с рейтингом


    if (matchClass(linkBtn, 'plus')){
     value = 1;
     oppositeBtn = getElementsByClassName(linkParent, 'a', 'minus')[0];  
    } else {
     value = -1;
     oppositeBtn = getElementsByClassName(linkParent, 'a', 'plus')[0];
    }

    addClass(linkBtn, 'voted'); // отмечаем сделанный выбор
    removeClass(oppositeBtn, 'voted');
    addClass(linkGlobalParent, 'loading'); // ставим прелоадер

    var url = "/rate/";
    var data = "type=1&wtf=" + wtf_vote + "&id=" + id + "&value=" + value;
    var params = {r:rating, gp:linkGlobalParent};

    ajaxLoadPost(url, data, votePostonLoad, window, params, votePostonError); // отправляем/получаем данные
    return false;
    }

    function votePostonLoad(ajaxObj, params) {
    var rating = params.r;
    var linkGlobalParent = params.gp;
    var newRating = ajaxObj.responseText;

    rating.innerHTML = newRating;
    removeClass(linkGlobalParent, 'loading'); // убираем прелоадер
    removeClass(rating.parentNode, 'js-loading_error');
    }

    function votePostonError(ajaxObj, params) {
    alert(ajaxObj.statusText);
    if (ajaxObj.statusText) {
     var errorText = (ajaxObj.statusText) ? ' ' + ajaxObj.statusText : '';
    } else {
     var errorText = '';
    }
    addClass(params.r.parentNode, 'js-loading_error');
    params.r.title = 'Ошибка в получении данных.' + errorText;
    removeClass(params.gp, 'loading');
    }[/js]
     
  10. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    на скрине я заметил только отличную макось :)
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    пипец за четыре дня можно было две своих написать =)

    ЗЫ: мое мнение такое. голосовалке классы не нужны и вобще это не сложный код строк на двести.
     
  12. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    а я лепру заметил...
     
  13. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    это уже сложный ... несложный - строчек 60-80
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну хз. мне просто всегда казалось, что бывает сложный код строчек на двести. И несложный код строчек на двести. Вот это как раз такой случай =)
     
  15. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    этот код несложный, он нудный - манипуляции с дом деревом, если его переписать на jquery, то будет куда эстетичнее :))
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    тут jQuery - то что доктор прописал. и работы на пол дня с отладкой.

    Зато у нас тут через четыре дня появился хз какой невротебенный код который только что ни делает: и мусор выноси и картошку бреет. Только хз как к нему подступиться :D

    Голосовалка это по сути всего-навсего UPDATE votes=votes+1

    только просто надо обезопаситься от даблвотов и все. но это тоже не великое дело.
     
  17. Vantedur

    Vantedur Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    779
    Симпатии:
    2
    не поверишь но я уже не первый день только и делую что пытаюсь понять, как же её сделать.

    скрипт в принципе есть но как только не пытался реализовать, ну не работает нифига, в райнем случае перекидывает на саму страницу скрипта.

    в общем пхп исправно обрабатывает запросы
    http://vtrigazety.ru/post.php?id=2&action=minuspost
    http://vtrigazety.ru/post.php?id=2&action=pluspost
    http://vtrigazety.ru/post.php?id=2&action=minucomment
    http://vtrigazety.ru/post.php?id=2&action=pluscomment

    но вот остальное просто отвратительно

    [js]<script src="http://vtrigazety.ru/golosovanie/jquery-1.3.2.min.js" type="text/javascript"></script>
    <script type="text/javascript">
    function getData(URL) {
    что сюда писать чтобы все заработало не понятно
    }
    </script>[/js]

    и к тому же я так и не понял как лучше обращаться к скрипту.
    Код (Text):
    1. <div class="blogpostsminus"><a href="http://vtrigazety.ru/post.php?id=1&action=minuspost" onclick="getData(this.href); ">-</a>         
    2. <div class="blogpostsplus" ><a href="http://vtrigazety.ru/post.php?id=1&action=pluspost" onclick="getData(this.href); ">+</a>
     
  18. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    проверять ип и пихать куку при надобности.
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Vantedur
    да ну ладно тебе. я ж вроде давал пример с аякс запросом к пхп файлу и передачей номера поста и количества желаемых к начислению баллов через гет.

    за чем же дело встало?
     
  20. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
  21. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
  22. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    phpdude
    тут как я понял просто +- надо, по 1 разу от каждого юзера
     
  23. Vantedur

    Vantedur Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    779
    Симпатии:
    2
    да мне нужен то скриптик который позволяет плюсануть или минусануть чела который это написал, звезды отвратительная вещь, совершенно не ясно, сколько ставить, а вот плюс или минус можно всегда поставить.

    да все верно но такую историю я пока еще не виду. пока просто + и - и а сверялку на повторы я напишу в post.php
     
  24. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    блин, ну тогда мучайтесь. готовое решение не найдете, а взять напильник и чуток переделать это - дело 20 минут - 2 часов в зависимости от навыков
     
  25. Vantedur

    Vantedur Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    779
    Симпатии:
    2
    =) не одной строки не подписано, смотрю как на древне египетский папирус.