如何对列表项双击做出反应并为每个列表项添加上下文菜单?

发布于 2024-12-26 16:25:08 字数 348 浏览 1 评论 0原文

我的 xul 中有 listbox 元素。 listitem 元素会动态添加到此处。

我如何:

  1. 双击每个listitem做出反应?
  2. 为每个列表项实现上下文菜单?

listitem 创建期间,我知道添加到其中的每条记录的唯一 ID(数字)。理想情况下,当调用双击函数并且选择上下文菜单项时,我应该获得此 id(并且用户不应该看到它)。

I have listbox element in my xul. listitem elements are added there dynamically.

How can I:

  1. react on double click on each listitem?
  2. implement context menu for each listitem?

During listitems creation, I know unique id (numeric) of each record added there. Ideally when double click function is called and when context menu item is chosen, I should get this id (and it shouldn't be visible to the user).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

迎风吟唱 2025-01-02 16:25:08

事件冒泡意味着您可以在 元素上注册事件处理程序。 event.target 允许您查找 元素:

listbox.addEventListener("dblclick", function(event)
{
  var target = event.target;
  while (target && target.localName != "listitem")
    target = target.parentNode;
  if (!target)
    return;   // Event target isn't a list item

  alert(target.getAttribute("recordId"));
}, false);

这假设您在添加之前已将 recordId 属性添加到列表项中将他们列入名单。

上下文菜单的工作方式类似(您将 context="..." 属性添加到 ),不同之处在于上下文菜单通常在菜单的 popupshowing 事件。此事件的目标是上下文菜单本身,因此它不能帮助您找到列表项。但是,有一个 menupopup.triggerNode() 属性< /a> (已弃用的 document.popupNode 的现代替代品)可以让您完成这项工作:

menu.addEventListener("popupshowing", function(event)
{
  var target = event.target.triggerNode;
  while (target && target.localName != "listitem")
    target = target.parentNode;
  if (!target)
    return event.preventDefault(); // Don't show context menu without a list item

  alert(target.getAttribute("recordId"));
}, false);

Events bubble which means that you can register your event handler on the <listbox> element. event.target allows you to find the <listitem> element:

listbox.addEventListener("dblclick", function(event)
{
  var target = event.target;
  while (target && target.localName != "listitem")
    target = target.parentNode;
  if (!target)
    return;   // Event target isn't a list item

  alert(target.getAttribute("recordId"));
}, false);

This assumes that you've added recordId attributes to your list items before adding them to the list.

Things work similarly with context menus (you add a context="..." attribute to the <listbox>), with the difference that context menus are usually initialized in the menu's popupshowing event. The target of this event is the context menu itself so it doesn't help you find the list item. However, there is a menupopup.triggerNode() property (the modern alternative to the deprecated document.popupNode) that lets you do the job:

menu.addEventListener("popupshowing", function(event)
{
  var target = event.target.triggerNode;
  while (target && target.localName != "listitem")
    target = target.parentNode;
  if (!target)
    return event.preventDefault(); // Don't show context menu without a list item

  alert(target.getAttribute("recordId"));
}, false);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文