javascript - 如何在上下文菜单中触发全局功能

标签 javascript jquery function events contextmenu

我有一个table它由文档列表(来自 JSON 文件)填充,单击复选框会将该特定文档添加到收藏夹列表中。

我创建了一个包含三个选项的自定义上下文菜单。 我试图做到这一点,以便有人点击其中一个选项(“添加到收藏夹”),它的作用与我上面描述的相同。简单地说,我不知道如何触发该函数,因为它超出了原始收藏夹函数的范围。我尝试将收藏夹功能分组到其自己的函数中并引用它,但我的语法有些问题(或者我偏离了方向,没有朝着正确的方向前进?)。有什么想法吗?

JS 添加收藏夹功能:

function faveFunc(evt) {
  const $table = $("#km-table-id")

  let table = $table.DataTable();
  let favesArr = [];

      let data = table.row(this.parentNode).data(),
      checked = $(this).is(":checked"),
      dataIndex = favesArr.indexOf(data);
      if (checked) {
        if (dataIndex === -1) {
          favesArr.push(data); // add item
        }
      } else {
        if (dataIndex > -1) {
          favesArr.splice(dataIndex, 1); // remove item
        }
      }  


      // - Appending selected faves to div - //

      ($(".populate-faves").empty()); // removes all previous entries
      for (var i = 0; i < favesArr.length; i++) {
        $(".populate-faves").append(JSON.stringify(favesArr[i].Titles) + '<br/><br/>').addClass("faved-doc");  
      }


    }; // ------------ faveFunc

    $("#km-table-id.checkbox-class, [data-action='add']").on("click", faveFunc)


  console.log(faveFunc)

上下文菜单:

  ///// Show menu /////
  $(document).on("contextmenu", function(evt) {
      evt.preventDefault();
    $(".custom-menu")
    .show()
    .css({ top: evt.pageY, left: evt.pageX });

    ///// Close menu /////
    $(document).on("mousedown", function(evt) {
      if (!$(evt.target).parents(".custom-menu").length > 0) {
        $(".custom-menu").hide(100);
      }
    })
  });

HTML 片段:

<ul class="custom-menu">
  <li data-action="open">Open Document</li>
  <li data-action="add" oncontextmenu="()">Set As Favorite</li>
  <li data-action="email"><a href="mailto:?subject=subject">Email Document</a></li>
</ul>

最佳答案

faveFunc 只设置一个监听器

让我们看看faveFunc:

function faveFunc() {
    let addFave = $table.on("click", ".checkbox-class", function(e) {
        // ...
    })
}

当您调用faveFunc时,它所做的只是设置一个“点击”监听器。它实际上并不执行点击监听器。

文档不是你想象的那样

关于$(document).on("contextmenu")$(document).on("click"):document是网页上的全局变量,引用网页本身。它不涉及网页的任何内容。当您单击或右键单击页面上的任意位置时,这些事件将会触发。

设置事件监听器的方式保持一致。

您目前正在通过三种不同的方式执行此操作:

  • $(选择器).on("点击")
  • $(选择器).click()
  • $(选择器).on("点击", 过滤器)

选择一个。就我个人而言,我更喜欢 $(selector).on("click")

将事件处理程序变成命名函数

而不是这个:

function faveFunc() {
    let addFave = $table.on("click", ".checkbox-class", function(e) {
        // ...
    })
}

...我会这样做:

function faveFunc(e){
    // ...
}
$("#km-table-id.checkbox-class").on("click", faveFunc)

这样,您就可以重复使用 faveFunc 事件处理程序:

function faveFunc(e){
    // ...
}
$("#km-table-id.checkbox-class").on("click", faveFunc)
$("[data-action='add']").on("click", faveFunc)

您还可以将它们组合成一个函数,因为 jQuery 支持 CSS ,:

$("#km-table-id.checkbox-class, [data-action='add']").on("click", faveFunc)

关于javascript - 如何在上下文菜单中触发全局功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54463626/

相关文章:

javascript - jquery ui可排序父元素和子元素

c# - ASP.NET中如何获取登录用户信息

javascript - jQuery 选择除子级 div 之外的所有内容

python - 如何拦截实例方法调用?

javascript - 如何根据按下的按钮调用函数以显示 div?

javascript - document.getElementById.onClick 不起作用(Javascript)

javascript - Node.js 服务器,向客户端导入和导出数据

javascript - 使函数分别作用于每个元素

javascript - 在自动完成表单上输入 onkeydown 功能

javascript - 这个js函数是如何工作的?标题太小无法解释