<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        基于JQuery的列表拖動排序實現代碼_jquery

        來源:懂視網 責編:小采 時間:2020-11-27 21:14:15
        文檔

        基于JQuery的列表拖動排序實現代碼_jquery

        基于JQuery的列表拖動排序實現代碼_jquery:要求 拖動排序,從名字就不難想像,就是按住一行數據拖到想要的排序位置,保存新的排序隊列。 思路 首先給列表行建立錨點,綁定mousedown和mouseup事件,當鼠標移動到想要插入的位置時,將對象行移動到目標行,然后對其經過的所有行進行排序處理。 思路很簡
        推薦度:
        導讀基于JQuery的列表拖動排序實現代碼_jquery:要求 拖動排序,從名字就不難想像,就是按住一行數據拖到想要的排序位置,保存新的排序隊列。 思路 首先給列表行建立錨點,綁定mousedown和mouseup事件,當鼠標移動到想要插入的位置時,將對象行移動到目標行,然后對其經過的所有行進行排序處理。 思路很簡
        要求

        拖動排序,從名字就不難想像,就是按住一行數據拖到想要的排序位置,保存新的排序隊列。

        思路

        首先給列表行建立錨點,綁定mousedown和mouseup事件,當鼠標移動到想要插入的位置時,將對象行移動到目標行,然后對其經過的所有行進行排序處理。

        思路很簡單,但這里面仍然有幾個問題要注意

        1、移動到什么位置可以視作要插入到目標行的位置。
        2、移動出了頂端和底端時,判斷為第一和最后。
        3、向上移動和向下移動的處理

        解決

        關于事件

        Javascript里鼠標按下和放開事件為onmousedown,onmouseup,JQuery里是mousedown,mouseup,所以,這里使用mousedown和mouseup

        首先,要知道界面有多少行,每一行有多高,因為要判斷鼠標的移動距離

        代碼如下:
        var tbodyHeight=setting.frame.outerHeight(); //setting.frame,父對象
        var lineNum=$("."+setting.dgLine).length; //setting.dgLine,每一行的classname
        var lineHeight=Math.ceil(tbodyHeight/lineNum);

        之所有要取lineNum(行數),除了計算行高外,還有個目的是要使用index(),通過序列索引值來進行移動行到目標位置

        當mousedown事件觸發后,就要開始計算鼠標移動的距離,用于判斷該行到底要移動到什么位置

        代碼如下:
        dgid=$(this).attr(setting.id); //移動行的ID,setting.id,是每一行用來標記ID的名稱
        thisIndex=$("#"+setting.linePre+dgid).index(); //該行的索引,setting.linePre,每一行ID關輟
        thisLineTop=$("#"+setting.linePre+dgid).offset().top; //該行的top值
        topDistance=thisIndex*lineHeight; //該行距離第一行頂端的距離
        downDistance=(lineNum-thisIndex-1)*lineHeight; //該行距離最后一行底端的距離


        dgid主要是用來區分每一行的標識,一般的列表都是程序循環輸出來的,如果沒有這樣一個ID,就分不出哪行是哪行,所以,在HTML上,需要定義一個存放ID的家伙。程序通過attr就是來取這個值,保證每一行都有自己唯一的值。

        thisLineTop,主要是用來和鼠標移動位置進行高度計算,然后根據行高、索引值來判斷是移動到哪一行了。還有個作用是用來確定是否按在了移動錨點上,如果有值,說明是,那后面的mouseup就是成立的,如果沒有值,說明沒有按到錨點上,mouseup不執行任何操作。為什么要這樣做呢?因為不管在頁面的什么位置點鼠標,都會觸發mouseup事件,如果沒有一個判斷,就會不停的執行,那就會產生一些問題。

        topDistance和downDistance,用來判斷鼠標有沒有移出列表的范圍,如果移除了,也就是鼠標移動的距離大于topDistance或downDistance,那就可以判斷為需要移動到第一行或最后一行。

        mousedown事件主要做的,就是這幾件事情,當然,為了效果,還可以增加一些東西

        代碼如下:
        $("#"+setting.linePre+dgid).css('background',setting.lineHighlight); //高亮移動行
        var left=e.pageX+20;
        var top=e.pageY;
        dg_tips(left,top); //創建一個提示層
        $('body').css('cursor','move'); //更改頁面的鼠標手勢
        $("body").disableSelection(); //禁止按下鼠標后移動鼠標時選中頁面元素
        setting.frame.mousemove(function(e){ //讓提示層跟隨鼠標移動
        $("#dgf").css({"left":e.pageX+setting.tipsOffsetLeft+'px',"top":e.pageY+'px'});
        });

        這些的目的,只是讓操作起來更有效果,比如高亮行,就是要讓用戶知道,他們操作的是哪一行。提示層的作用也一樣。

        關于禁止選中,.disableSelection();這是jQuery_UI里帶的方法,如果你有使用jQuery_UI,那可以直接使用它,如果沒有使用,可以這樣做

        代碼如下:
        $('body').each(function() {
        $(this).attr('unselectable', 'on').css({
        '-moz-user-select':'none',
        '-webkit-user-select':'none',
        'user-select':'none'
        }).each(function() {
        this.onselectstart = function() { return false; };
        });
        });

        取消禁止選擇

        代碼如下:
        $('body').each(function() {
        $(this).attr('unselectable', '').css({
        '-moz-user-select':'',
        '-webkit-user-select':'',
        'user-select':''
        });
        });

        考慮到通用性,所以后面的代碼里,不會使用.disableSelection();

        好了,下面是mouseup事件。這里mouseup事件是綁定在body上的,因為mouseup如果只是綁定在錨點上,那當鼠標移出錨點的時候,再松開鼠標,會發現,這個mouseup事件不執行了,因為它會認為是別的對象的mouseup。所以,最保險的方法是用$('body').mouseup。這樣基本上就不會有問題。

        mouseup觸發后,首先就要判斷thisLineTop是不是有值,防止無意義的事件執行。跟著判斷鼠標移動的距離是正還是負,也就是向上移動還是向下移動。

        var moveDistance=e.pageY-thisLineTop;

        根據不同的方向作不同的處理

        代碼如下:
        if(moveDistance<0){
        if(thisIndex!=0){
        moveDistance=Math.abs(moveDistance); //為負數的時候,取一下絕對值
        if(moveDistance>lineHeight/2){ //判斷移動距離是否超過行高的1/2
        if(moveDistance>topDistance){ //如果移動距離大于該行到頂邊的距離
        focusIndex=0;
        }else{
        focusIndex=thisIndex-Math.ceil(moveDistance/lineHeight);
        }
        $("."+setting.dgLine).eq(focusIndex).before($("#"+setting.linePre+dgid));//將該行插入目標位置
        }
        }
        }else{
        if(thisIndex!=lineNum-1){
        if(moveDistance>lineHeight/2+lineHeight){
        if(moveDistance>downDistance){
        focusIndex=lineNum-1;
        }else{
        focusIndex=thisIndex+Math.ceil(moveDistance/lineHeight)-1;
        }
        $("."+setting.dgLine).eq(focusIndex).after($("#"+setting.linePre+dgid));
        }
        }
        }

        之所以判斷移動距離是否超過行高的1/2,是因為如果只移動一小點,可以視作不移動。在計算目標索引值的時候,使用了Math.ceil,最進位,而當移動距離大于0的時候,取了進位還要-1,因為是向下嘛。

        向上移動和向下移動使用了不同的插入方法,before和after,可以試著想一下為什么要使用before和after。

        移動完了,還得把按下鼠標時使用的效果給去除掉

        代碼如下:
        $("#dgf").remove();//移除提示層
        $("#"+setting.linePre+dgid).css('background','');//將高亮的行變為普通
        dgid='';//將移動行的ID值空
        thisLineTop=0;//將移動行的Top值至0
        $('body').css('cursor','default');//更改鼠標手勢為默認

        基本上的情況就是這樣,主要問題就是在處理移動和判斷在哪里插入的問題上。其它的都非常簡單。

        下面給出完整的封裝程序,包括更新數據部分

        代碼如下:
        /*
        *
        * DragList.js
        * @author fuweiyi
        *
        */
        (function($){
        $.fn.DragList=function(setting){
        var _setting = {
        frame : $(this),
        dgLine : 'DLL',
        dgButton : 'DLB',
        id : 'action-id',
        linePre : 'list_',
        lineHighlight : '#ffffcc',
        tipsOpacity : 80,
        tipsOffsetLeft : 20,
        tipsOffsetTop : 0,
        JSONUrl : '',
        JSONData : {},
        maskLoaddingIcon : '',
        maskBackgroundColor : '#999',
        maskOpacity : 30,
        maskColor : '#000',
        maskLoadIcon:'',
        };
        var setting = $.extend(_setting,setting);

        var dgid='',thisIndex,thisLineTop=0,topDistance,downDistance;
        var tbodyHeight=setting.frame.outerHeight();
        var lineNum=$("."+setting.dgLine).length;
        var lineHeight=Math.ceil(tbodyHeight/lineNum);

        $("."+setting.dgButton).mousedown(function(e){
        dgid=$(this).attr(setting.id);
        thisIndex=$("#"+setting.linePre+dgid).index();
        var left=e.pageX+20;
        var top=e.pageY;
        thisLineTop=$("#"+setting.linePre+dgid).offset().top;
        topDistance=thisIndex*lineHeight;
        downDistance=(lineNum-thisIndex-1)*lineHeight;
        $("#"+setting.linePre+dgid).css('background',setting.lineHighlight);

        dg_tips(left,top);
        $('body').css('cursor','move');
        unselect();
        setting.frame.mousemove(function(e){
        $("#dgf").css({"left":e.pageX+setting.tipsOffsetLeft+'px',"top":e.pageY+'px'});
        });
        });

        $('body').mouseup(function(e){
        if(thisLineTop>0){
        var moveDistance=e.pageY-thisLineTop;
        if(moveDistance<0){
        if(thisIndex!=0){
        moveDistance=Math.abs(moveDistance);
        if(moveDistance>lineHeight/2){
        if(moveDistance>topDistance){
        focusIndex=0;
        }else{
        focusIndex=thisIndex-Math.ceil(moveDistance/lineHeight);
        }
        $("."+setting.dgLine).eq(focusIndex).before($("#"+setting.linePre+dgid));
        dg_update(thisIndex,focusIndex);
        }
        }
        }else{
        if(thisIndex!=lineNum-1){
        if(moveDistance>lineHeight/2+lineHeight){
        if(moveDistance>downDistance){
        focusIndex=lineNum-1;
        }else{
        focusIndex=thisIndex+Math.ceil(moveDistance/lineHeight)-1;
        }
        $("."+setting.dgLine).eq(focusIndex).after($("#"+setting.linePre+dgid));
        dg_update(thisIndex,focusIndex);
        }
        }
        }
        $("#dgf").remove();
        $("#"+setting.linePre+dgid).css('background','');
        dgid='';
        thisLineTop=0;
        $('body').css('cursor','default');
        onselect();
        }
        });

        function dg_update(thisIndex,focusIndex){
        dg_mask();
        var start=thisIndex var end=thisIndex var ids='',vals='';
        for(var i=start;i<=end;i++){
        ids+=i==start?$("."+setting.dgLine).eq(i).attr(setting.id):','+$("."+setting.dgLine).eq(i).attr(setting.id);
        vals+=i==start?i:','+i;
        }
        $.getJSON(setting.JSONUrl,{'do':'changeorders','ids':ids,'vals':vals},function(d){
        $("#dg_mask").remove();
        });
        }

        function dg_mask(){
        var W=setting.frame.outerWidth();
        var H=setting.frame.outerHeight();
        var top=setting.frame.offset().top;
        var left=setting.frame.offset().left;
        var mask=" 正在使勁的保存...";
        $('body').append(mask);
        $("#dg_mask").css({"background":"#999","position":'absolute','width':W+'px','height':H+'px','line-height':H+'px','top':top+'px','left':left+'px','filter':'alpha(opacity='+setting.maskOpacity+')','moz-opacity':setting.maskOpacity/100,'opacity':setting.maskOpacity/100,'text-align':'center','color':'#000'});
        }

        function dg_tips(left,top){
        var floatdiv="移動一條記錄";
        $('body').append(floatdiv);
        }

        function unselect(){
        $('body').each(function() {
        $(this).attr('unselectable', 'on').css({
        '-moz-user-select':'none',
        '-webkit-user-select':'none',
        'user-select':'none'
        }).each(function() {
        this.onselectstart = function() { return false; };
        });
        });
        }

        function onselect(){
        $('body').each(function() {
        $(this).attr('unselectable', '').css({
        '-moz-user-select':'',
        '-webkit-user-select':'',
        'user-select':''
        });
        });
        }
        }
        })(jQuery);

        使用

        代碼如下:
















        拖動 名稱
        這里是一行

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        基于JQuery的列表拖動排序實現代碼_jquery

        基于JQuery的列表拖動排序實現代碼_jquery:要求 拖動排序,從名字就不難想像,就是按住一行數據拖到想要的排序位置,保存新的排序隊列。 思路 首先給列表行建立錨點,綁定mousedown和mouseup事件,當鼠標移動到想要插入的位置時,將對象行移動到目標行,然后對其經過的所有行進行排序處理。 思路很簡
        推薦度:
        標簽: 列表 實現 代碼
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 大地资源二在线观看免费高清| 成年大片免费视频播放一级| 无码国产精品一区二区免费16| 亚洲区小说区图片区| 国产精品亚洲色图| 免费A级毛片无码A| 黄页网站在线视频免费| 亚洲不卡AV影片在线播放| 免费国产高清毛不卡片基地 | 亚洲国产综合第一精品小说| 精品女同一区二区三区免费站| 亚洲美女精品视频| 黄色网址免费观看| 亚洲色无码专区一区| 国产男女性潮高清免费网站| 美女被爆羞羞网站在免费观看| 亚洲国产中文v高清在线观看| A国产一区二区免费入口| 亚洲狠狠久久综合一区77777| 黄色永久免费网站| 亚洲AV成人精品日韩一区| 亚洲国产成人a精品不卡在线| 两个人看的www视频免费完整版| 亚洲AV无码精品色午夜在线观看| 99爱视频99爱在线观看免费| 亚洲天堂免费在线| 亚洲Av无码乱码在线观看性色 | 国产天堂亚洲精品| 亚洲人成人无码网www电影首页| 四虎成人精品永久免费AV| 亚洲成年网站在线观看| 亚洲第一区在线观看| 两个人看的www免费高清| 亚洲成a人不卡在线观看| 国产一精品一aⅴ一免费| 黄网站免费在线观看| 国产午夜亚洲精品| 亚洲人成中文字幕在线观看| 成人毛片免费播放| 国产综合免费精品久久久| 亚洲色大成网站www尤物|