【问题标题】:Trouble Understanding jQuery-UI Popup Menu无法理解 jQuery-UI 弹出菜单
【发布时间】:2012-12-04 04:25:30
【问题描述】:

我正在尝试弄清楚如何使用 jQuery UI 菜单小部件制作弹出菜单。

四处搜索后,我终于找到了以下演示,可以满足我的要求:

http://view.jqueryui.com/menubar/demos/popup/popup-menu.html

但是,我在理解这个演示时遇到了一些麻烦。例如:

  1. 是什么导致菜单在单击任何按钮之前隐藏?
  2. 是什么导致菜单在打开时关闭,然后我单击页面上的其他位置?

任何帮助表示赞赏。

【问题讨论】:

  • What is making the menu hidden 嗯,当然是 jQuery UI 让它隐藏了。
  • 这是为了提供帮助吗?哪个 jQuery UI 函数隐藏了它,它在哪里被调用?
  • Line 25: $("#button1").button().next().menu(... 它使#button1 成为一个按钮,并使下一个元素成为menu
  • 我可以看到它使按钮成为触发器并列出菜单。但我不明白这与我所问的有什么关系。
  • 当你调用.menu()时,它会触发很多事情,包括隐藏菜单和添加监听器,例如,它将类名应用到目标元素line 45@jquery.ui.menu.js ...addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )

标签: javascript jquery jquery-ui jquery-ui-menu


【解决方案1】:

该演示使用 jquery.ui.menu.js 的修改版本以及弹出窗口小部件:http://view.jqueryui.com/menubar/ui/jquery.ui.popup.js

在 1.9 中发布的菜单本身没有任何代码可以将其显示为弹出窗口。我建议编写一些自定义代码来构建弹出菜单,直到稳定版本提供适当的解决方案。

【讨论】:

    【解决方案2】:

    您引用的jQuery UI Popup - Popup Menu 使用unreleased code,正如Jörn Zaefferer 所说。 (请注意,Jörn 是关闭the bug 的同一个人)

    但是jQuery UI Button's Split Button example 中有一个外观几乎相同的解决方案,使用.popup() 并明确地进行所有隐藏等。

    也许您可以将其作为起点。我知道我要去! ;-)

    【讨论】:

      【解决方案3】:

      我相信这可能就是您想要的。当你调用.menu() 时,_create() 函数中会触发很多事情(正如 Derek 所说),比如设置类名等。然后,在jquery.ui.menu.js 的第 123-135 行,会发生这种情况:

          this.refresh();
      
          // Clicks outside of a menu collapse any open menus
          this._on( this.document, {
              click: function( event ) {
                  if ( !$( event.target ).closest( ".ui-menu" ).length ) {
                      this.collapseAll( event );
                  }
      
                  // Reset the mouseHandled flag
                  mouseHandled = false;
              }
          });
      

      第二部分确保当用户点击菜单 (.ui-menu) 外的页面 (this.document) 时所有菜单都被折叠:调用 this.collapseAll(),它调用 this._close(),然后调用 @ 987654329@。这应该回答你的第二个问题。

      至于你的第一个问题,refresh() 函数做的第一件事是:

          // Initialize nested menus
          var menus,
              icon = this.options.icons.submenu,
              submenus = this.element.find( this.options.menus + ":not(.ui-menu)" )
                  .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
                  .hide()
                  .attr({
                      role: this.options.role,
                      "aria-hidden": "true",
                      "aria-expanded": "false"
                  });
      

      这会找到之前未初始化的所有子菜单(在本例中是所有子菜单,因为我们来自 _create())并初始化它们,包括隐藏它们。

      【讨论】:

      • 这些实际上都没有隐藏菜单本身,它只处理子菜单。
      猜你喜欢
      • 1970-01-01
      • 2014-04-01
      • 2018-06-02
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多