【问题标题】:jQuery UI menu inside a jqGrid celljqGrid 单元格内的 jQuery UI 菜单
【发布时间】:2013-10-02 09:04:45
【问题描述】:

我创建了一个网格并自定义了一个列以包含一个 jquery UI 菜单,如Split Button example

一切正常,除了菜单窗口出现在单元格内导致视觉效果不佳,即单元格高度增加为菜单窗口腾出空间。 查看以下屏幕截图以获得直观的解释(不要介意菜单项处于禁用状态)。

有什么方法可以让菜单窗口根据 z-index 出现在表格元素的顶部?

非常感谢您的宝贵帮助,社区 :)

根据评论请求进行编辑:

创建拆分按钮菜单的代码如下。首先是列模型标记

{ name: 'act', index: 'act', width: 80, sortable: false, search: false, align: 'center',
  formatter: function (cellvalue, options, rowObject) {
      var markup = "<div>" +
                      "<div class='actionsButtonset'>" +
                          "<button class='dshbd_ConfirmMonth' rel='" + rowObject.UmltID + "' rev='" + rowObject.IsConfirmAvailable + "' plock='" + rowObject.IsPeriodLocked + "' alt='Confirm'>Confirm</button>" +
                          "<button class='btnSelectMenu' rev='" + rowObject.IsUmltLocked + "' " + ">Select</button>" +
                      "</div>" +
                      "<ul class='actionMenu'>" +
                          "<li><a class='dshbd_UnlockMonth' href='#' rel='" + rowObject.UmltID + "' alt='Unlock'>Unlock</a></li>" +
                      "</ul>" +
                   "</div>";
      return markup;
  }
}

然后,在 gridComplete 事件中,我有以下代码(请注意,启用/禁用菜单项需要一些代码

var confirmMonthBtn = $('.dshbd_ConfirmMonth');
$.each(confirmMonthBtn, function (key, value) {
    var button = $(this);
    var umltID = button.attr('rel');
    button.button().click(function (event) {
        event.preventDefault();
    });
    var isPeriodLocked = (button.attr('plock') === 'true');
    if (!isPeriodLocked) {
        var isConfirmAvailable = ($(this).attr('rev') === 'true');
        if (!isConfirmAvailable) {
            button.button({ disabled: true });
        }
    } else {
        button.button({ disabled: true });
    }
});
var currentPeriod = GetCurrentPeriod();
var period = GetCurrentViewPeriod();
var isCurrent = false;
if (currentPeriod != null && period != null) {
    isCurrent = period.PeriodID == currentPeriod.PeriodID;
}
var selectBtns = $('.btnSelectMenu');
$.each(selectBtns, function (key, value) {
    var button = $(this);
    button.button({ text: false, icons: { primary: 'ui-icon-triangle-1-s'} });
    button.click(function (event) {
        var menu = $(this).parent().next().show();
        menu.position({
            my: 'left top',
            at: 'left bottom',
            of: this
        });
        $(document).on('click', function () {
            menu.hide();
        });
        return false;
     });
     $('div.actionsButtonset').buttonset();
     var menuElement = button.parent().next();
     menuElement.hide();
     menuElement.menu({
         select: function (event, ui) {
             var umltID = ui.item.children().attr('rel');
             event.preventDefault();
         }
     });
     if (!isCurrent) {
         var isPeriodLocked = ($(this).attr('plock') === 'true');
         if (isPeriodLocked) {
             menuElement.menu({ disabled: false });
         } else {
             var isUmltLocked = ($(this).attr('rev') === 'true');
             menuElement.menu({ disabled: !isUmltLocked });
         }
     } else {
         //The current period is always unlocked
         menuElement.menu({ disabled: true });
     }
});

【问题讨论】:

  • 您能否详细说明您是如何在网格中实现拆分按钮的?带有按钮的列的自定义格式化程序代码和创建按钮和创建菜单的代码(可能在loadComplete 内部)是问题的根源。您是否为菜单的&lt;ul&gt; 元素指定了任何z-index 值?例如,您可以尝试使用&lt;ul style="z-index:1"&gt;
  • @Oleg:请看一下我的编辑。我看过你的例子,效果很好。您能否帮助我了解存在哪些差异?非常感谢!
  • 主要区别之一是&lt;ul&gt;位置,它构建了弹出菜单。您将它放在单元格内,单元格的&lt;td&gt; 是菜单的间接父级。我将&lt;ul&gt; 放在&lt;body&gt; 中(它的父级是&lt;body&gt;)。这是菜单出现z-index 和剪辑问题(我的演示 中的菜单可以显示在网格之外)的主要原因。此外,您永远不会同时在不同的单元格中显示多个弹出菜单。所以不需要在每一行中创建&lt;ul&gt;
  • 在我的实现中,我展示了如何获取点击按钮的 rowid。可以从rowid 获得关于 jqGrid API 的所有其他信息
  • @Oleg:好的。我正在尝试将菜单从单元格中取出,并使用您的建议对代码进行修订。有消息通知你。谢谢!

标签: jquery-ui jqgrid jquery-ui-button jquery-ui-menu


【解决方案1】:

我为您准备了the demo,它演示了如何在 jqGrid 内部使用拆分按钮。它显示

我稍后会发布有关演示的更详细说明。想必大家看完代码就明白了。

【讨论】:

  • 想再次投票!非常感谢奥列格 :)
  • @Oleg,示例效果很好,谢谢。但是,我的代码调用 setrowdata,并且由于将按钮设置为菜单的代码在 loadcomplete 上运行,因此当格式化程序在 setgriddata 之后返回 时,它们不会被重新“按钮化”。关于格式化后如何调用 loadcomplete 中的代码有什么想法吗?
  • @user1689571:对不起,我不明白你的意思。可能您可以打开新问题,在其中更详细地解释问题并在此处发布问题的链接。
  • @JureŠpik:答案提供了可能实现的示例。它使用自定义格式化程序在列中放置两个&lt;botton&gt;,并使用jQuery UI Button、jQuery UI Menu 和Position 以及jQuery.click。菜单本身将被动态创建,但它是 DOM 层次结构中的直接父级(它是 &lt;body&gt; 的直接子级)并不重要。
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 2013-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多