2009-11-26 83 views
41

我有一個長列表的應用程序經常更改,我需要該列表的項目是可拖動的。jQuery拖放使用實時事件

我一直在使用jQuery UI可拖動插件,但它添加到400多個列表項目的速度很慢,並且每次添加新列表項時都必須重新添加。

有誰知道類似於jQuery UI可插入插件的插件,它使用jQuery 1.3的.live()事件嗎?這將解決這兩個問題。

+0

什麼'如果{jQuery的(這一點)。數據(「init」,true);}'做什麼? – 2011-01-28 12:45:40

回答

44

Wojtek的解決方案對我來說非常合適。彼時我改變它一點點位,使其擴展jQuery的...

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

現在與其說這是這樣的:

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

...只需使用:

$(selector).liveDraggable({opts}) 
+0

這完全打破了我的js。你是否需要特別放置這個地方來擴展JQuery的功能? – Andrew 2011-02-03 09:31:19

+1

您需要在加載jQuery之後並在代碼中使用它之前聲明它。你遇到了什麼錯誤? – stldoug 2011-04-09 23:11:04

+0

非常感謝! – Chris 2011-07-20 15:09:39

10

你可以做包裝函數是這樣的:

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

(我用的樣機使用jQuery - 這就是爲什麼我把jQuery的()而不是$())

而且現在不是$(選擇).draggable({opts})使用liveDraggable(selector,{opts})

+0

這對我來說非常合適,謝謝。 – Wil 2011-04-06 11:31:34

21

這是一個完美爲我工作的代碼示例

$('.gadgets-column').live('mouseover',function(){ 
    $(this).draggable(); 
}); 
+0

對我來說就像一個魅力,謝謝 – Raz 2011-01-27 10:26:22

+0

+1這是最簡單的解決方案。 – enloz 2011-11-10 22:49:39

+3

這是一個簡單的解決方案,但可拖動的執行所有DOM元素與小工具 - 列類*每次*你徘徊其中之一... – 2012-02-23 20:09:59

7

Stldoug的代碼適用於我,但不需要在每個mouseover事件中都檢查元素的.data(「init」)。此外,最好使用「鼠標移動」,作爲「鼠標懸停」並不總是被觸發,如果你的鼠標已經在元素上時

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

的.live功能踢這裏是你如何使用它。

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

訣竅是向選擇器中添加「:not(.ui-draggable)」。由於jQuery在可拖動時會自動將「ui-draggable」類添加到元素中,因此.live函數將不再以它爲目標。換句話說,它只觸發一次,而不像其他解決方案在你移動東西時反覆觸發。

理想情況下,您可以將.unbind「mousemove」,但不幸的是,.live不起作用。

+2

是的,絕對清潔。你怎麼看待在插件函數中移動「ui-draggable」的檢查...像「if(!this.hasClass('ui-draggable')){...}」之類的東西? – stldoug 2011-05-25 01:16:53

+0

不能使用委託。那裏你可以指定一個額外的選擇器。 – Luke 2013-03-06 11:05:15

0

一個古老的問題。但Threedubmedia已經通過實時拖放插件(從v 1.7開始,簡稱「on」)支持。 http://threedubmedia.com/code/event/drop 有沒有使用它,所以我不能說明它的性能等,但看起來合理。

1

一個例子:

土耳其:

<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' }); 
}); 

英語:

<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' }); 
}); 

注意:您可以使用on(),而不是live()delegate。該on()有不錯的表現比其他

4

組合來自@約翰和@jasimmk最佳答案:

使用.live

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

.live是雖然過時,最好使用.on

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

正如@john所解釋的那樣,.ui-draggable會自動添加到可拖動的方法中,所以通過使用選擇器排除該類,您可以確保僅在每個元素上調用一次draggable()。並且使用.on將減少選擇器的範圍,從而提高性能。

1
$("html divs to drag").appendTo("#layoutDiv").draggable(options); 

JSFiddle

0

另一種選擇是一個可移動類混合的鼠標懸停處理程序,就像這樣:

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

這是相當簡單,解決了一些問題,其他的答案有重隨着鼠標懸停一遍又一遍地重新綁定。

0

更新版本,因爲它已被棄用並不住用:(!jQuery的(這一點)。數據( 「初始化」))

function liveDraggable(selector, options) { 
    $(document).on('mouseover', selector, function() { 
     if (!$(this).data("init")) { 
      $(this).data("init", true); 
      $(this).draggable(options); 
     } 
    }); 
}