Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [JS] Drag & Drop bug-less

    Ciao a tutti,

    sto implementando alcune funzioni per effettuare il drag & drop di alcuni div. Il drag & drop in sè e l'iterazione fra draggable div e droppable div non è un problema. I problemi sorgono qual'ora io abbia la pretesa di farlo a prova di bug =).

    Semplificando: mousedown => mousemoving (con flag dragging) => mouseup. Questa la base ok?

    Poniamo caso che mentre trascino il div porto il cursore fuori dalla pagina (per esempio la address bar) e dopo di chè smetto pure di premere il mouse... di fatto ho reso impossibile alla pagina catturare il mouseup e mi troverò con un fastiodoso div incollato al cursore.

    Ed ecco la mia domanda, per ottenere un drag & drop senza "bug" quali sono TUTTI gli eventi che devo gestire? NB. questa domanda non è riferita solo all'esempio specifico sopra, ma un domanda generale per gestire tutte le possibili situazioni che potrebbero compromettere il drag&drop.

    Se avete anche qualche consiglio o "best practice" in materia ben venga.

    Grazie a tutti in anticipo

  2. #2
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    26,133
    Se non usi jqueryUI vedi jqueryui.com/draggable/ se può servirti
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

  3. #3
    Utente di HTML.it L'avatar di carlomarx
    Registrato dal
    Oct 2009
    Messaggi
    1,669
    Se vuoi un modestissimo consiglio, lascia perdere jQuery e fa' le cose semplici: JavaScript è bello così com'è

    codice:
    <!doctype html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Draggable elements</title>
    <script type="text/javascript">
    (function () {
        var
            oActive, nMouseX, nMouseY, nStartX, nStartY,
            bMouseUp = true, nZFocus = /* the highest z-Index present in your page plus 1: */ 100;
     
        document.onmousedown = function (oPssEvt1) {
            var bExit = true, oMsEvent1 = oPssEvt1 || /* IE */ window.event;
            for (var iNode = oMsEvent1.target || /* IE */ oMsEvent1.srcElement; iNode; iNode = iNode.parentNode) {
                if (iNode.className === "draggable") { bExit = false; oActive = iNode; break; }
            }
            if (bExit) { return; }
            bMouseUp = false;
            nStartX = nStartY = 0;
            for (var iOffPar = oActive; iOffPar; iOffPar = iOffPar.offsetParent) {
                nStartX += iOffPar.offsetLeft;
                nStartY += iOffPar.offsetTop;
            }
            nMouseX = oMsEvent1.clientX;
            nMouseY = oMsEvent1.clientY;
            oActive.style.zIndex = nZFocus++;
            return false;
        };
     
        document.onmousemove = function (oPssEvt2) {
            if (bMouseUp) { return; }
            var oMsEvent2 = oPssEvt2 || /* IE */ window.event;
            oActive.style.left = String(nStartX + oMsEvent2.clientX - nMouseX) + "px";
            oActive.style.top = String(nStartY + oMsEvent2.clientY - nMouseY) + "px";
        };
     
        document.onmouseup = function () {
            bMouseUp = true;
        };
    })();
     
    </script>
    <style type="text/css">
    .draggable {
        position: fixed;
        left: 0;
        top: 0;
        width: auto;
        height: auto;
        cursor: move;
    }
      
    #myDiv {
        width: 300px;
        height: 200px;
        left: 200px;
        top: 200px;
        background-color: #00ff00;
    }
    </style>
    </head>
      
    <body>
      
    <div class="draggable" id="myDiv">
    
    Hello world!</p></div>
    <div class="draggable" style="background-color:#aaaaaa;">Another hello world!</div>
      
    </body>
    </html>
    Tutto ciò che fai con jQuery puoi farlo meglio e con la metà del codice in puro JavaScript.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.