点击表格tr(动态)添加上下文菜单

时间:2016-01-07 10:19:19

标签: jquery html contextmenu

动态创建的表,我想在点击表的tr时添加上下文菜单。调用上下文事件的代码工作正常,但我不知道如何制作上下文菜单及其项目。表的代码是:

function setItemForSale(itemForSale, type, xml)
{
  var itemForSaleTable = document.getElementById("custorder1");
  var itemForSaleTableHead = document.getElementById("head1");
  var itemForSaleTableBody = document.createElement("tbody");

  itemForSaleTableBody.appendChild(itemForSaleTableHead);

  $('#custorder1 tr').has('td').remove(); // Code for clearing table body

  for (var i = 0; i < itemForSale.length; i++)
  {
      var row = document.createElement("tr");

      if (row.addEventListener)
      {
          row.addEventListener('contextmenu', function (e)
          {
              $(this).addClass('selected').siblings().removeClass('selected');
              zitemNo = $(this).find('td:first').text();
              z1Pkg = $(this).find('td:nth-child(8)').text();

              e.preventDefault();

          }, false);
      }
      else
      {
          row.attachEvent('oncontextmenu', function ()
          {
              alert("You've tried to open context menu");
              window.event.returnValue = false;
          });
      }

      var obj = itemForSale[i];
      var vitemno = obj["itemNo"];
      var vname = obj["name"];
      var valias = obj["alias"];
      var vbrand = obj["brand"];

      var cell = document.createElement("td");
      var cellText = document.createTextNode(vitemno);
      cell.appendChild(cellText);
      row.appendChild(cell);

      cell = document.createElement("td");
      cellText = document.createTextNode(vname);
      cell.appendChild(cellText);
      row.appendChild(cell);

      cell = document.createElement("td");
      cellText = document.createTextNode(valias);
      cell.appendChild(cellText);
      row.appendChild(cell);

      cell = document.createElement("td");
      cellText = document.createTextNode(vbrand);
      cell.appendChild(cellText);
      row.appendChild(cell);

      itemForSaleTableBody.appendChild(row);
  }
  itemForSaleTable.appendChild(itemForSaleTableBody);
  itemForSaleTable.setAttribute("border", "2");
}

我想创建一个带有“Add”标签的上下文菜单,以便在单击add时调用一个函数。 请帮助。

1 个答案:

答案 0 :(得分:0)

这是一个描述你想要做什么的教程: http://www.sitepoint.com/building-custom-right-click-context-menu-javascript/

为了使其成为一个真正的答案,我将描述这个过程并提供一些代码。

您已经在每一行添加了一个事件,很棒,您需要了解的是上下文菜单是页面上的常规元素,就像任何其他元素一样,您需要定义它。

所以这是一个虚拟的上下文菜单元素:

<div id="context-menu">
</div>

要向其添加元素,您只需要编写(或使用javascript执行)

<div id="context-menu">
    <div id="context-menu-item-add" class="context-menu-item">
    </div>
</div>

现在你有了上下文菜单元素,你需要在你的CSS中隐藏它 并使其位置绝对,以便它可以在页面的任何地方显示

#context-menu { position:absolute; display: none; }

现在在这段代码中,您可以执行类似

的操作
    row.addEventListener('contextmenu', function(e) 
                    {
                                $(this).addClass('selected').siblings().removeClass('selected');
                                zitemNo = $(this).find('td:first').text();
                                z1Pkg = $(this).find('td:nth-child(8)').text();

                                var contextMenu = document.getElementById("context-menu");

                                /* get actual mouse position */
                                var pageX = e.pageX;
                                var pageY = e.pageY;
                                if (pageX === undefined) 
                                {
                                    pageX = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
                                    pageY = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
                                }

                                /* im pretty sure you need to add "px", i dont rememeber sorry */
                                contextMenu.style.display = "block";
                                contextMenu.style.top = [pageY, "px"].join("");
                                contextMenu.style.left = [pageX, "px"].join("");

                                /* i recommend returing false instead of preventing default */
                                return false;

                        }, false);

此代码仅显示点击位置的上下文菜单,您还需要考虑边缘,但我会让您自己解决这个问题。

您还需要为上下文菜单的每个项添加事件侦听器。

document.getElementById("context-menu-item-add").addEventListener("click", /* what to do on item click */)

最后一步是在用户按下上下文菜单项或在其他任何地方点击后“关闭”上下文菜单,所以我建议在整个表上添加一个事件,或者在整个文档中添加事件,并在每个上下文菜单监听器。

编辑:

顺便说一下,如果你要标记jQuery,请实际使用jQuery,它确实简化了制作上下文菜单的过程,因为它已经将pageX和pageY内置到其事件中。