jQuery实现百度导航li拖放排列效果,即时更新数据库

效果图:

enter image description here

源码下载

index.php中 var autoSave = false; 控制不自动提交。

index.php

<?php
    require 'db.php';
    $query = "SELECT `id`,`order`,`name` FROM `limove` ORDER BY `order`";
    $lis = mysql_query($query,$conn);
    $li_count = mysql_num_rows($lis);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>li Move</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="Content-Language" content="zh-CN" />
    <meta name="Keywords" content="" />
    <meta name="Description" content="" />
    <script type="text/javascript" src="jquery-1.6.2.min.js"></script>
</head>
<body>
<style>
    ul{
        border: 1px solid red;
        height: 150px;
        margin: auto;
        width: 745px;
    }

    li{
        border: 1px solid #AABBCC;
        float: left;
        list-style: none outside none;
        margin: 10px;
        text-align: center;
        width: 120px;
        cursor: move;
    }
    #reset{
        border: 1px solid #AABBCC;
        cursor: pointer;
        float: right;
        height: 20px;
        padding: 2px;
        width: 40px;
    }
    #save{
        border: 1px solid #AABBCC;
        cursor: pointer;
        float: right;
        height: 20px;
        padding: 2px;
        width: 40px;
    }
</style>
<div id="reset">Reset</div>
<div id="save">Save</div>
<ul>
    <?php
        while($li = mysql_fetch_assoc($lis)){
            echo '<li id="'.$li['id'].'" order="'.$li['order'].'">'.$li['name'].'</li>';
        }
    ?>
</ul>
<script type="text/javascript">
    $(document).ready(function(){
        $("ul").css({height:<?php echo (ceil($li_count/5)*40+10) ?>});
        var on_move_li = '';
        var on_move_li_offset = '';
        var on_move_li_index = '';
        var autoSave = false;
        function bindMoveListening(){
            $("li").mousedown(function(){
                on_move_li_offset = $(this).offset();
                on_move_li = $(this);
                on_move_li_index = on_move_li.prevAll().length;
                if(on_move_li_index == 0) var index = 1;
                else var index = on_move_li_index;
                //创建空li
                $("ul").children("li").eq(index-1).after('<li class="dashed" style="border:1px dashed #AABBCC"> </li>')
                on_move_li.addClass('moving').css({left:on_move_li_offset.left,top:on_move_li_offset.top,position:'absolute','z-index':3,border:'1px dashed #AABBCC'});
                $("ul").mousemove(function(e){
                    if($(this).find(".moving").length != 0) {
                        var clientX = e.clientX-60;
                        var clientY = e.clientY-20;
                        on_move_li.css({left:clientX,top:clientY});
                    }
                });
                $("ul").mouseup(function(e){
                    if($(this).find(".moving").length != 0) {
                        var clientX = e.clientX;
                        var clientY = e.clientY;
                        var times = Math.floor((clientY-(on_move_li_offset.top+10))/42);
                        var index = (times*5)+(Math.floor((clientX-(on_move_li_offset.left+50))/120)+on_move_li_index);
                        if(index > <?php echo $li_count ?>) index = <?php echo $li_count ?>;
                        on_move_li.attr('class',null).attr('style',null);
                        $(".dashed").remove();
                        var fromid = on_move_li.attr('id');
                        var fromorder = on_move_li.attr('order');
                        var toorder = $("ul").children("li").eq(index).attr('order');
                        if(index == on_move_li_index && index>0) index = index-1;

                        if(on_move_li_index == 0 && (index == -1||index == 0) ) $("ul").children("li").eq(1).before(on_move_li);
                        else if(index == -1) $("ul").children("li").eq(0).before(on_move_li);
                        else $("ul").children("li").eq(index).after(on_move_li);
                        if(autoSave){
                            $.ajax({
                                url:'limove_process.php',
                                type:'POST',
                                data:{'fromid':fromid,'fromorder':fromorder,'toorder':toorder},
                                success:function(newdata){
                                    $("ul").empty().append(newdata);
                                    bindMoveListening();
                                }
                            });
                        }
                    }
                });
            });
            $("#reset").click(function(){
                $.ajax({
                    url:'limove_reset.php',
                    type:'POST',
                    success:function(newdata){
                        $("ul").empty().append(newdata);
                        bindMoveListening();
                    }
                });
            });
            $("#save").click(function(){
                var data = '';
                var lis = $("ul").children("li");
                $.each(lis,function(i){
                    data += lis.eq(i).attr('id')+',';
                });
                $.ajax({
                    url:'limove_save.php',
                    type:'POST',
                    data:{'data':data.substr(0,data.length-1)},
                    success:function(newdata){
                        $("ul").empty().append(newdata);
                        bindMoveListening();
                    }
                });
            });
        }
        bindMoveListening();
    });
