最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • jQuery ui中sortable draggable droppable的使用

    正文概述 掘金(前端队长Daotin)   2021-05-27   514

    大家好,我是前端队长Daotin,想要获取更多前端精彩内容,关注我,解锁前端成长新姿势。

    以下正文:

    最近工作中用到了jQuery UI中排序和拖拽功能,花了大概一天的时间,搞清楚了大概的参数配置,以及遇到的一些问题,总结如下。

    sortable

    简单的配置如下:

    $('#subs-box').sortable({
        axis: 'y',
        cursor: 'ns-resize',
        placeholder: "ui-state-highlight", // 排序过程中占位符的class样式设置
        forcePlaceholderSize: true, // 强迫占位符有一个尺寸大小。
        handle:'.sort-at', // 在对象内指定的元素上开始拖动,而不是整个元素都可以拖动
        distance: 10,
        opacity: 0.8,
        containment:'parent', // 元素可以拖动排序的范围
        // helper: 'clone', // 是否clone一个元素进行拖动
        items: '.subject',  // 指定哪些元素可以排序
        stop: function (e, ui) {
            // 排序后元素的顺序(前提每个元素都需要有id属性)
            let newSubArr = $("#subs-box").sortable('toArray'); 
            console.log(newSubArr);
        },
    }).disableSelection(); // 拖动时禁止选中元素
    

    还有一些排序时候的事件和方法,都在参考链接的文档里面。

    draggable

    dragInit() {
        let me = this;
        let selector = '.ptype-'+me.selectedSubType;
    
        // 题目拖动
        $('#subs-box .subject').draggable({
            // appendTo: ".ptype-item.radio", // 当进行拖动时,拖动组件助手应该被添加到的元素。
            // connectToSortable: "#subs-box", // 允许draggable被拖拽到指定的sortables中。
    
            // 拖动时使用的是clone的元素。如果值设置为"clone", 那么该元素将会被复制,并且被复制的元素将被拖动。
            // 之所以不使用 helper: 'clone', 是因为clone的元素没有样式,所以我们需要自定义样式,所以使用了自定义函数。
            helper: function() {
                let helper = $(this).clone();
                helper.css({'width': $(this).width(), 'background': '#fff'}); // 设置clone元素的样式
                return helper;
            },
            handle: ".drag-at", // 指定在特定的元素上触发鼠标按下事件时,才可以拖动。
            cursor: 'move',
            // containment: '.sub-box', // 可以限制draggable只能在指定的元素或区域的边界以内进行拖动。
            revert: 'invalid', // 如果设置为true,当拖动停止时,元素位置将被重置。
            revertDuration: 200,
            distance: 10,
            opacity: 0.8,
            zIndex: 10000,
            refreshPositions: true, // 所有的可拖动位置在每次鼠标移动时都会被计算。(设置该值使得drop的位置更加精确)
            start(event, ui) {
                $(selector).addClass('allow'); // 元素拖拽的时候,设置可放置元素的样式,示意你可以拖拽到那里去
                // 开始拖拽的时候,初始化drop
                me.$nextTick(()=>{
                    me.dropInit();
                });
            },
            stop(event, ui) {
                $(selector).removeClass('allow');
                // 拖拽停止的时候,销毁drop函数。
                me.dropDestory();
            }
        }).disableSelection();
    
    },
    

    dropable

    dropInit() {
        let me = this;
        // 题目放置(设置题目根据不同类型可以放置不同的分页)
        // selector是可变的,也就是每次可拖拽元素可放置的元素是不同的。所以需要每次拖拽后清除之前dropInit对象。
        let selector = '.ptype-'+me.selectedSubType;
    
        $(selector).droppable({
            // accept: selector,
            // accept: function(d) {
            //     if($(this).hasClass('ptype'+me.selectedSubType)){
            //         console.log('d>>>>>>',$(this)[0]);
            //         return true;
            //     }
            // },
            // hoverClass: "drop-hover",
            tolerance: 'pointer', // 指定使用那种模式来测试一个拖动(draggable)元素"经过"一个放置(droppable)对象
            drop: function( event, ui ) {
                // $(this) 填充到的元素
                // ui.draggable.context 填充的元素
                let dragId = $(ui.draggable.context).attr('id');
                let dropId = $(this).attr('id');
    
                // 移动到新的分页
                if(dropId === 'newpage') {
                    me.moveAddPage(dragId);
                } else { // 移动题目到另一个分页
                    if(dropId === me.selectedPage.id) { // 移动到自己的分组,不做处理
    
                    } else {
                        let index = me.selectedPage.subs.indexOf(dragId);
                        if(index > -1) {
                            me.selectedPage.subs.splice(index, 1);
    
                            me.pages.forEach(page=>{
                                if(page.id === dropId) {
                                    page.subs.push(dragId);
                                }
                            });
    
                            me.$openNotice('移动成功');
    
                            // 其他操作...
                        }
                    }
                }
    
                $(this).removeClass('allow-hover');
            },
            over(event, ui) {
                $(this).addClass('allow-hover'); // 当拖拽元素进入可放元素时,可放置元素本身的样式
            },
            out() {
                $(this).removeClass('allow-hover'); // 设置拖拽元素离开可放元素时,清除可放置元素本身的样式
            }
        });
    },
    dropDestory() {
        let selector = '.ptype-'+me.selectedSubType;
        $(selector).droppable("destroy");
    },
    

    参考链接

    • www.html.cn/jquery-ui-a…
    • www.html.cn/jquery-ui-a…
    • www.html.cn/jquery-ui-a…

    (完)


    想看更多精彩内容,关注我获取更多前端技术与个人成长相关内容,我相信有趣的人终会相遇!

    听说点赞的人,一个月后都会运气爆棚,升职加薪哦~

    jQuery ui中sortable draggable droppable的使用


    起源地下载网 » jQuery ui中sortable draggable droppable的使用

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元