【问题标题】:Jquery .out() remove droppable class only if all draggables are removedJquery .out() 仅在删除所有可拖动类时才删除可放置类
【发布时间】:2013-08-23 18:32:55
【问题描述】:

我有 4 个可拖动选项和 3 个可放置桶。当我将一个选项拖到一个可放置对象时,可拖动对象会采用存储桶的值。 droppable 还具有“.dropped”类。我需要两件事:

  1. 当可拖动对象从存储桶中移除时,它会丢失值
  2. 从 droppable 中删除所有可拖动对象时,它会丢失 '.dropped' 类

我遇到的问题是 .out(event,ui) 中的 ui 参数是空的(每个 http://api.jqueryui.com/droppable/#event-out),所以我无法从中获取任何信息来更新可拖动值或计算数字droppable 内的可拖动对象的数量。

我考虑过使用计数器,但有 3 种不同的 droppables。有什么建议吗?

HTML:

<div class="row-fluid">
    <div class="drag-option span1 draggable" id="option1">Option 1</div>
    <div class="span2"></div>
    <div class="drag-option span1 draggable" id="option2">Option 2</div>
    <div class="span2"></div>
    <div class="drag-option span1 draggable" id="option3">Option 3</div>
    <div class="span2"></div>
    <div class="drag-option span1 draggable" id="option4">Option 4</div>
</div>
<div class="row-fluid">
    <div class="drop-option droppable span4" value="1">1</div>
    <div class="drop-option droppable span4" value="2">2</div>
    <div class="drop-option droppable span4" value="3">3</div>
</div>

jQuery

// Drag Drop functions
$('.draggable').draggable({containment: "#drag-radio"}).css('cursor','move');
$('.droppable').droppable({
    accept: ".drag-option",
    hoverClass: "drop-hover",
    // Make the drag option inherit the drop value
    drop: function(event,ui){
        ui.draggable.attr('value',$(this).attr('value'));
        $(this).addClass('dropped');

    },
    // Remove draggable value and droppable .dropped class
    out: function(event,ui){
        ui.draggable.attr('value','');
        $(this).removeClass('dropped');
    }
});

【问题讨论】:

    标签: jquery jquery-ui draggable droppable


    【解决方案1】:

    编辑:我可能会误导你一些。问题是您在“div”标签中使用value。 div 标签没有value 属性,这就是它未定义的原因。您需要将这些更改为可以包含值属性的其他内容。

    W3C specs

    这是一个新的工作 JSFiddle,使用 input 标签而不是 div。我将它们设为只读,以便无法输入它们。这可能不是您理想的解决方案,但我想向您展示您正在正确地做事,只是 div 不使用 value 属性。

    http://jsfiddle.net/cFcup/5/

    【讨论】:

    • 实际上,在 drop 函数中, attr 可以很好地设置值。只是在外面你不能抓住 ui.draggable 因为 ui 是空的。 .prop 不适用于 .drop 或 .out
    • 我认为在这种情况下使用 .attr.prop 应该没有区别。它不是 &lt;input&gt; 元素,因此它没有不同于 HTML 属性的动态值。
    • 这可能是真的,但使用文档而不是 ui 似乎可以正常工作。
    • 在它抱怨Cannot call method 'prop' of undefined的调试器下运行它。
    • 你怎么知道它在小提琴中工作?您没有任何与这些类关联的 CSS,因此您无法判断它是否在发生变化。
    【解决方案2】:

    试试这个:\

    HTML:

    <div class="row-fluid">
        <div class="drag-option span1 draggable" id="option1">Option 1</div>
        <div class="span2"></div>
        <div class="drag-option span1 draggable" id="option2">Option 2</div>
        <div class="span2"></div>
        <div class="drag-option span1 draggable" id="option3">Option 3</div>
        <div class="span2"></div>
        <div class="drag-option span1 draggable" id="option4">Option 4</div>
    </div>
    <div class="row-fluid">
        <div class="drop-option droppable span4" data-value="1" readonly>1</div>
        <div class="drop-option droppable span4" data-value="2" readonly>2</div>
        <div class="drop-option droppable span4" data-value="3" readonly>3</div>
    </div>
    

    JS:

    $('.draggable').draggable({
        containment: "#drag-radio"
    }).css('cursor', 'move');
    $('.droppable').droppable({
        accept: ".drag-option",
        hoverClass: "drop-hover",
        // Make the drag option inherit the drop value
        drop: function (event, ui) {
            ui.draggable.data('value', $(this).data('value'));
            alert(ui.draggable.data('value'));
            $(this).addClass('dropped');
        },
        // Remove draggable value and droppable .dropped class
        out: function (event, ui) {
            $(".draggable[data-value=" + $(this).data('value') + "]").data('value', '');
            $(this).removeClass('dropped');
        }
    });
    

    它使用数据集属性而不是非标准值属性。然后它使用与数据集属性匹配的选择器来查找被删除的可拖动对象,因为没有ui 参数来说明它是哪个。

    FIDDLE

    【讨论】:

    • 谢谢,但这仍然不能解决问题。拖放后可拖动的对象仍保留该值。此外,我需要 droppable 来保留 .dropped 类,除非所有可拖动对象都已被删除。换句话说,如果我在一个 droppable 中有 2 个可拖动对象并删除一个,它仍然会有 .dropped 类。基本上,我希望 droppable 保持突出显示,直到所有可拖动对象都被删除。
    • 是的,我明白你的意思了。这似乎是 jQuery UI 可拖放/可拖放 API 中的一个漏洞。当您将某些东西拖出时,似乎没有办法找出被拖出的东西。 draggable 上没有表明它已被删除的事件,并且 droppable 上的 out 事件并没有说明 what 已被删除。也许您应该尝试在 jQuery 论坛中发布问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 2014-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多