2

私は Gridster ( http://gridster.net/ ) を使用しており、コンテンツを 内にドラッグできますli。私のli中にはクリック可能なdivがあります。

<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: function(event, 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
    });
4

6 に答える 6

13

問題は、 に渡されたイベントのclickイベントが発生することです。mouseupdraggable.stop

したがって、そのクリック イベントを簡単にトラップして伝播を停止し、完了したらトラップを解除して、ユーザーがアイテムをクリックできるようにする必要があります。

これは次のように行うことができます (クリックして 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);
        });
      }
    }
  });
})

これは、現在受け入れられている回答よりもはるかに優れたソリューションです。これは、複数のコンポーネント/ハンドラーにわたって状態が設定/チェックされる変数を回避できるためです。

于 2014-08-21T16:54:09.517 に答える
5

トリガー変数でそれを修正しました: var dragged = 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
....
于 2013-01-18T08:05:35.160 に答える
1

あなたはそれを試す必要があります:

var gridster = $(".gridster ul").gridster().data('gridster');
gridster.disable();
于 2013-01-13T14:52:31.823 に答える
0

Gridster でのドラッグ アンド ドロップ操作を無効にするネイティブ サポートが追加されました。

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

于 2013-07-11T19:05:44.703 に答える
0

JS を掘り下げることなく、タグに追加onclick = "return false;"すると<a>、クリックがトリガーされなくなります。

ドラッグだけを停止するには、次を試してください。

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

また

gridster.draggable.stop(e){
   e.preventDefault();
}
于 2013-01-13T05:49:20.867 に答える
0

Angular を使用して Gridster2 のソリューションを探しているこのスレッドに出くわした人のために、以下は Alastair Maw の回答に基づいていますが、initCallBack オプションを使用して Gridster2 で機能するように更新されています。

ngOnInit() {
    const preventClick = (e) => { e.stopPropagation(); e.preventDefault(); };
    this.gridsterOptions = {
      initCallback: (gridster: GridsterComponentInterface) => {
        gridster.options = {
          draggable: {
            delayStart: 100,
            start: (event, ui) => {
              // Stop event from propagating down the tree on the capture phase
              setTimeout(() => {
                ui.el.addEventListener('click', preventClick, true);
              }, 100);
            },
            stop: (event, ui) => {
              setTimeout(() => {
                ui.el.removeEventListener('click', preventClick, true);
              });
            }
          }
        }
      }
    };
}
于 2021-08-18T00:42:24.693 に答える