【问题标题】:Track the actions that led to a multi-level drop down menu to open跟踪导致多级下拉菜单打开的操作
【发布时间】:2021-12-28 18:55:59
【问题描述】:

目标:

在多级下拉菜单中跟踪达到某个级别所需的所有操作。

示例:

https://s.bootsnipp.com/iframe/xr4GW 这样的多级下拉菜单,可以通过将鼠标悬停在其上打开。一旦在下拉菜单上单击了一个菜单项,如何确定是哪些悬停动作导致菜单的该部分被打开?

在上面的 bootsnip 演示中,如果第 3 级的第一个链接被点击,我想说的是:

  • 第 1 级中的第三个链接
  • --> 级别 2 中的第二个链接,导致能够
  • ---->点击第3关的第一个链接

当前方向:

目前我正在使用mouseoverclick 事件来查看是否可以通过某种方式将所有事件关联在一起。但目前还没有运气。


提前谢谢你:)

【问题讨论】:

  • 尝试focusin 事件。和focusout 恢复
  • 这是用于分析还是其他用例?
  • @7-zete-7 感谢您的建议。但是,焦点事件似乎不适用于这个用例。例如,在上面的 sn-p 中,焦点事件仅在第 3 级的最终点击时触发。
  • @charlietfl 部分分析。部分是为了我正在玩的一个实验项目;)
  • 您可以将事件数据推送到数组中,当最终事件发生时,获取数组中它之前的内容。我认为可能有点复杂,因为在点击发生之前,有很多元素可以悬停在“偷看”上。所以真的不确定你想丢弃什么以及什么时候丢弃

标签: javascript html dom dom-events


【解决方案1】:

我复制了 sn-p 并进行了以下编辑:

  • 添加了一个可收集的数组path,其中将指示路径的选定元素
  • .dropdown-submenu 元素添加了对mouseover mouseout 事件的监听
  • 添加了 path 数组的渲染,以便能够观察其变化

var path = []
$(".btn-group, .dropdown")
  .hover(
    function() {
      $('>.dropdown-menu', this).stop(true, true).fadeIn("fast");
      $(this).addClass('open');
      path.push($(this).children('a').text().trim());
      renderDebug();
    },
    function() {
      $('>.dropdown-menu', this).stop(true, true).fadeOut("fast");
      $(this).removeClass('open');
      path.pop();
      renderDebug();
    }
  );
$(".dropdown-submenu")
  .on("mouseover", function () {
    path.push($(this).children('a').text().trim());
    renderDebug();
  })
  .on("mouseout", function () {
    path.pop();
    renderDebug();
  });

const $debug = $("#debug");

function renderDebug () {
  $debug.text(JSON.stringify(path, null, 2));
}
.dropdown-submenu {
  position: relative;
}

.dropdown-submenu>a:after {
  content: ">";
  float: right;
}

.dropdown-submenu>.dropdown-menu {
  top: 0;
  left: 100%;
  margin-top: 0px;
  margin-left: 0px;
}

.dropdown-submenu:hover>.dropdown-menu {
  display: block;
}
<link href="//maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet">
<script src="//code.jquery.com/jquery-1.11.1.min.js"></script>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>

<div class="container">
  <div class="row">
    <div class="col-lg-12">
      <div class="card my-3">
        <div class="card-header">
          Bootstrap 4 Multilevel Dropdown Hover
          <div class="options float-right">
            <a class="settings"><i class="fa fa-cog"></i></a>
            <a href="#" class="collapse"><i class="fa fa-chevron-up"></i></a>
            <a href="#" class="reload"><i class="fa fa-refresh"></i></a>
            <a href="#" class="fullscreen"><i class=" fa fa-expand"></i></a>
            <a href="#" class="remove"><i class="fa fa-times"></i></a>
          </div>
        </div>
        <div class="card-body">
          <div class="row">
            <div class="col-lg-12">
              <div class="btn-group">
                <a id="dLabel" role="button" data-toggle="dropdown" class="btn btn-primary dropdown-toggle" href="">
                                    Dropdown
                                </a>
                <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu">
                  <li><a class="dropdown-item" href="#">level 1</a></li>
                  <li><a class="dropdown-item" href="#">level 1</a></li>
                  <li class="dropdown-divider"></li>
                  <li class="dropdown-submenu">
                    <a class="dropdown-item" tabindex="-1" href="#">
                                            level 1
                                        </a>
                    <ul class="dropdown-menu">
                      <li><a class="dropdown-item" tabindex="-1" href="#">level 2</a></li>
                      <li class="dropdown-submenu">
                        <a class="dropdown-item" href="#">
                                                    level 2
                                                </a>
                        <ul class="dropdown-menu">
                          <li><a class="dropdown-item" href="#">3rd level</a></li>
                          <li><a class="dropdown-item" href="#">3rd level</a></li>
                        </ul>
                      </li>
                      <li><a class="dropdown-item" href="#">level 2</a></li>
                      <li><a class="dropdown-item" href="#">level 2</a></li>
                    </ul>
                  </li>
                </ul>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>
<pre id="debug"></pre>

【讨论】:

  • 非常感谢您的回答@7-zete-7。虽然这可能适用于这种特定的下拉案例,但我正在尝试形成一种更通用的方法,该方法适用于页面级别的多种下拉菜单。
猜你喜欢
  • 2021-08-28
  • 2017-07-22
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多