2013-03-11 24 views
19

Kullanıcının bazı öğeleri (div içindeki bir öğe) sayfada diğer divlere sürükleyebileceği bir web sitesi oluşturmaya çalışıyorum. Bu bir masa ya da öylesine, sadece sayfada bir yerlerde divs.jquery ile divlerin konumunu değiştirin bir bırakma sürükleyin

html5 ile & sürükleyin iyi çalışıyor, şimdi mobil cihazlar için bunu yapmaya çalışıyorum. Öğeleri div'e sürükleyebilir, orada bırakabilir ve bu dropzone'ı engelleyebilirim çünkü yalnızca bir öğe dropzone'da olmalıdır. Bu öğeyi başka bir bölüme veya sayfaya başka bir yere de sürükleyebilirim (sadece ilk kez bir div düştükten sonra bırakılabilir alanlar var) eğer bir hata yaptım ama şimdi boş olan div'a başka bir öğe bırakamam. tekrar.

Bu Dropzone'da tekrar bırakmayı nasıl etkinleştirebilirim?

Ve biri diğerine sürüklendiğinde iki div pozisyonunu değiştirmek mümkün mü?

<script type="text/javascript"> 
$ (init); 
function init() { 
    $(".dragzones").draggable({ 
     start: handleDragStart, 
     cursor: 'move', 
     revert: "invalid", 
    }); 
    $(".dropzones").droppable({ 
     drop: handleDropEvent, 
     tolerance: "touch",    
    }); 
} 
function handleDragStart (event, ui) {}  
function handleDropEvent (event, ui) { 
    $(this).droppable('disable'); 
    ui.draggable.position({of: $(this), my: 'left top', at: 'left top'}); 
    ui.draggable.draggable('option', 'revert', "invalid"); 
} 
</script> 
<body> 
<div id="alles"> 
<div class="dropzones" id="zone1"><div class="dragzones" id="drag1">Item 1</div></div> 
<div class="dropzones" id="zone2"><div class="dragzones" id="drag2">Item 2</div></div> 
<div class="dropzones" id="zone3"><div class="dragzones" id="drag3">Item 3</div></div> 
<div class="dropzones" id="zone4"><div class="dragzones" id="drag4">Item 4</div></div> 
    <div class="dropzones" id="zone11"></div> 
    <div class="dropzones" id="zone12"></div> 
    <div class="dropzones" id="zone13"></div> 
    <div class="dropzones" id="zone14"></div> 
</div> 
</body> 

DÜZENLEME: İşte şimdi çalışıyor sayfası: Drag&Drop Task

+0

, html5 olmayan sürükle ve bırak yöntemlerini kullanan çok sayıda örnek vardır; – nycynik

+4

Küçük boyutlu örneği Chrome'da denedim ve öğeleri yine boşaltılan dropzonlara bırakabilir miyim? Neyi kaçırıyorum? –

+2

@ ink.robot nop, işe yaramıyor. Boş bir kutuya bir öğe bırakın. Daha sonra onu orijinal yerine sürükleyin ve boş bir kutuya başka bir öğeyi sürüklemeye çalışın. Yapamazsın. – j0k

cevap

23

İşte çalışan bir örnek.

  • /devre dışı bırakarak artık dönen
  • elemanları diğer elemanların altında artık gizler dönen
  • elemanları onları damla çalışır etkinleştirmek/
  • çalışır (daha iyi görünüyor) onlara
  • daha iyi elemanları konumlandırma kaldırmak mobil aygıtlarda (Android 4.1.1 üzerinde test edilen Chrome ve iPhone)

Burada kullanılan jQuery kodu:Bu örnekte kullanılan bir touchFix eklentisinin orijinal yazarı Oleg Slobodskoi'dur.

1

Sen "Örnek" bağlantısı düzgün çalıştığından benziyor

İşte benim kod alakalı bir parçasıdır. Ama probleminize genel bir çözüm vermek istiyorum.

Temel olarak dropzone durumunu izlersiniz. Kullanıcı öğeyi bıraktığında dropzone'un mevcut olup olmadığını kontrol edersiniz. ayarlanmazsa "geri döndür".

