[筆記] 關於 jQuery UI 的小插曲

UPDATE,

在 Droppable 中有個屬性叫做 tolerance(簡稱叫阿縮比(疑),他可以設定幾種 Drag&Drop 中 drop 的發生情況。預設是使用 intersect(交叉),當兩個物件交疊 50% 以上,則判定為真。而其他的設定值則為:fittouchpointer

fit 是放置物件要完全放入目標物件,才會觸發。這麼說好了,倘若你買了一組沙發,放不進購物車也是很正常的(喂)。而 touch 則是,不管你買啥鬼東西,只要碰到購物車就會自動放進去(好貼心)。最後 pointer 則是,滑鼠抓取的位置進入目標物件之後才觸發,換句話說就是,要親手放進去才算。

但是!只有 pointer 不會發生漂移情況,fittouch 還是會跟 intersect 一樣!

因為要用到,所以非得來筆記一下才行。在 jQuery UI 中提供了很多很方便的工具,但是,這些工具也不是完全沒有問題。例如,draggable 所說的 bind('drag') 其實沒有什麼效果(其他的也一樣)。至於為什麼?我比較好奇的反而是,為什麼官方要這樣寫,實際測試的時候 沒有 bind 的效果 啊(摔滑鼠)。

另外呢,draggable 在 Firefox 上還是有 視窗內 scrollbar 捲動的位移問題 ,然後這個禍害延燒到 sortable 套件上,只要視窗的 scrollbar 有捲動,你所抓取的物件就會亂飄。雖然說這件事情問萬能的 Google 大神就可以找到解法,不過我還是好心的提供一下解決方法(總之,這就是 UI 對 Firefox 的一個 bug,用清除 margin-top 可以解決)。

// 前略
start: function (event, ui) {
 if( ui.helper !== undefined )
  ui.helper.css('position','absolute').css('margin-top', $(window).scrollTop() );
},
beforeStop: function (event, ui) {
 if( ui.offset !== undefined )
  ui.helper.css('margin-top', 0);
},
// 後略

接著是 droppable,如果你的目標物件有留白,那你的放置物件就會發生錯位問題。講白話一點,就是你想買得東西要 某種角度 才放得進購物車。以 draggable 與 droppable 來說,你的目標物件(droppable)如果有設定留白(margin, padding)偏移,那麼你的放置物件(draggable)就會放不太進去。

因為放置物件要觸發目標物件的 dropover,必須是放置物件中心點(Natural Size)接近目標物件的邊緣,才會發生。問題是,如果目標物件偏移了(通常是為了視覺效果對齊等等),那麼,你的放置物件就會有一個 隱形的偏移量,你的放置物件就得歪著擺才行!!!

所以?我想了一個還不錯骯髒的作法。

$('.item')
    .draggable({ ...中略... })
    .css({
        'margin-top':-15px, // 看你偏移多少就補多少
        'margin-left':-15px // 看你偏移多少就補多少
    });

至於其他的,目前是沒遇到什麼鬼打牆的事件,所以暫時就這樣吧!

Hina Chen
偏執與強迫症的患者,算不上是無可救藥,只是我已經遇上我的良醫了。
Taipei