2013-01-13 22 views
2

我使用的Gridster(http://gridster.net/)能夠拖動li內的內容。在我的li有一個可點擊的div。如何在使用可點擊內容拖動gridster.js小部件後避免點擊事件觸發?

<li data-row="1" data-col="1" data-sizex="2" data-sizey="1"> 
    <a href=' '> 
    <div> 
     content 
    </div> 
    </a> 
</li> 

所以這裏是我所面臨的問題,當我停止並釋放拖動,它會調用在div點擊,我如何才能拖動DIV,但拖停止後不調用點擊&發佈。我不希望它拖動後重定向到另一個頁面(用戶拖動和釋放..因爲拖動時,它需要點擊div,同時,div可以被點擊,所以當停止&釋放拖動時,它將調用點擊)

$(function(){ //DOM Ready 

    var gridster = $(".gridster ul").gridster(
    { 
      widget_margins: [5, 5], 
     widget_base_dimensions: [128, 130], 
     max_size_y: 2, 
     max_size_x: 2, 
     extra_cols: 6 
    } 
    ).data('gridster'); 
    //which i tried but failed 
    gridster.draggable.stop(){ 
     onclick = "false"; 
    } 


// gridster.resize_widget($('.gridster li').eq(0), 1,1); 

}); 

或任何人都可以提供有關如何調用或使用通過gridster提供

draggable.stop功能提示:函數(事件,UI){}回調拖動停止時。

我猜這裏會有一些實現。

初步解決但仍未

var gridster ,draggable ; 
    $(function() { 
     gridster = $(".gridster > ul").find("> li ").click(function(e){ 
      !draggable && alert(1) //ipad2 ,not show alert 
      draggable=0; 
      alert(draggable); 
      }).end() 
      .gridster({widget_margins: [5, 5], 
      widget_base_dimensions: [128, 130],min_cols: 10,min_rows: 20 
      ,serialize_params: function($w, wgd) { 
       return { 
        id: wgd.el[0].id 
        //,col: wgd.col 
        //,row: wgd.row 
       }; 
      } 
      ,draggable: { 
       start:function(event, ui){ 
       // alert("hekio);"); 
        draggable=1; } 
      } 
     }).data('gridster'); 
    //gridster.disable(); 
// gridster.resize_widget($('.gridster li').eq(0), 1,1); 
     if(!dragged){ 
      $("a#blue.grid").click(function(){ 
      window.location = '../yokotachi/category_list.php?category=yokosmart'; 
     }); 
      } 
    // RESET DRAGGED SINCE CLICK EVENT IS FIRED AFTER drag stop 
      dragged = 0 
    }); 
+0

刪除了PHP標籤,因爲這不是PHP相關的。 – PassKit

回答

5

我有一個觸發變量固定它的:var拖= 0 將以下內容添加到您在啓動時將變量設置爲1的gridster初始化:

... 
    draggable: { 
     start: function(event, ui) { 

      dragged = 1; 
      // DO SEOMETHING 
     } 
    } 
.... 

在同一個對象上點擊事件,請檢查:

... 
    if(!dragged){ 
     // DO SOMETHING 
    } 
    // RESET DRAGGED SINCE CLICK EVENT IS FIRED AFTER drag stop 
dragged = 0 
.... 
+0

不知道有什麼問題,請檢查我更新的問題。 – Nich

+0

雖然這通常會起作用,但它非常令人討厭,因此會在應用程序中散佈您的狀態。另外,它將這個特定的關注點分散到所有的點擊處理程序中,而不是在一個地方處理它。最後,還可以在拖動時跳過觸發點擊事件的動作,在下次點擊時不會發生任何事情,因爲狀態會不一致。我發佈了一個更好的解決方案 - 我希望你會接受而不是。謝謝。 –

0

工作沒有挖掘到的JS,加入onclick = "return false;"<a>標籤應該從觸發停止點擊。

對於停止只是拖累,嘗試:

gridster.draggable.stop(){ 
    return false; 
} 

gridster.draggable.stop(e){ 
    e.preventDefault(); 
} 
+0

哇,多數民衆贊成酷:D任何其他解決方案,將js與html分開? jz好奇.. – Nich

+0

等一下,有一些小姐溝通...我希望能夠點擊div,如果它不是在拖動模式,但如果拖動,我不想調用點擊... – Nich

+0

在哪種情況下,這將有助於看到你的JS。 – PassKit

1

你應該嘗試:

var gridster = $(".gridster ul").gridster().data('gridster'); 
gridster.disable(); 
+0

它適用於一些,我可以知道背後的原因? gridster.disable在幹嘛? – Nich

+0

在你的例子中你已經使用了回調,但是有一個直接的方法來禁用可拖動的功能。 查看文檔;) [鏈接](http://gridster.net/#disable_method) – benc

+0

嗯抱歉,有一些錯過溝通,我想要做的是我能夠拖動,但是在我釋放拖動之後,我不想調用點擊(它會引導我到其他頁面) – Nich

0

現在有禁用拖動和Gridster拖放操作的原生支持。

$(".gridster ul").gridster().data('gridster').disable();

+0

OP不想禁用拖放操作,他只是想讓拖放不點擊。 – user1978019

11

的問題是,click事件解僱後傳遞給draggable.stopmouseup事件。

因此,您需要簡單地捕獲該點擊事件並停止它的傳播,然後在完成後取消它,以便人們隨後可以點擊該項目。

你可以做到這一點,像這樣(click for working JSFiddle):

$(document).ready(function() { 
    // Basic event handler to prevent event propagation and clicks 
    var preventClick = function (e) { e.stopPropagation(); e.preventDefault(); }; 
    $(element).gridster({ 
    draggable: { 
     start: function (event, ui) { 
     // Stop event from propagating down the tree on the capture phase 
     ui.$player[0].addEventListener('click', preventClick, true); 
     }, 
     stop: function (event, ui) { 
     var player = ui.$player; 
     setTimeout(function() { 
      player[0].removeEventListener('click', preventClick, true); 
     }); 
     } 
    } 
    }); 
}) 

這比目前公認的答案一個更好的解決方案,因爲它避免了與狀態設置/跨多個組件檢查變量/處理程序。

+0

一個很好的答案;肯定比接受的解決方案更清潔。謝謝! – Nugsson