WebHU - Programozási kérdések és válaszok

jQuery UI – A húzás nem működik közvetlenül az elejtés után

HTML:

<div class="character_list">
   <div id="draggable" class="character_list_container">
      <div><img  class="1" src="http://ahna.web44.net//img/charas/13.png" /></div>
      <div><img class="2" src="http://ahna.web44.net//img/charas/13.png" /></div>
      <div><img class="3" src="http://ahna.web44.net//img/charas/13.png" /></div>
      <div><img  class="4" src="http://ahna.web44.net//img/charas/13.png" /></div>
      <div><img class="5" src="http://ahna.web44.net//img/charas/13.png" /></div>
      <div><img class="6" src="http://ahna.web44.net//img/charas/13.png" /></div>
   </div>
   <div id="droppable_slots" class="current_team">
      <div id="slot" class="1">1</div>
      <div id="slot" class="2">2</div>
      <div id="slot" class="3">3</div>
   </div>
</div>​

jQuery:

$(function() {
    $("#draggable>div>img").draggable({
        start: function(){
           $(this).css({display: 'none'});
        },
        stop: function(){
           $(this).css({display: 'block'});
        },
        revert: function(dropped) {
           var dropped = dropped && dropped[0].id== "slot";
           if(!dropped) {
              $(this).appendTo($(this).data('originalParent'))
            }
            return !dropped;
        },
        helper: function() { return $(this).clone().appendTo('body').show(); },
        containment: '.sel_screen_left'
}).each(function() {
    $(this).data('originalParent', $(this).parent())
});

$("#droppable_slots>div").droppable({
    drop: function(event, ui) {

        var $this = $(this);
    var content = $.trim($this.html()).length;
    if(content > 0) {
    $this.html("");
    }
        $this.append(ui.draggable);    

        var width = $this.width();
        var height = $this.height();
        var cntrLeft = (width / 2) - (ui.draggable.width() / 2);
        var cntrTop = (height / 2) - (ui.draggable.height() / 2);

        ui.draggable.css({
            left: cntrLeft + "px",
            top: cntrTop + "px"
        });

}
});
});​

Élő példa: http://jsfiddle.net/CVbzg/3/

Amint az a jsfiddle példában is látható, amikor egy képet elejtenek, tökéletesen rögzül, de amikor kimozdul a ledobási zónából, elveszíti a húzhatóságát, ahelyett, hogy visszaállna és hozzáfűzné az eredeti szülőhöz.

Tud valaki segíteni?


  • A megkettőzött azonosítók érvénytelenek btw. 05.01.2013
  • Nem ez a fő problémád, de a slot ID-t 3 elemhez rendelted. Érvénytelen HTML, és az első kivételével az összes elem nem érhető el ezzel az azonosítóval. 05.01.2013
  • hogy kezdjem megjavítani? a visszaállítási kód ezt használja annak ellenőrzésére, hogy érvényes leadási pont-e. 05.01.2013
  • Osztálytá teheti, és ellenőrizheti a hasClass segítségével. Nem tudtam reprodukálni a vesztes húzhatósági problémát, az egyetlen probléma, amit észrevettem, az volt, hogy a revert visszafelé animálta, mivel a visszaállítás közepén az eredeti tárolóhoz csatolta. Ez egyszerűen megoldható lenne, ha eltávolítja ezt a hatást egy revertDuration:0-val. Íme egy hegedű duplikált azonosítók és animáció nélkül: jsfiddle.net/CVbzg/4 05.01.2013
  • Ó, ha egy kicsit kimozdulsz, az elveszíti a vonszolhatóságot. Ha az egyiket a másikba ejti, akkor eltűnnek. 05.01.2013
  • Pontosan ezt akartam, ami az animációt illeti, és köszönöm a szintaktikai javítást! Van valami ötleted, hogy miért nem működik a húzás? 05.01.2013
  • A fontosabb az, hogy a kép elveszti a húzhatóságát 05.01.2013
  • Olyan, mintha a létrehozott klón abbahagyja a húzást, és nem tér vissza a régi helyére, feltételezem, hogy ez a visszaállítási felülírás miatt van, de ez nem lehetséges, mivel a klónt el kell távolítani. 05.01.2013
  • Igen, most adtam be a választ. Nézze meg és próbálja ki a hegedűt. =] 05.01.2013
  • Köszönöm szépen, pont ezt akartam! A képviselő miatt nem szavazhatok. 05.01.2013

Válaszok:


1

Ha egy kicsit mozgatja az elejtőt, miután az már be van helyezve a célpontba, és elveszti a húzhatóságát, az az

$this.html("");

Az ejtéskezelőben a húzható továbbra is az ejtőcélon belül van. Amikor törli a célpont HTML-kódját, akkor eltávolítja azt az elemet is, amelyet újra hozzá kell fűzni. Ez szintaktikai hibát ad vissza, mivel az elem már nincs ott, ami megszakítja a műveletet, ott hagyja a klónt, és a húzható elem törlődik.

Íme egy gyors javítás:

drop: function(event, ui) {

    var $this = $(this);
    if ($this.find('.ui-draggable').length) return; //don't overwrite occupied spot
    $this.empty(); //empty() sounds more semantic than html('') for me, it does the same thing =]
    $this.append(ui.draggable);
    //...
}

Fiddle

Nem teszi lehetővé egy leejtett elem felülírását egy másik elemmel, amely magában foglalja az elemek újbóli eldobását a saját célpontjaikon.


Alternatív megoldás, hogy a már eldobott húzhatót visszahelyezzük a kiindulási helyzetébe, mielőtt hozzáfűznénk az eldobandót:

drop: function(event, ui) {
    var $this = $(this),
        containsDropped = $this.find('.ui-draggable');
    if (containsDropped.length) containsDropped.appendTo(containsDropped.data('originalParent'));
    $this.empty();

Fiddle

Csak arra kell ügyelnie, hogy véletlenül se törölje ki a húzhatót. =]

05.01.2013
  • Miért tűnik el az 1,2,3, ha ráteszed a húzhatót, majd leveszed? 05.01.2013
  • @CodyGuldner Mert az OP a .html('')/.empty()-t hívja a cseppkezelőben lévő drop targeteken. Nem biztos benne, hogy ez volt a szándék vagy sem. 05.01.2013
  • Ezt a kódot szeretném használni, de tudod, hogy van-e olyan módszer, hogy ha ráhúzod a képet valamelyik dobozra, az átirányítson egy másik oldalra? 05.01.2013
  • Persze, a drop: függvényben azonosítsa be, hogy melyik képet ejtette el, vagy melyik tárolóba ejtette (saját kritériumai szerint), és hívja a location = 'http://redict.to/path'; 05.01.2013
  • Nem fogok képeket használni, hanem egy húzható menüt szeretnék készíteni. (elnézést a spamért. Eltiltottam a kérdésektől). Lásd itt: jsfiddle.net/burn123/PCQ62 05.01.2013
  • A @CodyGuldner JSFiddle furcsa hibákat ad, de ellenőrizze, hogy ez közel van-e ahhoz, amit szeretne: jsbin.com /iluvuh/1/edit A data-address értéke a html-ben annak meghatározására, hogy melyik oldalra irányítson át. 05.01.2013
  • folytassuk ezt a beszélgetést a chatben 05.01.2013
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..