jQuery przeciągnij i upuść za pomocą wydarzeń NA ŻYWO

Mam aplikację z długą listą, która często się zmienia i potrzebuję, aby elementy tej listy były przeciągalne.

Używałem wtyczki jQuery UI przeciągalny, ale to jest powolne, aby dodać do 400 + elementów listy, i musi być ponownie dodawane za każdym razem nowe elementy listy są dodawane.

Czy ktoś zna wtyczkę podobną do wtyczki jQuery UI drag, która wykorzystuje zdarzenia jQuery 1.3 .live()? To rozwiązałoby oba problemy.

Author: casperOne, 2009-11-26

10 answers

Rozwiązanie Wojtka zadziałało dla mnie idealnie. Zmieniłem go trochę, aby rozszerzyć jQuery...

(function ($) {
   $.fn.liveDraggable = function (opts) {
      this.live("mouseover", function() {
         if (!$(this).data("init")) {
            $(this).data("init", true).draggable(opts);
         }
      });
      return this;
   };
}(jQuery));

Teraz zamiast nazywać to tak:

$(selector).draggable({opts});

...wystarczy użyć:

$(selector).liveDraggable({opts})
 44
Author: stldoug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-31 16:35:22

To jest próbka kodu, który idealnie mi się sprawdził

$('.gadgets-column').live('mouseover',function(){
    $(this).draggable();
});
 21
Author: Jasim Muhammed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-11 07:25:22

Możesz zrobić funkcję wrappera w następujący sposób:

function liveDraggable(selector, options){
  jQuery(selector).live("mouseover",function(){
    if (!jQuery(this).data("init")) {
      jQuery(this).data("init", true);
      jQuery(this).draggable(options);
    }
  });
}

(używam prototype z jQuery - dlatego umieściłem jQuery () zamiast $())

I teraz zamiast $(selektor).draggable ({opts}) użyj liveDraggable (selector, {opts})

 10
Author: wojtekk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-13 21:21:02

Kod Stldouga zadziałał dla mnie, ale nie ma potrzeby sprawdzania elementu .data("init") dla każdego zdarzenia mouseover. Ponadto, lepiej jest użyć "mousemove", jak "mouseover" nie zawsze zostanie uruchomiony, jeśli mysz jest już nad elementem, gdy .działa funkcja live.

(function ($) {
    $.fn.liveDraggable = function (opts) {
        this.live("mousemove", function() {
            $(this).draggable(opts);
        });
    };
}(jQuery));

Oto jak go używasz:

$('.thing:not(.ui-draggable)').liveDraggable();

Sztuczka polega na dodaniu ": not(.ui-draggable) " do twojego selektora. Ponieważ jQuery automatycznie doda klasę "UI-draggable" do twojego elementu, gdy stanie się draggable, the .funkcja live nie będzie już jej celem. Innymi słowy, uruchamia się tylko raz, w przeciwieństwie do innego rozwiązania, które uruchamia się w kółko, gdy przenosisz rzeczy.

/ Align = "left" / odpiąć "mousemove", ale to nie działa .na żywo, niestety.
 7
Author: john,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-17 08:06:41

Połączenie najlepszych odpowiedzi od @ john i @ jasimmk:

Za pomocą .live:

$('li:not(.ui-draggable)').live('mouseover',function(){
    $(this).draggable(); // Only called once per li
});

.live jest jednak przestarzały, lepiej używać .on:

$('ul').on('mouseover', 'li:not(.ui-draggable)', function(){
    $(this).draggable();  // Only called once per li
});

Jak wyjaśnił @ john, {[5] } jest automatycznie dodawana do metod draggable, więc wykluczając tę klasę za pomocą selektora, zapewniasz, że funkcja draggable() będzie wywoływana tylko raz na każdym elemencie. A użycie .on zmniejszy zakres selektora, poprawiając wydajność.

 4
Author: Yarin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-18 20:51:01

Przykład:

Turecki:

<div id="diyalogKutusu">
    <div id="diyalog-baslik">..baslik..</div>
    <div id="icerik">..icerik..</div>
</div>

$(document).on("mouseover", "#diyalogKutusu", function() {
    $(this).draggable({ handle: '#diyalog-baslik' });
});

Angielski:

<div id="dialogBox">
    <div id="dialogBox-title">..title..</div>
    <div id="content">..content..</div>
</div>

$(document).on("mouseover", "#dialogBox", function() {
    $(this).draggable({ handle: '#dialogBox-title' });
});

Uwaga: możesz użyć on() zamiast live() lub delegate. on() ma dobrą wydajność niż inne

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-10 02:13:19
$("html divs to drag").appendTo("#layoutDiv").draggable(options);

JSFiddle

 1
Author: yokesh ganesan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-28 17:04:50

Stare pytanie. Ale threedubmedia ma wtyczkę przeciągnij i upuść z obsługą live (od wersji 1.7 znanej jako po prostu "włączony"). http://threedubmedia.com/code/event/drop Nie używałem go zbyt wiele, więc nie mogę się z tego rozliczać itp. ale wygląda rozsądnie.

 0
Author: Danny C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-15 14:34:45

Inną opcją jest połączenie funkcji obsługi mouseover z klasą wymienną, w ten sposób:

$('.outer-container').on('mouseover', '.my-draggable.drag-unbound', function(e) {
  $(this).draggable().removeClass('drag-unbound');
});

Jest to dość proste i rozwiązuje niektóre problemy, które Inne odpowiedzi mają z ponownym wiązaniem w kółko, gdy mysz.

 0
Author: Micah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-29 20:38:03

A zaktualizowana wersja, która nie używa live , ponieważ jest przestarzała:

function liveDraggable(selector, options) {
    $(document).on('mouseover', selector, function () {
        if (!$(this).data("init")) {
            $(this).data("init", true);
            $(this).draggable(options);
        }
    });
}
 0
Author: ErwanLent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-13 19:04:08