【问题标题】:How do you trigger the on collapse event on a bootstrap navbar?如何在引导导航栏上触发折叠事件?
【发布时间】:2022-01-21 16:04:11
【问题描述】:

这个问题很可能是重复的,但我似乎无法在任何其他相关问题上找到答案。当导航栏在较小的屏幕上折叠时,如何触发一个表明折叠按钮图标已被单击的事件?我尝试使用下面的js代码无济于事:

$('#main_nav').on('hidden.bs.collapse', function () {
        alert('collapse')
 })

或者这个:

$('.navbar-collapse').on('show.bs.collapse', function () {
        console.log("collapse");
});

这是我目前的代码:

 <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">


<nav class="autohide navbar navbar-expand-lg navbar-dark" id='my-nav' >
            <div class="container-fluid">
                <a class="navbar-brand" href="/">
                    <img src="" alt="logo" width="40" height="40" id="logo"/>
                </a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#main_nav">
                    <span className="navbar-toggler-icon" id="toggler"></span>
                </button>
                <div class="collapse navbar-collapse text-color" id="main_nav">
                    
                </div> 
            </div> 
        </nav>

我应该在 jquery 事件侦听器中引用哪个类/id,以便调用在较小屏幕上单击折叠按钮时发生的事件?

【问题讨论】:

  • 要触发事件吗?还是听事件?我没有看到您试图触发事件的代码,而只是监听事件。我无法从您提供的 HTML 中重现。它没有显示任何内容。
  • 但是,从Navbar document 他们使用折叠功能,从collapse document,他们使用 4 个事件。 show.bs.collapseshown.bs.collapsehide.bs.collapsehidden.bs.collapse。请仔细阅读您甚至想听哪个(如果您想听而不是触发)。

标签: javascript html jquery css


【解决方案1】:

由于我对原始发帖人询问触发事件感到有点困惑,但他试图做的是(从代码中)监听事件。

所以,我会尝试解决这两个问题。

OP 的 HTML 没有在导航栏菜单中显示任何内容。我将使用 Bootstrap 文档中的示例。

<nav class="navbar navbar-expand-lg navbar-light bg-light">
  <div class="container-fluid">
    <a class="navbar-brand" href="#">Navbar</a>
    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#main_nav" aria-controls="main_nav" aria-expanded="false" aria-label="Toggle navigation">
      <span class="navbar-toggler-icon"></span>
    </button>
    <div class="collapse navbar-collapse" id="main_nav">
      <ul class="navbar-nav me-auto mb-2 mb-lg-0">
        <li class="nav-item">
          <a class="nav-link active" aria-current="page" href="#">Home</a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="#">Link</a>
        </li>
        <li class="nav-item dropdown">
          <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
            Dropdown
          </a>
          <ul class="dropdown-menu" aria-labelledby="navbarDropdown">
            <li><a class="dropdown-item" href="#">Action</a></li>
            <li><a class="dropdown-item" href="#">Another action</a></li>
            <li><hr class="dropdown-divider"></li>
            <li><a class="dropdown-item" href="#">Something else here</a></li>
          </ul>
        </li>
        <li class="nav-item">
          <a class="nav-link disabled">Disabled</a>
        </li>
      </ul>
      <form class="d-flex">
        <input class="form-control me-2" type="search" placeholder="Search" aria-label="Search">
        <button class="btn btn-outline-success" type="submit">Search</button>
      </form>
    </div>
  </div>
</nav>


<p>
    Custom buttons
    <button id="trigger">
    collapse/expand.
    </button>
    <button id="triggerexpand">
    expand.
    </button>
    <button id="triggercollapse">
    collapse.
    </button>
</p>
$('#main_nav').on('hide.bs.collapse', function() {
    console.log('on collapsing')
});
$('#main_nav').on('hidden.bs.collapse', function() {
    console.log('collapsed')
});


$('.navbar-collapse').on('show.bs.collapse', function() {
    console.log("on showing");
});
$('.navbar-collapse').on('shown.bs.collapse', function() {
    console.log("already shown");
});


$('#trigger').on('click', (e) => {
    e.preventDefault();
    console.log('trigering');
    const event1 = new CustomEvent('hide.bs.collapse', { bubbles: true});
    const event2 = new CustomEvent('hidden.bs.collapse', { bubbles: true});

    let thisButton = e.target;
    // use dispatchEvent() (not working).
    $('#main_nav')[0].dispatchEvent(event1);// not working.
    $('#main_nav')[0].dispatchEvent(event2);// not working.
    // try to dispatch event on root document (not working).
    document.dispatchEvent(event1);// not working.
    document.dispatchEvent(event2);// not working.

    // use jQuery.trigger() (not working).
    $('#main_nav').trigger('hide.bx.collapse');// not working.
    $('#main_nav').trigger('hidden.bx.collapse');// not working.

    // do jQuery trigger "click". (collapse/expand WORK).
    $('.navbar-toggler').trigger('click');
});

$('#triggerexpand').on('click', (e) => {
    e.preventDefault();
    // trigger to expand only.
    let myCollapse = document.getElementById('main_nav');
    let bsCollapse = new bootstrap.Collapse(myCollapse, {
      toggle: false
    });
    bsCollapse.show();
});

$('#triggercollapse').on('click', (e) => {
    e.preventDefault();
    // trigger to collapse only.
    let myCollapse = document.getElementById('main_nav');
    let bsCollapse = new bootstrap.Collapse(myCollapse, {
      toggle: false
    });
    bsCollapse.hide();
});

在上面的代码中,我在导航栏上监听所有 4 个事件。您可以使用任何选择器(#main_nav.navbar-collapse)。
您使用的事件侦听器已经正确,以防您想侦听事件而无法正常工作,这来自您不正确的 HTML。

我在您的问题中添加了触发按钮来执行触发事件。请再次注意,触发事件与监听事件不同。
要触发事件,您不能只使用.dispatchEvent().trigger() 和事件名称。这不适用于 Bootstrap 折叠事件。
要使触发事件起作用,您必须改为触发点击。使用.trigger('click') 会告诉jQuery 点击那个按钮,导航栏会折叠/展开,事件会被触发。

jsfiddle 12 中查看。

【讨论】:

    【解决方案2】:

    为了让Bootstrap中的事件正常工作,一定要在head里输入jQuery和boostrap.js。

    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
    <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
    
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
    

    那么在事件的情况下,必须在具有 .navbar 类的父元素上触发事件。

    $('.navbar').on('show.bs.collapse', function () {
            console.log("collapse");
    });
    

    同时将你的html代码修改成下面的形式

    
    <nav class="navbar navbar-expand-lg navbar-light bg-light" id='my-nav'>
      <div class="container-fluid">
        <a class="navbar-brand" href="/">
        <img src="" alt="logo"/>
        </a>
        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#main_nav">
          <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse text-color" id="main_nav">
        
        </div>
        </div>
    </nav>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多