jquery ui sortables connect lists: copy items

前端 未结 2 1599
悲&欢浪女
悲&欢浪女 2020-12-28 10:19

I have two lists, I want both of them to be sortable and want to be able to copy (drag) items from list1 to list2 and vice versa.

http://jqueryui.com/demos/sortable/

相关标签:
2条回答
  • 2020-12-28 11:04

    I have to say that FFish's answer to this has been incredibly helpful to me.

    I'd make one suggestion; if the lists are being constantly changed the mousedown event seem to be called numerous times because of the re-registering of the event on all the child objects. It might be a bit of a kludge, but I've added an unbind first to ensure the mousedown event is only called once.

        $(".album li").mousedown(mStart);
    

    to

        $(".album li").unbind('mousedown', mStart).mousedown(mStart);
    
    0 讨论(0)
  • 2020-12-28 11:10

    OK here is my app; two lists of images, sortable and you can copy over from the connected list.
    If an item already exists in the target it's disabled.
    Hopefully useful to someone...

    JSFiffle here: http://jsfiddle.net/tunafish/VBG5V/

    CSS:

    .page { width: 410px; padding: 20px; margin: 0 auto; background: darkgray; }
    .album { list-style: none; overflow: hidden; 
        width: 410px; margin: 0; padding: 0; padding-top: 5px;
        background: gray; 
    } 
    .listing { margin-bottom: 10px; }
    .album li { float: left; outline: none;
        width: 120px; height: 80px; margin: 0 0 5px 5px; padding: 5px;
        background: #222222;
     }
    li.placeholder { background: lightgray; }
    

    JS:

    $("ul, li").disableSelection();
    
    $(".album, .favorites").sortable({
        connectWith: ".album, .favorites",
        placeholder: "placeholder", 
        forcePlaceholderSize: true, 
        revert: 300,
        helper: "clone",
        stop: uiStop,
        receive: uiReceive,
        over: uiOver
    });
    
    
    $(".album li").mousedown(mStart);
    
    var iSender, iTarget, iIndex, iId, iSrc, iCopy;
    var overCount = 0;
    
    /* everything starts here */
    function mStart() {
        // remove any remaining .copy classes
        $(iSender + " li").removeClass("copy");
    
        // set vars
        if ($(this).parent().hasClass("listing")) { iSender = ".listing"; iTarget = ".favorites"; } 
        else { iSender = ".favorites"; iTarget = ".listing"; }
        iIndex  = $(this).index();
        iId     = $(this).attr("id");
        iSrc    = $(this).find("img").attr("src");  
        iCopy   = $(iTarget + " li img[src*='" + iSrc + "']").length > 0; // boolean, true if there is allready a copy in the target list   
    
        // disable target if item is allready in there  
        if (iCopy) { $(iTarget).css("opacity","0.5").sortable("disable"); }
    }
    
    /* when sorting has stopped */
    function uiStop(event, ui) {
        // enable target
        $(iTarget).css("opacity","1.0").sortable("enable");
    
        // reset item vars
        iSender = iTarget = iIndex = iId = iSrc = iCopy = undefined;
        overCount = 0;
    
        // reinit mousedown, live() did not work to disable
        $(".album li").mousedown(mStart);
    }
    
    /* rolling over the receiver - over, out, over etc. */
    function uiOver(event, ui) {
        // only if item in not allready in the target
        if (!iCopy) {                   
            // counter for over/out (numbers even/uneven)
            overCount++;
            // if even [over], clone to original index in sender, show and fadein (sortables hides it)
            if (overCount%2) {
                if (iIndex == 0) { ui.item.clone().addClass("copy").attr("id", iId).prependTo(iSender).fadeIn("slow"); } 
                else { ui.item.clone().addClass("copy").attr("id", iId).insertAfter(iSender + " li:eq(" + iIndex + ")").fadeIn("slow"); }
            } 
            // else uneven [out], remove copies
            else { $(iSender + " li.copy").remove(); }
        } 
        // else whoooooo
    }
    
    /* list transfers, fix ID's here */
    function uiReceive(event, ui) {
        (iTarget == ".favorites") ? liPrefix = "fli-" : liPrefix = "lli-";  
        // set ID with index for each matched element
        $(iTarget + " li").each(function(index) {
            $(this).attr("id", liPrefix + (index + 1)); // id's start from 1
        });
    }
    

    HTML:

    <div class="page">
    
        <div class="container">
            <h2>Photo Album</h2>
            <ul class="listing album">
                <li id="li-1"><img src="tn/001.jpg" /></li>
                <li id="li-2"><img src="tn/002.jpg" /></li>
                <li id="li-3"><img src="tn/003.jpg" /></li>
                <li id="li-4"><img src="tn/004.jpg" /></li>
                <li id="li-5"><img src="tn/005.jpg" /></li>
            </ul>
        </div>
    
        <div style="clear:both;"></div>
    
        <div class="container">
            <h2>Favorites</h2>
            <ul class="favorites album">
                <li id="fli-1"><img src="tn/001.jpg" /></li>
                <li id="fli-2"><img src="tn/002.jpg" /></li>
                <li id="fli-3"><img src="tn/010.jpg" /></li>
            </ul>
        </div>
    
    </div>
    
    0 讨论(0)
提交回复
热议问题