jquery droppable接受
任何人都可以告诉我如何在接受条件下编写函数,然后它如何找出接受什么和不接受什么。 例如,我想在接受条件下接受div a
和div b
。 我如何通过函数编写代码?
如果您希望droppable接受一系列元素,您可以执行以下操作:
$(".droppable").droppable({ accept: function(d) { if(d.hasClass("foo")||(d.attr("id")=="bar")){ return true; } } });
此droppable将接受具有类“foo”的元素或具有id“bar”的元素
如果我正确理解您的问题,您希望根据自定义代码有条件地接受已删除的元素。 Aberon的答案是典型的情况:你想只允许某些可拖动的选项根据他们的类被删除,而其他所有选项都会恢复。 如果这回答了你的问题,那很好。
但是,有一种情况是根据比类匹配更复杂的事情有条件地进行恢复动画。 在我自己的项目中,我使用拖放操作将用户添加到组中。 如果已删除的用户已经在组中,我希望用户帮助程序元素还原。 否则,我继续使用AJAX操作来插入它们。 这不能替代后端检查,但它是很好的视觉反馈。
我在其他地方找了一个简单的答案。 注意JQuery维护者:对我来说,最简单的方法是在drop函数中向事件对象添加一些属性,如下所示:
$('.target').droppable({ accept: '.valid' drop: function(event, ui) { if(isDropOK() == true) { // add child here } else { event.revert = true; } } });
可悲的是,这不起作用。 但是,这就是“工作”:将可拖动元素设置为始终还原,然后在满足条件时隐藏帮助器。 您可以通过查找页面上具有“.ui-draggable-dragging”类的唯一元素来获取对帮助程序的引用。 这是一个例子,用你自己的逻辑替换“isDropOK()”:
$('.valid').draggable({ revert: true, helper: 'clone', opacity: 0.5 }); $('.target').droppable({ accept: '.valid' drop: function(event, ui) { if(isDropOK() == true) { $('.ui-draggable-dragging').hide(); // add child here } } });
因此,回顾一下,除非您单步执行drop事件并手动隐藏帮助程序,否则每个元素都将始终还原。 还原动画仍会发生,但您的用户将看不到它。 这是一个小小的黑客,但最终的结果似乎没有用。
根据关于选择器的Jquery文档 。
将接受与选择器匹配的所有可拖动项。 如果指定了一个函数,则将为页面上的每个draggable调用该函数(作为函数的第一个参数传递),以提供自定义filter。 如果应该接受draggable,则该函数应返回true。
从而,
$('.selector').droppable({ accept: '.special' });
在他们的例子中,如果它具有“特殊”类,则只会表现为某些内容被删除。 看起来它可以接受任何Jquery选择器 。
除了Alex回答这是我在这个问题上找到的最佳答案之外,我想补充一点,如果你想检查droppable
和draggable
之间的匹配属性,你可以使用关键字this
来访问accept
函数中的droppable。 这是我最近使用的一个小例子:
accept : function (draggable) { var id_group_drop, id_group_drag; //get the "id_group" stored in a data-attribute of the draggable id_group_drag = $(draggable).attr("data-id-group"); //get the "id_group" stored in a data-attribute of the droppable id_group_drop = $(this).parent().attr("data-id-group"); //compare the id_groups, return true if they match or false otherwise return id_group_drop == id_group_drag; }
所以只有当它的id_group
(记住,只是一个例子)与droppable
的id_group
匹配时才会接受draggable
,否则draggable
将被还原。 我认为这可能是一个非常常见的用例,也许这会对某人有所帮助。
这是我使用的解决方案:
... accept: '#diva,#divb', ...
我已经找到了一个解决方案,该解决方案基于以下条件:无法将draggable置于已被另一个draggable占用的droppable中:
$(".placement").droppable({ accept: function(elm) { // only allow draggables to the placement if there's no other draggable // in the droppable if (!$(this).attr('isbusy')) return true; }, drop: function(event, ui) { $(this).attr('isbusy', 'yeap'); // fill key with something var draggable = $(ui.draggable[0]); // free the draggable's previous droppable if (draggable.attr('droppable')) { $('#' + draggable.attr('droppable')).attr('isbusy', ''); } // save the new draggable's droppable draggable.attr('droppable', $(this).attr('id')); }, });
您可以只使用类似函数,而不是使用类接受,如果符合您的条件,则返回true
$('#mydroppable').droppable( { accept: function() { return true; }, drop: function () { alert("Dropped!"); } });
这是我的解决方案:
var foo = true; $( ".draggable" ).draggable({ revert: function(){if(foo == true){return true;}else{foo = true;}}, }); $("#droppable").droppable({ activeClass: "ui-state-hover", hoverClass: "ui-state-active", drop: function( event, ui ) { if($this == $that){ foo = true; alert("this will revert the draggable back to original position"); }else{ foo = false; alert("this will NOT revert the draggable back to original position"); } } });
- 如何在第一个实例完成后在jquery中复制可拖动/可放置的实例
- 如果缩放,Jquery可放置区域错误
- 如何在不实际拖放的情况下使用jQuery UI Droppable触发Drop事件?
- 如何使jQuery draggable实际上捕捉到同样大小的dropable
- 只将元素放入前面的droppable中
- jquery droppable – >避免多次丢弃同一个对象
- replaceWith和jQuery draggable drop?
- Fullcalendar:draggable对象拒绝fullcalendar为droppable,即使fullcalendar接受drop
- 行数据消失在Datatables上?