使用jquery-ui draggable将可拖动对象分组

grouping draggable objects with jquery-ui draggable

我想使用可拖动/可拖放的jQuery让用户选择一组对象(每个对象的角落都有一个复选框),然后将所有选定的对象作为一组拖动...

我一辈子都想不通怎么做哈哈。

我在想的是,这将导致一个可用的解决方案,在每个可拖动对象上,使用start()事件并以某种方式获取所有其他选定对象并将其添加到选择中

出于性能方面的考虑,我还考虑将拖动的对象看起来像一组对象(它们是图像,所以可能是一堆照片)。 我认为如果一次拖动几十个对象,使用可拖动功能可能会失败,这听起来是个更好的主意吗?


您可以使用可拖动的helper选项来拖动项目组。

例如,如果您的可拖动对象具有复选框,则可以从帮助程序函数中返回选定的项目,如下所示:

1
2
3
4
5
6
7
8
9
10
11
$('#dragSource li').draggable({
  helper: function(){
    var selected = $('#dragSource input:checked').parents('li');
    if (selected.length === 0) {
      selected = $(this);
    }
    var container = $('').attr('id', 'draggingContainer');
    container.append(selected.clone());
    return container;
  }
});

演示版

我已经设置了一个演示文稿,其中包含可拖动的图像和复选框,布局有些流畅。点击底部的"运行代码段"以查看结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
$(function() {

  $('#dragSource li').draggable({
    helper: function() {
      var selected = $('#dragSource input:checked').parents('li');
      if (selected.length === 0) {
        selected = $(this);
      }
      var container = $('').attr('id', 'draggingContainer');
      container.append(selected.clone());
      return container;
    }
  });

  $('#dropTarget').droppable({
    tolerance: 'pointer',
    drop: function(event, ui) {
      $(this).append(ui.helper.children());
    }
  });

  $('#selectAll').click(function() {
    $('#dragSource input').prop('checked', true);
    return false;
  });

  $('#selectNone').click(function() {
    $('#dragSource input').prop('checked', false);
    return false;
  });

  $('#selectInvert').click(function() {
    $('#dragSource input').each(function() {
      var $this = $(this);
      if ($this.prop('checked')) {
        $this.prop('checked', false);
      } else {
        $this.prop('checked', true);
      }
    });
    return false;
  });
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
body {
  font-family: sans-serif;
  overflow-x: hidden;
}
div {
  margin: 5px;
  padding: 0;
}
ul {
  margin: 0;
  padding: 0;
}
li {
  list-style: none;
  padding: 0;
  margin: 0;
  float: left;
  white-space: nowrap;
}
#selectActions span,
#selectActions li {
  float: left;
  padding: 5px;
}
.droppableContainer {
  width: 48%;
  float: left;
  min-height: 200px
}
.droppableContainer li {
  height: 90px;
  width: 110px;
  margin: 2px;
  background-color: white;
  padding-bottom: 4px;
}
.droppableContainer img {
  width: 90px;
  max-height: 90px;
  max-width: 90px;
  width: 90px;
  vertical-align: middle;
}
.droppableContainer input {
  height: 90px;
  vertical-align: middle;
}
#draggingContainer {
  width: 48%;
}
#draggingContainer input {
  visibility: hidden;
}
#dropTarget {
  border: 3px dashed grey;
}
#dropTarget input {
  visibility: hidden;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js">


  <span>Select:</span>
 
<ul>

   
<li>
all
   
</li>

   
<li>
none
   
</li>

   
<li>
invert
   
</li>

 
</ul>



 
   
<ul>

     
<li>

        <img src="http://imgs.xkcd.com/comics/drapes.png" /><input type="checkbox" />
     
</li>

     
<li>

        <img src="http://imgs.xkcd.com/comics/misusing_slang.png" />
        <input type="checkbox" />
     
</li>

     
<li>

        <img src="http://imgs.xkcd.com/comics/donner.jpg" />
        <input type="checkbox" />
     
</li>

     
<li>

        <img src="http://imgs.xkcd.com/comics/a_new_captcha_approach.png" />
        <input type="checkbox" />
     