function handleDropEvent (event, ui) { 
    if ($(this).hasClass('occupied')) { 
     ui.draggable.draggable('option', 'revert', true); 
     return false; 
    } 
    $(this).append(ui.draggable); 
    ui.draggable.position({of: $(this), my: 'left top', at: 'left top'}); 
    ui.draggable.css('z-index', 0); 
    setTimeout(validateDropzones, 0); 
} 

Tam çalışma örneği buradadır: http://jsfiddle.net/jaygiri/SRPm2/

teşekkürler.

+0

Bu, mobil cihazlarda çalışmaz (örn. IPad). – Omar

+0

Elbette, olmaz. Birincil sorular şöyle görünüyor: "Bu Dropzone'da tekrar düşmeyi nasıl sağlayabilirim?" Cevaplamak için bir mantık gösterdim - dropzone'un durumuna baktığımız yer. Jq mobil uygulamanıza tam dokunma desteği için bunu yapmanız gerekir: http://stackoverflow.com/a/8826958/647736 –

1

Ancak bu kadar kazanılmış ettik gibidir: Hala sıralamak çalışıyorum birkaç sorunu vardır

$ (init); 
function init() { 
    $(".dragzones").draggable({ 
     start: handleDragStart, 
     cursor: 'move', 
     revert: 'invalid', 
     opacity: .5, 
    }); 
    $(".dropzones").droppable({ 
     drop: handleDropEvent, 
     tolerance: "touch", 
     out: handleDropRemove 
    }); 

    //prevents dragging to filled default droppables on start 
    $(".dropzones").each(function(){ 
    if ($(this).html().length) { 
     $(this).addClass('taken'); 
    } 
    }); 
} 



function handleDragStart (event, ui) {} 
function handleDropRemove(event, ui) { 
     //allows drop after removal 
     $(this).removeClass('taken'); 
}  
function handleDropEvent (event, ui) { 
    if ($(this).hasClass('taken')) { 
     //rejects drop if full 
     ui.draggable.draggable('option', 'revert', true); 
    } else { 
     //accepts drop if enpty 
     ui.draggable.position({of: $(this), my: 'left top', at: 'left top'}); 
     $(this).addClass('taken'); 
    } 
} 

Working Demo Here

. İmleci dolduğunda bir açılan bölgenin en alt noktasına ulaşırsa, çıkış işlevi çağrılır. Bunu nasıl önleyeceğimi anlayamıyorum.

+0

Bu, mobil cihazlarda (ör. IPad) çalışmaz. – Omar

2

REDAKTE: Eğer sürüklenebilir son damla nesneyi kaydedebilirsiniz her başarılı damla On

. Bu nedenle, sürüklenebilir başka bir bırakma nesnesine hareket ettiğinde, önceki bırakma nesnesinin bırakılabilirliğini etkinleştirebilirsiniz.

aşağıya bakın: kaynak koduna dayalı

function handleDropEvent(event, ui) { 
    if (ui.draggable.lastDropObject !== undefined) { 
     ui.draggable.lastDropObject.droppable('enable'); 
    } 
    var dropObject = $(this); 
    dropObject.droppable('disable'); 
    ui.draggable.position({ 
     of: $(this), 
     my: 'left top', 
     at: 'left top' 
    }); 
    ui.draggable.draggable('option', 'revert', "invalid"); 
    ui.draggable.lastDropObject = dropObject; 
} 

Tam çalışma örnek:

