当前位置: > > > jQuery - 右键菜单插件contextMenu使用详解3(菜单触发方式、菜单事件)

jQuery - 右键菜单插件contextMenu使用详解3(菜单触发方式、菜单事件)

七、修改菜单打开的触发方式

默认情况下点击右键即可显示菜单,我们可以通过 trigger 配置将其修改成其它的触发方式。

1,左键触发

只要将 trigger 配置成 left,那么只有点击左键才会显示菜单(右键不出现)。
<button class="context-menu-one">按钮1</button>

<script type="text/javascript">
  $(function() {
     //初始化菜单
     $.contextMenu({
         selector: '.context-menu-one',
         trigger: 'left',
         callback: function(key, options) {
             console.log("点击了:" + key);
         },
         items: {
             "edit": {name: "编辑", icon: "edit"},
         }
     });
  });
</script>

2,悬停触发

如果将 trigger 设置成 hover,那么当鼠标移动到触发对象上时就会显示菜单。同时该模式通常会配合如下两个属性使用:
  • delay:悬停多长时间才出现菜单
  • autoHide:鼠标移出触发对象时自动隐藏菜单。
下面代码实现当鼠标移动到按钮上,停留 500 毫秒后自动出现菜单。鼠标从按钮上移开时又自动关闭菜单。
<button class="context-menu-one">按钮1</button>

<script type="text/javascript">
  $(function() {
     //初始化菜单
     $.contextMenu({
         selector: '.context-menu-one',
         trigger: 'hover',
         delay: 500,
         autoHide: true,
         callback: function(key, options) {
             console.log("点击了:" + key);
         },
         items: {
             "edit": {name: "编辑", icon: "edit"},
         }
     });
  });
</script>

3,通过代码触发(自定义触发方式)

如果将 trigger 设置成 none,那么在触发对象上不管左键还是右键点击都不会显示菜单。不过我们可以通过代码手动触发菜单打开。
下面样例我们点击“按钮1”,会在“按钮2”上打开菜单。
<button class="context-menu-one">按钮1</button>
<br><br>
<button class="context-menu-two">按钮2</button>

<script type="text/javascript">
  $(function() {
     //初始化菜单
     $.contextMenu({
         selector: '.context-menu-two',
         callback: function(key, options) {
             console.log("点击了:" + key);
         },
         items: {
             "edit": {name: "编辑", icon: "edit"},
         }
     });

     //按钮1点击
     $('.context-menu-one').on('click', function(e) {
       e.preventDefault();
       //触发按钮2的菜单
       $('.context-menu-two').contextMenu();
   });
  });
</script>

上面手动触发的代码也可以这么写:
$('.context-menu-two').trigger("contextmenu");

当然也可以同时指定菜单出现的位置:
//菜单显示在整个页面的(100,0)位置 
$('.context-menu-two').contextMenu({x: 100, y: 0});

4,异步菜单

下面代码仍然是通过代码打开菜单。只不过鼠标移动到按钮上,停留 1 秒后才自动出现菜单。
<button class="context-menu-one">按钮1</button>

<script type="text/javascript">
  $(function() {
     //初始化菜单
     $.contextMenu({
         selector: '.context-menu-one',
         trigger: 'none',
         callback: function(key, options) {
             console.log("点击了:" + key);
         },
         items: {
             "edit": {name: "编辑", icon: "edit"},
         }
     });

     //鼠标移入事件
    $('.context-menu-one').on('mouseover', function(e){
        var $this = $(this);
        var _offset = $this.offset(),
            position = {
                x: _offset.left + 10,
                y: _offset.top + 10
            }
        setTimeout(function(){ $this.contextMenu(position); }, 1000);
    });
  });
</script>

八、菜单打开/关闭事件

通过 events 节点可以配置菜单的相关事件响应。比如我们想在菜单打开的时候自动做一些事情,或者关闭的时候做一些事情,都可以在这里实现。events 中可以配置如下方法:
  • show:菜单显示前会被调用(如果该方法返回 false,则会阻止菜单的显示)
  • hide:菜单关闭前会被调用(如果该方法返回 false,则会阻止菜单的关闭)

1,效果图

我们右键打开菜单,然后点击一个菜单项,菜单自动关闭。整个流程控制台输出如下:

2,样例代码

<button class="context-menu-one">按钮1</button>

<script type="text/javascript">
  $(function() {
     //初始化菜单
     $.contextMenu({
          selector: '.context-menu-one',
          callback: function(key, options) {
             console.log("点击了:" + key);
          },
          items: {
             "edit": {name: "编辑", icon: "edit"},
          },
          events: {
              show: function(opt) {
                  console.log("菜单打开了。");
              },
              hide: function(opt) {
                  console.log("菜单关闭了。");
              }
          }
      });
  });
</script>
评论0