jQuery ajax實現的支援和踩投票功能樣本

來源:互聯網
上載者:User

我們先要準備為整個執行個體運行所需的mysql資料表,執行個體中需要兩個表,votes表用來記錄對應文章或評論的使用者投票數,並且我們預設寫入一條id為1的資料以便示範,votes_ip表用來記錄使用者每次投票的IP,程式根據使用者IP決定投票是否有效。

 代碼如下 複製代碼

CREATE TABLE IF NOT EXISTS `votes` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `likes` int(10) NOT NULL DEFAULT '0',
  `unlikes` int(10) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
 
 
INSERT INTO `votes` (`id`, `likes`, `unlikes`) VALUES
(1, 30, 10);
 
CREATE TABLE IF NOT EXISTS `votes_ip` (
  `id` int(10) NOT NULL,
  `vid` int(10) NOT NULL,
  `ip` varchar(40) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

HTML

在頁面中,有兩個分別表示“頂”和“踩”的按鈕,即#dig_up和#dig_down,按鈕上記錄了投票的票數以及分別所佔的百分比,非常直觀的對比投票結果。

 代碼如下 複製代碼

<div class="digg"> 
    <div id="dig_up" class="digup">
        <span id="num_up"></span>
        <p>很好,很強大!</p>
        <div id="bar_up" class="bar"><span></span><i></i></div>
    </div>
       <div id="dig_down" class="digdown">
        <span id="num_down"></span>
        <p>太差勁了!</p>
        <div id="bar_down" class="bar"><span></span><i></i></div>
    </div>
    <div id="msg"></div>
</div>

CSS

我們必須使用CSS來美化頁面,我們使用一張圖diggs.png來定位不同的按鈕背景,通過設定position來定位各元素之間的位置關係。

 代碼如下 複製代碼

.digg{width:420px; height:120px; margin:80px auto 20px auto; position:relative}
#dig_up,#dig_down{width:200px; height:48px; margin:10px; position:relative; 
border:1px solid #d3d3d3; padding-left:42px; cursor:pointer}
.digup{background:url(diggs.png) no-repeat 4px 2px;}
.digup_on{background:url(diggs.png) no-repeat 4px -49px;}
.digdown{background:url(diggs.png) no-repeat 4px -102px;}
.digdown_on{background:url(diggs.png) no-repeat 4px -154px;}
#num_up,#num_down{position:absolute; right:6px; top:18px; font-size:20px;}
#dig_up p{height:24px; line-height:24px; color:#360}
#dig_down p{height:24px; line-height:24px; color:#f30}
.bar{width:100px; height:12px; line-height:12px; border:1px solid #f0f0f0; 
position:relative; text-align:center}
.bar span{display:block; height:12px; }
.bar i{position:absolute; top:0; left:104px;}
#bar_up span{background:#360}
#bar_down span{background:#f60}
#msg{position:absolute; right:20px; top:40px; font-size:18px; color:#f00}

jQuery

本樣本還依賴於jQuery,因此一定不能忘了在頁面中先載入jquery庫檔案。

首先,jQuery要處理的是滑鼠分別滑向兩個投票按鈕時變換的背景圖片,通過addClass()和removeClass()來實現。

 代碼如下 複製代碼

$(function(){
    //滑鼠滑向和離開投票按鈕時,變換背景樣式
    $("#dig_up").hover(function(){
        $(this).addClass("digup_on");
    },function(){
        $(this).removeClass("digup_on");
    });
    $("#dig_down").hover(function(){
        $(this).addClass("digdown_on");
    },function(){
        $(this).removeClass("digdown_on");
    });
    
    //初始化資料
    getdata("do.php",1);
    
    //單擊“頂”時
    $("#dig_up").click(function(){
        getdata("do.php?action=like",1);
    });
    //單擊“踩”時
    $("#dig_down").click(function(){
        getdata("do.php?action=unlike",1);
    });
});

然後,我們初始化資料,就是頁面載入後,要顯示初始的已經投票的結果,包括各投票數和所佔百分比。我們將擷取資料的操作寫在一個自訂函數getdata()中,通過傳遞不同的請求地址和id參數來完成資料的載入。函數getdata()中,向URL發送一個ajax請求,根據幕後處理的返回結果,如果投票成功則更改頁面中相應的元素內容,包括投票數和所佔百分比。

 代碼如下 複製代碼

function getdata(url,sid){
    $.getJSON(url,{id:sid},function(data){
        if(data.success==1){//投票成功
            $("#num_up").html(data.like);
            //通過控制寬度來顯示百分比進度條效果
            $("#bar_up span").css("width",data.like_percent);
            $("#bar_up i").html(data.like_percent);
            $("#num_down").html(data.unlike);
            $("#bar_down span").css("width",data.unlike_percent);
            $("#bar_down i").html(data.unlike_percent);
        }else{//投票失敗
            $("#msg").html(data.msg).show().css({'opacity':1,'top':'40px'})
            .animate({top:'-50px',opacity:0}, "slow");
        }
    });
}

PHP

資料的擷取都是通過do.php來完成,do.php根據前端頁面傳遞的參數,串連資料庫,根據條件判斷分別進入“頂”、“踩”和初始資料處理模組,以下是do.php模組代碼結構:

connect.php

 代碼如下 複製代碼

<?php
//資料庫配置
$host="localhost";
$db_user="root";//使用者名稱
$db_pass="";//密碼
$db_name="demo";//資料庫名
$timezone="Asia/Shanghai";

$link=mysql_connect($host,$db_user,$db_pass);
mysql_select_db($db_name,$link);
mysql_query("SET names UTF8");

header("Content-Type: text/html; charset=utf-8");
?>


include_once("connect.php");//串連資料庫 
 

 代碼如下 複製代碼
$action = $_GET['action'];
$id = 1;
$ip = get_client_ip();//擷取ip
 
if($action=='like'){//頂
    likes(1,$id,$ip);
}elseif($action=='unlike'){//踩
    likes(0,$id,$ip);
}else{
    echo jsons($id);
}

函數likes()用來處理“頂”和“踩”投票模組,首先是判斷使用者IP是否已經投票過了,如果已經投票則直接返回相應提示,如果使用者IP沒有投票記錄則更新votes表,將對應的投票數加1,然後向votes_ip表中插入該使用者的IP記錄,如果操作成功,則調用jsons()輸出投票後的投票數和所佔百分比等資料,否則輸入操作失敗的提示資訊。

 代碼如下 複製代碼

function likes($type,$id,$ip){
    $ip_sql=mysql_query("select ip from votes_ip where vid='$id' and ip='$ip'");
    $count=mysql_num_rows($ip_sql);
    if($count==0){//還沒有頂過
        if($type==1){//頂
            $sql = "update votes set likes=likes+1 where id=".$id;
        }else{//踩
            $sql = "update votes set unlikes=unlikes+1 where id=".$id;
        }
        mysql_query($sql);
        
        $sql_in = "insert into votes_ip (vid,ip) values ('$id','$ip')";
        mysql_query($sql_in);
        
        if(mysql_insert_id()>0){
            echo jsons($id);
        }else{
            $arr['success'] = 0;
            $arr['msg'] = '操作失敗,請重試';
            echo json_encode($arr);
        }
    }else{
        $msg = $type==1?'您已經頂過了':'您已經踩過了';
        $arr['success'] = 0;
        $arr['msg'] = $msg;
        echo json_encode($arr);
    }
}

 

//擷取使用者真實IP
function get_client_ip() {
 if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
  $ip = getenv("HTTP_CLIENT_IP");
 else
  if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
   $ip = getenv("HTTP_X_FORWARDED_FOR");
  else
   if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
    $ip = getenv("REMOTE_ADDR");
   else
    if (isset ($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
     $ip = $_SERVER['REMOTE_ADDR'];
    else
     $ip = "unknown";
 return ($ip);
}

函數jsons()用來讀取votes表中相應id的投票數,並計算百分比,最後將這些資訊以json格式輸出,供前端頁面使用。

 代碼如下 複製代碼

function jsons($id){
    $query = mysql_query("select * from votes where id=".$id);
    $row = mysql_fetch_array($query);
    $like = $row['likes'];
    $unlike = $row['unlikes'];
    $arr['success']=1;
    $arr['like'] = $like;
    $arr['unlike'] = $unlike;
    $like_percent = round($like/($like+$unlike),3)*100;
    $arr['like_percent'] = $like_percent.'%';
    $arr['unlike_percent'] = (100-$like_percent).'%';
    
    return json_encode($arr);
}

該執行個體可以應用到常見的"贊"、同意和反對評論、投票系統等情境中,運用了Ajax原理實現的前後端互動功能。do.php中還有個函數get_client_ip()用來擷取使用者真實IP,這個函數之前我有文章也發過,已打包在代碼中歡迎下載,在此不貼出來了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.