在jquery.event.drag中触发dragstart之后更新可用的放置目标

Blo*_*sie 18 javascript jquery drag-and-drop

概述:

我有一个使用jquery.event.dragjquery.event.drop的页面.我需要能够拖放到不断添加到dom中的元素,即使在拖动开始之后也是如此.


问题:

dragstart事件触发时,它会检查可用的放置目标并将它们添加到拖动对象.

我遇到的问题是我在dragstart事件触发后动态添加drop目标,因此用户无法删除这些动态添加的drop目标.


例:

http://jsfiddle.net/blowsie/36AJq/


题:

如何更新拖动以允许在拖动开始后删除已添加到dom的元素?

A. *_*lff 5

您可以使用此代码段.

重要的功能是: $.event.special.drop.locate();

测试chrome/safari/firefox/ie9似乎工作.

看看演示


UPDATE

对于重叠事件,请查看以下代码是否有效.我在匿名函数中设置它只是为了避免任何全局变量.想法是使用event的currentTarget属性来检查相同的元素是否触发相同的事件.我在newdrop元素上设置了一个id,只是为了测试.

看到更新的演示

(function () {
    var $body = $("body"),
        newdrops = [],
        currentTarget = {},
        ondragstart = function () {

            $(this).css('opacity', .75);
        }, ondrag = function (ev, dd) {
            $(this).css({
                top: dd.offsetY,
                left: dd.offsetX
            });
        }, ondragend = function () {

            $(this).css('opacity', '');
            for (var i = 0, z = newdrops.length; i < z; i++)
            $(newdrops[i]).off('dropstart drop dropend').removeClass('tempdrop');
            newdrops = [];
        }, ondropstart = function (e) {
            if (currentTarget.dropstart === e.currentTarget) return;
            currentTarget.dropstart = e.currentTarget;
            currentTarget.dropend = null;
            console.log('start::' + e.currentTarget.id)
            $(this).addClass("active");
        }, ondrop = function () {
            $(this).toggleClass("dropped");
        }, ondropend = function (e) {
            if (currentTarget.dropend === e.currentTarget) return;
            currentTarget.dropend = e.currentTarget;
            currentTarget.dropstart = null;
            console.log('end::' + e.currentTarget.id)
            $(this).removeClass("active");
        };

    $body.on("dragstart", ".drag", ondragstart)
        .on("drag", ".drag", ondrag)
        .on("dragend", ".drag", ondragend)
        .on("dropstart", ".drop", ondropstart)
        .on("drop", ".drop", ondrop)
        .on("dropend", ".drop", ondropend);



    var cnt = 0;
    setInterval(function () {
        var dataDroppables = $body.data('dragdata')['interactions'] ? $body.data('dragdata')['interactions'][0]['droppable'] : [];

        var $newDrop = $('<div class="drop tempdrop" id="' + cnt + '">Drop</div>');
        cnt++;
        $("#dropWrap").append($newDrop);
        var offset = $newDrop.offset();
        var dropdata = {
            active: [],
            anyactive: 0,
            elem: $newDrop[0],
            index: $('.drop').length,
            location: {
                bottom: offset.top + $newDrop.height(),
                elem: $newDrop[0],
                height: $newDrop.height(),
                left: offset.left,
                right: offset.left + $newDrop.width,
                top: offset.top,
                width: $newDrop.width
            },
            related: 0,
            winner: 0
        };
        $newDrop.data('dropdata', dropdata);
        dataDroppables.push($newDrop[0]);
        $newDrop.on("dropstart", ondropstart)
            .on("drop", ondrop)
            .on("dropend", ondropend);
        $.event.special.drop.locate($newDrop[0], dropdata.index);
        newdrops.push($newDrop[0]);
    }, 1000);
})();
Run Code Online (Sandbox Code Playgroud)