如何避免在拖动具有可点击内容的 gridster.js 小部件后触发点击事件?

2023-12-01

我正在使用 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
    });

问题是click事件被触发after the mouseup传递给的事件draggable.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);
        });
      }
    }
  });
})

这是比当前接受的答案更好的解决方案,因为它避免了跨多个组件/处理程序设置/检查状态的变量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何避免在拖动具有可点击内容的 gridster.js 小部件后触发点击事件? 的相关文章