【问题标题】:Is it possible to limit the maximum number of children a div can have?是否可以限制 div 可以拥有的最大孩子数?
【发布时间】:2014-01-31 13:36:11
【问题描述】:

所以我想限制div 可以拥有的孩子数量。

这个想法是您有一个selected commands div,您可以在其中拖放任何给定时间可用的命令(基本上是按钮),从另一个称为available commandsdiv,但最多只能拖放到最大值一次四个。

这是小提琴:http://jsfiddle.net/v9Fg8/2/

如何限制div 可以拥有的最大子节点数,以便当达到 4 个时,其中一个子节点会在 drop 事件中被替换。

【问题讨论】:

  • 那么您要删除哪个孩子?有吗?
  • @dfsq: 要么是你决定放在上面的那个,要么是列表中的第一个(这样新的就放在列表的末尾)。

标签: javascript jquery css drag-and-drop


【解决方案1】:

您可以检查容器是否有太多元素,并在这样拖动时保存父元素

function drag(ev) {
    itemParent = ev.target.parentElement;
    //console.log(itemParent);
    ev.dataTransfer.setData("Text", ev.target.id);
};

function drop(ev) {
    ev.preventDefault();
    if (ev.target.childNodes.length == 4) {
        var data = ev.dataTransfer.getData("text");
        console.log(itemParent);
        itemParent.appendChild(document.getElementById(data));
    } else {
        var data = ev.dataTransfer.getData("Text");
        ev.target.appendChild(document.getElementById(data));
    }
};

DEMO

使用 jQuery

function drop(ev) {
    ev.preventDefault();
    if ($('.commands').not(itemParent).children().length == 4) {
        var data = ev.dataTransfer.getData("text");
        console.log(itemParent);
        itemParent.appendChild(document.getElementById(data));
    } else {
        var data = ev.dataTransfer.getData("Text");
        $('.commands').not(itemParent).append($('#' + data));
        //ev.target.appendChild(document.getElementById(data));
    }
};

此代码更好,因此您可以将元素放在元素上,这样您就不会附加到框上。

DEMO

【讨论】:

    【解决方案2】:

    getElementsBtClassName 可以超级简单:

    var dropped = document.getElementById('selected').getElementsByClassName('button');
    

    在 drop 处理程序中,您只需检查 dropped.length:

    function drop(ev) {
        ev.preventDefault();
        var data = ev.dataTransfer.getData("Text");
        ev.target.appendChild(document.getElementById(data));
    
        // Check number of children
        if (dropped.length > 4) {
            ev.target.removeChild(dropped[0]);
        }
    };
    

    演示:http://jsfiddle.net/v9Fg8/6/

    【讨论】:

    • 是的,好像是这样;但是,当已经有 4 个时,我希望从顶部框中删除的元素重新出现在底部框上。我想交换元素,而不是让它们消失。我是否应该将dropped[0] 附加到可用的 div 中,然后再将其从选定的 div 中删除?
    猜你喜欢
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多