</script>
</body>
</html>

db.php

<?php
static $connect = null;
static $table = '';
if(!isset($connect)) {
    $connect = mysql_connect("localhost","root","");
    if(!$connect) {
        $connect = mysql_connect("localhost","Zjmainstay","");
    }
    if(!$connect) {
        die('Can not connect to database.Fatal error handle by /test/db.php');
    }
    mysql_select_db("test",$connect);
    mysql_query("SET NAMES utf8",$connect);
    $conn = &$connect;
    $db = &$connect;
}

自动提交处理文件 limove_process.php

<?php
    require 'db.php';
    $fromid = $_POST['fromid'];
    $fromorder = $_POST['fromorder'];
    $toorder = $_POST['toorder'];
    $updateorder = $toorder;
    $eqf = '';
    $eqt = '=';
    $symbol = '-';
    $notZero = 'AND `order`>1';
    if($fromorder > $toorder){
        $eqf = '=';
        $eqt = '';
        $symbol = '+';
        $fromorder = $toorder;
        $toorder = $_POST['fromorder'];
        $updateorder = $fromorder;
        $notZero = '';
    }
    mysql_query("START TRANSACTION",$conn);

    $query = "UPDATE `limove` SET `order`=`order`{$symbol}1 WHERE (`order`>{$eqf}{$fromorder} AND `order`<{$eqt}{$toorder} {$notZero})";
    $return1 = mysql_query($query,$conn);
    $query = "UPDATE `limove` SET `order`={$updateorder} WHERE `id`={$fromid}";
    $return2 = mysql_query($query,$conn);

    if($return1&$return2){
        mysql_query("COMMIT",$conn);
    }else {
        mysql_query("ROLLBACK",$conn);
    }
    $query = "SELECT `id`,`order`,`name` FROM `limove` ORDER BY `order`";
    $lis = mysql_query($query,$conn);
    while($li = mysql_fetch_assoc($lis)){
        echo '<li id="'.$li['id'].'" order="'.$li['order'].'">'.$li['name'].'</li>';
    }
    exit(0);

保存按钮处理文件 limove_save.php

<?php
    require 'db.php';
    $data = explode(',',$_POST['data']);
    mysql_query("START TRANSACTION",$conn);

    $return = 1;
    foreach($data as $order => $id){
        $order++;
        $query = "UPDATE `limove` SET `order`={$order} WHERE `id`={$id}";
        $return = mysql_query($query,$conn)&$return;
    }

    if($return){
        mysql_query("COMMIT",$conn);
    }else {
        mysql_query("ROLLBACK",$conn);
    }
    $query = "SELECT `id`,`order`,`name` FROM `limove` ORDER BY `order`";
    $lis = mysql_query($query,$conn);
    while($li = mysql_fetch_assoc($lis)){
        echo '<li id="'.$li['id'].'" order="'.$li['order'].'">'.$li['name'].'</li>';
    }
    exit(0);

重置按钮处理文件 limove_reset.php

<?php
    require 'db.php';
    mysql_query("UPDATE limove SET `order`=`id`");
    $query = "SELECT `id`,`order`,`name` FROM `limove` ORDER BY `order`";
    $lis = mysql_query($query,$conn);
    while($li = mysql_fetch_assoc($lis)){
        echo '<li id="'.$li['id'].'" order="'.$li['order'].'">'.$li['name'].'</li>';
    }
    exit(0);