【问题标题】:Drag and drop with 2 drop target使用 2 个放置目标拖放
【发布时间】:2011-01-07 17:00:40
【问题描述】:

我正在寻找一个拖放示例,其中拖动项目有两个不同的区域,必须与两个可放置的区域匹配。

示例:

我希望蓝色拖动项还原,除非它被拖放到其每个红色子项都落在绿色区域的位置。

理想情况下,我想使用 jquery ui(因为我有使用它的经验),但是任何 javascript 库都可以,在此先感谢。

【问题讨论】:

    标签: javascript jquery jquery-ui drag-and-drop jquery-ui-draggable


    【解决方案1】:

    您可以通过组合使用draggable/droppable 选项来完成此操作。给定这样的 HTML:

    <div id="blue" class="valid">
        <div id="red-one" class="red"></div>
        <div id="red-two" class="red"></div>
    </div>
    
    <div id="green-container">
        <div id="green-one" class="green">
        </div>
        <div id="green-two" class="green">
        </div>
    </div>
    

    (省略 CSS,我确实添加了一些规则,请参见下面的小提琴)。

    你可以这样写 JavaScript:

    function isInside(one, other) {
        return one.offset().left >= other.offset().left &&
            one.offset().top >= other.offset().top &&
            one.offset().top + one.height() <= other.offset().top + other.height() &&
            one.offset().left + one.width() <= other.offset().left + other.width();
    }
    
    $("#blue").draggable({
        drag: function(event, ui) {
            var $this = $(this);
            var $reds = $this.children(".red");
            var $greens = $("#green-container").children(".green");
            var firstRed = $reds.first();
            var firstGreen = $greens.first();
            var secondRed = $reds.last();
            var secondGreen = $greens.last();
    
            if (isInside(firstRed, firstGreen) && isInside(secondRed, secondGreen)) {
                $this.addClass('valid');
            }
            else {
                $this.removeClass('valid');
            }       
        },
        revert: 'invalid'
    });
    
    
    $("#green-container").droppable({ accept: ".valid" });
    

    在这里查看:http://jsfiddle.net/andrewwhitaker/g6FKz/

    注意事项:

    • 出于某种原因,我必须首先将“有效”类应用到“蓝色”div,否则目标可放置对象不会接受拖动的元素,即使它是有效的(希望对此有一些意见)。不知道这是怎么回事,可能是 jQueryUI 中的一个错误。不过没什么大不了的。
    • 目标 droppable 不完全是两个绿色元素,它是包含这些元素的白色 div。从示例中应该可以清楚地看到这一点。
    • 每次移动可拖动div 时,都会调用“拖动”事件,该事件确定红色框是否在绿色框内,并将valid 类分配给可拖动div。 droppable 对象只接受valid 可拖动对象。

    希望有帮助!

    【讨论】:

    • +1 非常详细的答案和有效的 JSfiddle 示例,谢谢
    • You can write **JQuery** like this
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多