【问题标题】:jQuery UI Draggable ClonejQuery UI 可拖动克隆
【发布时间】:2018-07-25 07:04:42
【问题描述】:

我有一个可以拖到某些盒子上的项目列表。我在列表项中添加了一个关闭按钮。关闭按钮适用于原始列表项,但不适用于克隆。

$(".sortable").sortable({
    revert: true,
    connectWith: ".draggable"
});
$(".draggable").draggable({
    connectToSortable: ".sortable",
    helper: "clone",
    revert: "true",
    placeholder: "droppable-placeholder"
});
$(".sortable").draggable({
    connectWith: ".draggable"
});

$("ul, li").disableSelection();
$(".close-list-item").click(function(event) {
    event.preventDefault();
    console.log("close list item called");
    $(this).closest('li').remove();
});
ul {
    list-style-type: none;
    margin: 0;
    padding: 0;
    margin-bottom: 0.7em;
    float: left;
}

li {
    margin: 0.5em;
    padding: 0.5em;
    width: 200px;
    border: 1px solid black;
}

.draggable-column {
    height: 100%;
}

.droppable-item {
    border: 1px solid black;
    padding: 0.5em;
    float: left;
    align-content: space-between;
}

.sortable {
    width: 230px;
    height: 10em;
    overflow: auto;
    border: 1px solid black;
    background-color: lightgrey;
}

.droppable-placeholder {
    background-color: yellow;
}

.row {
    display: flex;
    /* equal height of the children*/
}

.col {
    flex: 1;
    /* additionally, equal width */
    padding: 1em;
    border: solid;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" />
<div class="row">
    <div class="col-xs-4 draggable-column">
        <ul class="">
            <li class="draggable ">1 Drag me onto item
                <a href="#" class="close-list-item">
                    <i class="fa fa-window-close"></i>
                </a>
            </li>
            <li class="draggable ">2 Drag me onto item
                <a href="#" class="close-list-item">
                    <i class="fa fa-window-close"></i>
                </a>
            </li>
            <li class="draggable ">3 Drag me onto item
                <a href="#" class="close-list-item">
                    <i class="fa fa-window-close"></i>
                </a>
            </li>
            <li class="draggable ">4 Drag me onto item
                <a href="#" class="close-list-item">
                    <i class="fa fa-window-close"></i>
                </a>
            </li>
            <li class="draggable ">5 Drag me onto item
                <a href="#" class="close-list-item">
                    <i class="fa fa-window-close"></i>
                </a>
            </li>
        </ul>
    </div>

    <div class="col-xs-8 droppable-column">

        <div class="droppable-item">
            <h3>
              Item 1
            </h3>
            <ul class="sortable">

            </ul>
        </div>
        <div class="droppable-item">
            <h3 class=" text-center">
              Item 2
            </h3>
            <ul class="sortable ">

            </ul>
        </div>
        <div class="droppable-item">
            <h3>
              Item 3
            </h3>
            <ul class="sortable">

            </ul>
        </div>
        <div class="droppable-item">
            <h3>
              Item 4
            </h3>
            <ul class="sortable ">

            </ul>
        </div>
        <div class="droppable-item">
            <h3>
              Item 5
            </h3>
            <ul class="sortable ">

            </ul>
        </div>
        <div class="droppable-item">
            <h3>
              Item 6
            </h3>
            <ul class="sortable ">

            </ul>
        </div>
    </div>

</div>

当项目被拖入一个盒子时,会创建一个克隆,克隆的关闭按钮没有按预期关闭。如何让克隆关闭按钮工作?

【问题讨论】:

    标签: jquery-ui events clone


    【解决方案1】:

    由于删除的li 元素(以及其中的关闭按钮)是动态生成的,因此您需要使用以下语法将事件绑定到它。您使用的语法不会将事件绑定到动态创建的元素。 参考:Event binding on dynamically created elements?.

    $(".sortable").sortable({
        revert: true,
        connectWith: ".draggable"
    });
    $(".draggable").draggable({
        connectToSortable: ".sortable",
        helper: "clone",
        revert: "true",
        placeholder: "droppable-placeholder"
    });
    $(".sortable").draggable({
        connectWith: ".draggable"
    });
    
    $("ul, li").disableSelection();
    // See change in the below line
    $(".draggable-column, .droppable-column").on("click", ".close-list-item", function(event) {
        event.preventDefault();
        console.log("close list item called");
        $(this).closest('li').remove();
    });
    ul {
        list-style-type: none;
        margin: 0;
        padding: 0;
        margin-bottom: 0.7em;
        float: left;
    }
    
    li {
        margin: 0.5em;
        padding: 0.5em;
        width: 200px;
        border: 1px solid black;
    }
    
    .draggable-column {
        height: 100%;
    }
    
    .droppable-item {
        border: 1px solid black;
        padding: 0.5em;
        float: left;
        align-content: space-between;
    }
    
    .sortable {
        width: 230px;
        height: 10em;
        overflow: auto;
        border: 1px solid black;
        background-color: lightgrey;
    }
    
    .droppable-placeholder {
        background-color: yellow;
    }
    
    .row {
        display: flex;
        /* equal height of the children*/
    }
    
    .col {
        flex: 1;
        /* additionally, equal width */
        padding: 1em;
        border: solid;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" />
    <div class="row">
        <div class="col-xs-4 draggable-column">
            <ul class="">
                <li class="draggable ">1 Drag me onto item
                    <a href="#" class="close-list-item">
                        <i class="fa fa-window-close"></i>
                    </a>
                </li>
                <li class="draggable ">2 Drag me onto item
                    <a href="#" class="close-list-item">
                        <i class="fa fa-window-close"></i>
                    </a>
                </li>
                <li class="draggable ">3 Drag me onto item
                    <a href="#" class="close-list-item">
                        <i class="fa fa-window-close"></i>
                    </a>
                </li>
                <li class="draggable ">4 Drag me onto item
                    <a href="#" class="close-list-item">
                        <i class="fa fa-window-close"></i>
                    </a>
                </li>
                <li class="draggable ">5 Drag me onto item
                    <a href="#" class="close-list-item">
                        <i class="fa fa-window-close"></i>
                    </a>
                </li>
            </ul>
        </div>
    
        <div class="col-xs-8 droppable-column">
    
            <div class="droppable-item">
                <h3>
                  Item 1
                </h3>
                <ul class="sortable">
    
                </ul>
            </div>
            <div class="droppable-item">
                <h3 class=" text-center">
                  Item 2
                </h3>
                <ul class="sortable ">
    
                </ul>
            </div>
            <div class="droppable-item">
                <h3>
                  Item 3
                </h3>
                <ul class="sortable">
    
                </ul>
            </div>
            <div class="droppable-item">
                <h3>
                  Item 4
                </h3>
                <ul class="sortable ">
    
                </ul>
            </div>
            <div class="droppable-item">
                <h3>
                  Item 5
                </h3>
                <ul class="sortable ">
    
                </ul>
            </div>
            <div class="droppable-item">
                <h3>
                  Item 6
                </h3>
                <ul class="sortable ">
    
                </ul>
            </div>
        </div>
    
    </div>

    【讨论】:

      最近更新 更多