</li>

     
<li>

        <img src="http://imgs.xkcd.com/comics/bug.png" />
        <input type="checkbox" />
     
</li>

     
<li>

        <img src="http://imgs.xkcd.com/comics/open_source.png" />
        <input type="checkbox" />
     
</li>

     
<li>

        <img src="http://imgs.xkcd.com/comics/tag_combination.png" />
        <input type="checkbox" />
     
</li>

     
<li>

        <img src="http://imgs.xkcd.com/comics/a_simple_plan.jpg" />
        <input type="checkbox" />
     
</li>

     
<li>

        <img src="http://imgs.xkcd.com/comics/it_might_be_cool.png" />
        <input type="checkbox" />
     
</li>

     
<li>

        <img src="http://imgs.xkcd.com/comics/hedgeclipper.jpg" />
        <input type="checkbox" />
     
</li>

     
<li>

        <img src="http://imgs.xkcd.com/comics/pep_talk.png" />
        <input type="checkbox" />
     
</li>

     
<li>

        <img src="http://imgs.xkcd.com/comics/regular_expressions.png" />
        <input type="checkbox" />
     
</li>

     
<li>

        <img src="http://imgs.xkcd.com/comics/pwned.png" />
        <input type="checkbox" />
     
</li>

     
<li>

        <img src="http://imgs.xkcd.com/comics/post_office_showdown.png" />
        <input type="checkbox" />
     
</li>

     
<li>

        <img src="http://imgs.xkcd.com/comics/im_an_idiot.png" />
        <input type="checkbox" />
     
</li>

     
<li>

        <img src="http://imgs.xkcd.com/comics/pointers.png" />
        <input type="checkbox" />
     
</li>

     
<li>

        <img src="http://imgs.xkcd.com/comics/chess_photo.png" />
        <input type="checkbox" />
     
</li>

     
<li>

        <img src="http://imgs.xkcd.com/comics/50_ways.png" />
        <input type="checkbox" />
     
</li>

     
<li>

        <img src="http://imgs.xkcd.com/comics/e_to_the_pi_times_i.png" />
        <input type="checkbox" />
     
</li>

     
<li>

        <img src="http://imgs.xkcd.com/comics/self-reference.jpg" />
        <input type="checkbox" />
     
</li>

     
<li>

        <img src="http://imgs.xkcd.com/comics/starwatching.png" />
        <input type="checkbox" />
     
</li>

   
</ul>


为此,我创建了一个函数,将slave / master元素提供给该函数,从而为master创建了bind()函数(在这种情况下,我仅允许从master拖动,您可以解决我确定),这使得奴隶可以使用标准jQuery css跟随它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    function overlap(slave,master) {
        $('a#groupTheseBlocks').click(function(){
            master.bind('drag', groupBlocks);
            slave.draggable('disable');

            // remember where the slave is in relation to the master
            sLeftRef = (slave.offset().left - master.offset().left);
            sTopRef = (slave.offset().top - master.offset().top);
        });


        function groupBlocks() {
            var left = master.offset().left;
            var top = master.offset().top;

            slave.draggable('disable');
            slave.css('left', (left + sLeftRef) + 'px');
            slave.css('top', (top + sTopRef) + 'px');

        }
    }

我想一旦有了一个可行的例子,我就会在此发布更多信息。就目前而言,这为我工作。缺少的是一种将要分组的元素称为重叠(从属,主)的方法。我正在以一种非常特定的方式进行此操作。我敢肯定,您可以聪明地做到这一点。


这正是我想做的事情。到目前为止,我还没有成功,但是我发现这个人以非常复杂的方式做到了。您可以检查出来,也许您可??以这样做。

这应该是可拖动的功能。我希望他们早日实施


绩效理念:

制作一个不可见的"组对象"。选中项目后,将其设为组对象的子级,如果未选中,则将其重新设置为文档主体,静态父级或其他任何子级。您必须平移对象的位置以确保它们不会跳来跳去,还必须在添加/删除对象时将鼠标事件处理程序附加/分离到组的子级上。

当您在任何子项上发生鼠标按下/上移事件时,您将移动的实际上是该组对象。

这应该使整体更简单。