2010-06-10 93 views
6

基本上有兩個表:公司和訪客。目前可以將訪問者拖到公司。很棒。一旦發生拖放功能,就有兩個$ .post。第一個將拖動保存到數據庫。第二個更新訪問者,因爲信息不斷變化。但問題是,一旦第二.post的$結束,螢火蟲不斷出現以下錯誤:jQuery live draggable/live droppable?

d(this).data("draggable") is null 

其中在jQuery UI的文件時發生。在線56.

約400次左右。所以基本上我正在尋找一種可以拖動和拖放的live()方法。

.draggables在#visitors(an ul)中。可放入的文件在#companies(表格)中。

謝謝!

$(".draggable").draggable({ 
    revert:true 
}); 
$(".droppable").droppable({ 
    drop: function(ev, ui) { 
     $(this).text($(ui.draggable).text()); 

     $.post('planning/save_visit', {user_id: $(ui.draggable).attr('id'), company_id: $(this).attr('id'), period: $('ul.periods li.active').attr('id')}); 

     $.post('planning/' + $('ul.periods li.active').attr('id'), {visitors:true}, function(data){ 
      $('#visitors').html(data); 
     }); 
    }, 
    hoverClass: 'drophover' 
}); 

回答

9

重裝時要更換所有當你做$('#visitors').html(data);可拖動的元素遊客 - 因此那些之前被刪除,並與都不能拖動新的元素替換有拖動。 (我敢肯定你認識到這一點,因爲提.live()的,所以這真的只是這裏完整性)

但是,你知道確切訪問者元素改變,所以不是替代.live()爲什麼不能在更改後立即再次請求可拖動效果。在替換它們之前,可能會更安全地「銷燬」舊的可拖動塊,但我不確定這是否是絕對必要的。

$.post('planning/' + $('ul.periods li.active').attr('id'), {visitors:true}, function(data){  
    $(".draggable").draggable("destroy"); 
    $('#visitors').html(data); 
    $(".draggable").draggable({ revert:true }); 
}); 
+0

非常感謝!這很好! – Henk 2010-06-25 06:17:10

7

1)創建X元素

<div class='dropzone'></div> 
<div class='droppableItem'></div> 

2)添加監聽到所有Dropzones

$(".dropzone").liveDroppable({ hoverClass:'drophover', accept:'.droppableItem' }); 

3)定義自定義功能liveDroppable

(function ($) { 
    $.fn.liveDroppable = function (opts) { 
     this.live("mouseenter", function() { 
     if (!$(this).data("init")) { 
      $(this).data("init", true).droppable(opts); 
     } 
     }); 
     return $(); 
    }; 
}(jQuery)); 

4)每當你以編程方式添加一個新的dropzone,只需調用..

$(".dropzone").mouseenter(); 


結果:通過編程添加或 '活' dropzones將進行投擲的。