当前位置:  开发笔记 > 编程语言 > 正文

是否有一个结合了Draggable和Selectable的JQuery插件

如何解决《是否有一个结合了Draggable和Selectable的JQuery插件》经验,为你挑选了2个好方法。

我正在寻求实现一个带有许多项目的Web界面,这些项目可以被选中并拖动以定位它们,无论是成组还是单独.真的像Windows桌面.

我们已经使用了JQuery,因此添加它是首选.JQuery UI Draggables和Selectables分别完成了我们想要的大部分工作,但并没有真正协同工作来提供我们正在寻找的那种效果.

我完全被JQ插件网站所淹没(它的'流行'算法看起来并不是非常有用),并且欢迎指导这里避免大量轮子改造的最佳方法,因为我猜这个比喻有已经完成了.



1> Sinan..:

我也需要做同样的事情,我不想使用eyecon.ro的接口扩展.经过一些研究,我发现使用jQuery UI组合可选择和可拖动.很好地说,但要使代码片段运行,你必须深入研究它.我能够让它发挥作用.我略微改变了,这是我完成它的方法.它需要修改才能在生产级别上使用,但我希望它有所帮助.

// this creates the selected variable
// we are going to store the selected objects in here
var selected = $([]), offset = {top:0, left:0}; 

// initiate the selectable id to be recognized by UI
$("#selectable").selectable({
    filter: 'div',
});

// declare draggable UI and what we are going to be doing on start
$("#selectable div").draggable({
     start: function(ev, ui) {
        selected = $(".ui-selected").each(function() {
           var el = $(this);
            el.data("offset", el.offset());
        });

        if( !$(this).hasClass("ui-selected")) $(this).addClass("ui-selected");
        offset = $(this).offset();
    },
    drag: function(ev, ui) {
        var dt = ui.position.top - offset.top, dl = ui.position.left - offset.left;

        // take all the elements that are selected expect $("this"), which is the element being dragged and loop through each.
        selected.not(this).each(function() {
             // create the variable for we don't need to keep calling $("this")
             // el = current element we are on
             // off = what position was this element at when it was selected, before drag
             var el = $(this), off = el.data("offset");
             el.css({top: off.top + dt, left: off.left + dl});
        });
    }
});

CSS样式能够看到发生了什么:

#selectable {   width: 100%; height: 100%;}
#selectable div {
    background: #ffc;
    line-height: 25px;
    height: 25px;
    width: 200px;
    border: 1px solid #fcc;
    }
#selectable div.ui-selected {
    background: #fcaf3e;
    }
#selectable div.ui-selecting {
    background: #8ae234;
    }

HTML标记:

item 1
item 2
item 3
item 4


这段代码的主要问题是它不会让你控制点击添加其他项目.
这似乎只允许您拖动多个选定的项目,我无法通过单击选择任何可选项目(更不用说单击按住Ctrl键)

2> ericsoco..:

这个问题是相关的,但已经过时了; 答案也是如此. 这是@ idFlood的jsfiddle 的更新版本,适用于jQuery 1.9.1 + jQueryUI 1.10.3:

// store selected elements and the offset of the dragged element
var selected = $([]), offset = {top:0, left:0}; 

$( "#selectable > div" ).draggable({
    start: function (event, ui) {
        var $this = $(this);

        if ($this.hasClass("ui-selected")) {
            // if this is selected, attach current offset
            // of each selected element to that element
            selected = $(".ui-selected").each(function() {
                var el = $(this);
                el.data("offset", el.offset());
            });
        } else {
            // if this is not selected, clear current selection
            selected = $([]);
            $( "#selectable > div" ).removeClass("ui-selected");
        }
        offset = $this.offset();
    },

    drag: function (event, ui) {
        // drag all selected elements simultaneously
        var dt = ui.position.top - offset.top, dl = ui.position.left - offset.left;
        selected.not(this).each(function() {
            var $this = $(this);
            var elOffset = $this.data("offset");
            $this.css({top: elOffset.top + dt, left: elOffset.left + dl});
        });
    }
});

// enable marquee selecting and deselect on outside click...
$( "#selectable" ).selectable();

// ...but manually implement selection to prevent interference from draggable()
$( "#selectable" ).on("click", "div", function (e) {
    if (!e.metaKey && !e.shiftKey) {
        // deselect other elements if meta/shift not held down
        // $( "#dc-modules .dc-module" ).removeClass("ui-selected");
        $( "#selectable > div" ).removeClass("ui-selected");
        $(this).addClass("ui-selected");
    } else {
        if ($(this).hasClass("ui-selected")) {
            $(this).removeClass("ui-selected");
        } else {
            $(this).addClass("ui-selected");
        }
    }
});

我有一个问题,_mouseStop()调用抛出一个错误,所以我删除它; 这意味着ui-selecting状态不再发生在点击,但所有其他功能保持不变.

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有