【问题标题】:Having different click areas on sidenav在 sidenav 上有不同的点击区域
【发布时间】:2015-02-18 03:40:27
【问题描述】:

我正在使用引导程序,并且我正在使用侧导航在页面左侧提供可折叠列表。下面是我的代码。

<ul class="nav navbar-nav side-nav">
    <li>
       <a class="active" href="#" onclick="loadelementsonpage(); return false" data-toggle="collapse" data-target="#licomp1">
          <i class="fa fa-fw fa-arrow-v"></i>Parent1
       </a>
       <ul id="licomp1" class="collapse">
         <li><a href="#" onclick="loadelements1();">Child1</a></li>
         <li><a href="#" onclick="loadelements2();">Child2</a></li>
         <li><a href="#" onclick="loadelements3();">Child3</a></li>
        </ul>
    </li>
</ul>

我想使用切换加号和减号,而不是固定的&lt;i class="fa fa-fw fa-arrow-v"&gt;&lt;/i&gt;。如代码所示,单击 parent1 时我正在调用一个函数。但是当我尝试扩展 ul 时,每次都会调用函数loadelementsonpage()。所以,我希望列表仅在单击该切换图像时折叠。同样,我只想在单击该切换图像的外部区域时调用loadelementsonpage()。我将此数据切换和数据目标更改为 i 类,但问题是该函数仍在被调用,如果我将 i 类移出标签,样式就会混乱。

那么有人可以解释一下如何在父 li 上设置不同的点击区域吗?一种是折叠,另一种是调用函数加载右侧内容页面。

P.S: 尝试实现这种http://cssmenumaker.com/menu/modern-jquery-accordion-menu 类型的侧导航列表,其中 + 或 - 应该是可点击的,仅用于展开和折叠。请单击该链接中的在线构建以查看侧面导航。其他区域(除了 + 和 - 图标)应作为链接 href 来加载页面。

【问题讨论】:

  • 这对你很有帮助thecssninja.com/demo/css_tree
  • 我喜欢这种效果。也很简单,不需要 JavaScript。 jsfiddle.net/cLnn9ynf/3
  • @SecondRikudo 嗨,对不起,我已尽力详细说明。再次简短地说,我一直在尝试仅在单击按钮时展开和折叠列表。其他区域应该可以单击以执行其他操作(例如,调用 javascript 函数)。请检查问题中提到的链接。
  • @rick 你在你的项目中使用 jQuery,对吧?
  • @RokoC.Buljan 是的,我使用 JQuery、Bootstrap,甚至我使用 this theme 进行侧导航。但它在同一次点击时结合了扩展和 a。我只想在单击 li 和其他区域上的按钮进行其他操作时展开/折叠。

标签: javascript html css twitter-bootstrap font-awesome


【解决方案1】:

不要将 data-toggle 属性赋予锚点,而是将其赋予图标元素,以便切换仅适用于图标。您可以使用 here for plus and minus 类并在 glyphicon-plusglyphicon-minus 类之间切换

<a class="active" href="#">
   <span data-toggle="collapse"  class="glyphicon glyphicon-plus" data-target="#licomp1"></span>Parent1
</a>

$('.side-nav a span').on('click', function () {
    $(this).toggleClass('glyphicon-plus glyphicon-minus');
});

现在点击锚点,你可以检查元素是否为A,如果为真则只调用自定义函数loadelementsonpage

$('.side-nav a').on('click', function (e) {
    console.log(e.target.tagName);
    if (e.target.tagName == "A") {
        loadelementsonpage();
        return true;
    }
})

function loadelementsonpage() {
    alert('Load elements on page');
}

See fiddle

【讨论】:

  • 感谢您的回答,但是即使您的 jsfiddle 中的子元素也会调用 loadelementsonpage(),因为我有单独的函数来调用它们中的每一个。如何避免这种情况?
  • 啊,我没有检查那个。你能不能给家长主播上课parent?如果是,那么您可以更改条件以检查 e.target 是否具有类 parentSomething like this
  • 我已经这样做了,谢谢。最后一个问题,如何自动转到特定的孩子并选择。假设我想向用户显示 child2 并调用 loadelements2()。那么,如何自动展开 parent1 并突出显示 child2?
  • 您可以使用方法.collapse('show') 自动展开并在显示的[shown.bs.collapse] 事件上调用子函数。点击这个fiddle中的展开按钮
  • 非常感谢。我也添加了这个 $('.side-nav a span').toggleClass('glyphicon-plus glyphicon-minus');更改扩展功能中的图标。我会提供赏金,并且只能在 6 小时后完成。
【解决方案2】:

jsbin demo

删除 HTML 中的内联 JS:

   <a class="active" href="#" data-toggle="collapse" data-target="#licomp1">
      <i class="fa fa-fw fa-arrow-v"></i>Parent1
   </a>

只需将其添加到您的 jQuery 中:

function loadelementsonpage(){
  alert("LOADED ELEMENTS! YIIHA"); // Or whatever goes here
}

$(".side-nav").on("click", "a[data-target]", function(e) {
  e.preventDefault(); // Prevent default Browser anchor-click behavior
  if( !$(e.target).hasClass("fa") ){ // If the clicked el. target was not `.fa`
    // means it was the parent `a` to get the click event.  Therefore...
    e.stopPropagation();         // prevent the click to propagate
                                 // to underneath layers triggering stuff and...
    return loadelementsonpage(); // execute (return) our desired function.
  }
});

(确保你在 document.ready 函数中有它)

上面的作用

【讨论】:

  • 它工作,除了我不想显示向下箭头,而是我想在折叠和展开时显示 + 和 - 图标。另外,如果您不介意,请您解释一下您的答案,因为我想了解答案,而不仅仅是将其视为服务目的和+1。
  • @rick dohh 很抱歉没有添加一些代码cmets。我通常会这样做。 (PS 我不知道如何放置 - 和 + 图标,但我认为这是引导程序)我在 HTML(在演示链接中)中使用 向下箭头 只是为了测试这个概念。
【解决方案3】:

概念证明:

function loadelementsonpage(target) {
  // example stuff
  $(target).toggle();
}

$(".side-nav").on("click", "a[data-toggle]", function(event) {
  event.preventDefault(); // Prevent default Browser anchor-click behavior

  var icon = $(event.target).find('.collapseIcon');

  if (icon.text() === '+') {
    icon.text('-');
  } else {
    icon.text('+');
  }
  
  loadelementsonpage(event.target.getAttribute('data-target'));

  return false;
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="nav navbar-nav side-nav">
  <li>
    <a class="active" href="#" data-toggle="collapse" data-target="#licomp1">
      <span class="collapseIcon">-</span> Parent1
    </a>
    <ul id="licomp1" class="collapse">
      <li><a href="#">Child1</a>
      </li>
      <li><a href="#">Child2</a>
      </li>
      <li><a href="#">Child3</a>
      </li>
    </ul>
  </li>
</ul>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    相关资源
    最近更新 更多