deneyin için handleDropEvent değiştirmeye

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 

    <head> 
     <title>Drag & Drop with jQuery</title> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <meta name="title" content="" /> 
     <meta name="keywords" content="" /> 
     <meta name="description" content="" /> 
     <link href="http://www.didaktik.physik.uni-muenchen.de/forschung/elektronenbahnen/Betaversion/Tests/Styletest.css" rel="stylesheet" type="text/css" /> 
     <script type="text/javascript" src="http://www.didaktik.physik.uni-muenchen.de/forschung/elektronenbahnen/Betaversion/Tests/../Alle Seiten/JS/jquery.js"></script> 
     <script type="text/javascript" src="http://www.didaktik.physik.uni-muenchen.de/forschung/elektronenbahnen/Betaversion/Tests/../Alle Seiten/JS/jquery-ui-1.8.23.custom.min.js"></script> 
     <script type="text/javascript" src="http://www.didaktik.physik.uni-muenchen.de/forschung/elektronenbahnen/Betaversion/Tests/../Alle Seiten/JS/jquery.ui.touch-punch.min.js"></script> 
     <script type="text/javascript"> 
      var test; 
      $(init); 

      function init() { 
       $(".dragzones") 
        .draggable({ 
        start: handleDragStart, 
        cursor: 'move', 
        revert: "invalid" 
       }); 
       $(".dropzones") 
        .droppable({ 
        drop: handleDropEvent, 
        tolerance: "touch", 
       }); 
      }; 

      function handleDragStart(event, ui) {} 

      function handleDropEvent(event, ui) { 
       if (ui.draggable.lastDropObject !== undefined) { 
        ui.draggable.lastDropObject.droppable('enable'); 
       } 
       var dropObject = $(this); 
       dropObject.droppable('disable'); 
       ui.draggable.position({ 
        of: $(this), 
        my: 'left top', 
        at: 'left top' 
       }); 
       ui.draggable.draggable('option', 'revert', "invalid"); 
       ui.draggable.lastDropObject = dropObject; 
      } 



      function check() { 
       var i = 1; 
       var richtige = 0; 
       while (i <= 10) { 
        var j = i + 10; 
        if (document.getElementById('zone' + j) 
         .innerHTML.search('drag' + i + '"') == 27) { 
         document.getElementById('zone' + j) 
          .style.border = '2px solid green'; 
         richtige++; 
        } else { 
         document.getElementById('zone' + j) 
          .style.border = '2px solid red'; 
        } 
        i++; 
        alert(document.getElementById(zone + j) 
         .innerHTML); 
       }; 
      } 
     </script> 
    </head> 

    <body> 
     <div id="alles"> 
      <div id="hintergrundbildZuordnungsaufgaben"> 
       <img src="http://www.didaktik.physik.uni-muenchen.de/forschung/elektronenbahnen/Betaversion/Tests/../E-Feld/Bilder/Versuchsaufbau-Elektronenablenkroehre-unbeschriftet.png" width="740"> 
      </div> 
      <div class="dropzones" id="zone1"> 
       <div class="dragzones" id="drag1">Item 1</div> 
      </div> 
      <div class="dropzones" id="zone2"> 
       <div class="dragzones" id="drag2">Item 2</div> 
      </div> 
      <div class="dropzones" id="zone3"> 
       <div class="dragzones" id="drag3">Item 3</div> 
      </div> 
      <div class="dropzones" id="zone4"> 
       <div class="dragzones" id="drag4">Item 4</div> 
      </div> 
      <div class="dropzones" id="zone5"> 
       <div class="dragzones" id="drag5">Item 5</div> 
      </div> 
      <div class="dropzones" id="zone6"> 
       <div class="dragzones" id="drag6">Item 6</div> 
      </div> 
      <div class="dropzones" id="zone7"> 
       <div class="dragzones" id="drag7">Item 7</div> 
      </div> 
      <div class="dropzones" id="zone8"> 
       <div class="dragzones" id="drag8">Item 8</div> 
      </div> 
      <div class="dropzones" id="zone9"> 
       <div class="dragzones" id="drag9">Item 9</div> 
      </div> 
      <div class="dropzones" id="zone10"> 
       <div class="dragzones" id="drag10">Item 10</div> 
      </div> 
      <div class="dropzones" id="zone11"></div> 
      <div class="dropzones" id="zone12"></div> 
      <div class="dropzones" id="zone13"></div> 
      <div class="dropzones" id="zone14"></div> 
      <div class="dropzones" id="zone15"></div> 
      <div class="dropzones" id="zone16"></div> 
      <div class="dropzones" id="zone17"></div> 
      <div class="dropzones" id="zone18"></div> 
      <div class="dropzones" id="zone19"></div> 
      <div class="dropzones" id="zone20"></div> 
      <button id="check" value="Check" onclick="check()">Check</button> 
     </div> 
    </body> 

</html> 

umarım bu yardımcı olur.http://jsfiddle.net/Gajotres/zeXuM/

Ben senin sorunların hepsi burada çözülür düşünüyorum:

İlgili konular