【问题标题】:Simple reusable JavaScript toggle() script?简单的可重用 JavaScript toggle() 脚本?
【发布时间】:2011-09-14 01:36:32
【问题描述】:

我正在学习 JavaScript,但不知道如何处理可重用代码的简单 sn-p。

我需要一段代码来隐藏()#body01、#body02、#body03、04,05 等(所有这些)。然后,当我单击 title01 时,它知道我想要切换() body01。如果我点击title02,它将toggle() body02 等等。

<a id="title01">Title 1</a>
<div id="body01">Body content for Title 1</div>

<a id="title02">Title 2</a>
<div id="body02">Body content for Title 2</div>

<a id="title03">Title 3</a>
<div id="body03">Body content for Title 3</div>

对不起,如果有人问过这个问题,我自己找不到也找不到。

谢谢!

【问题讨论】:

  • 你必须直接使用 javascript 还是可以使用 jQuery 或其他库? jQuery 有一个 toggle() 方法。还有你试过什么?发布您迄今为止尝试过的 javascript。
  • 作为一个新手,我建议你开始使用 jQuery,它会让你的生活更轻松。

标签: javascript jquery code-reuse


【解决方案1】:

您可以使用 jQuery 使用 toggle 方法来执行此操作:

$(function(){
  $("[id^=title]").click(function(){
    $(this).next().toggle();
    return false; // prevent moving down or going to link
  });
});

【讨论】:

    【解决方案2】:

    如果你使用 jQuery(如果没有,你应该使用),就这么简单:

    $('[id^=title]').click(function(){
    
        var tmp = $(this).attr('id').split("title");
        $('#body'+tmp[1]).toggle();
    
    });
    

    【讨论】:

    • 如果正文 div 总是紧跟在标题 div 之后,我会推荐 Sarfraz 的解决方案。
    【解决方案3】:

    将类添加到您的 DOM 元素中,如下所示:

    <a class="title" id="title01" href="">Title 1</a>
    <div class="body" id="body01">Body content for Title 1</div>
    
    <a class="title" id="title02" href="">Title 2</a>
    <div class="body" id="body02">Body content for Title 2</div>
    
    <a class="title" id="title03" href="">Title 3</a>
    <div class="body" id="body03">Body content for Title 3</div>
    

    然后你可以像这样添加切换功能:

    $('.title').click(function(e){
        e.preventDefault();
        $(this).next('.body').toggle();
    });
    

    这是accordion like jQuery functionality的演示

    【讨论】:

      【解决方案4】:

      新的 JS 开发人员经常在没有先学习 JavaScript 作为一门语言的情况下直接进入 jQuery。您绝对应该至少学习一些简单的 JavaScript,以便您能够更好地理解和使用 jQuery 的强大功能。最好的切换方法是设置和删除一个类,而不是在元素上设置样式属性。话虽如此,你可以做这样的事情。

      .hidden { 显示:无; }

          <div>
              <a id="title01" class="toggler">Title 1</a>
              <div class="body" id="body01">Body content for Title 1</div>
      
              <a id="title02" class="toggler">Title 2</a>
              <div class="body" id="body02">Body content for Title 2</div>
      
              <a id="title03" class="toggler">Title 3</a>
              <div class="body" id="body03">Body content for Title 3</div>
          </div>
      
          <script>
              // set your initial variables
              // ideally you will put these in a function which is not
              // exposed to the global object
              var togglers = document.getElementsByTagName('a'),
                  divs   = document.getElementsByTagName('div'),
                  i, j;
      
              // here you loop through your a elements and if they have
              // a class of toggler you assign the onclick event to a toggle function
              for ( i = 0; i < togglers.length; i += 1) {
                  if (togglers[i].className == 'toggler') {
                      togglers[i].onclick = toggle;
                  }
              }
      
              function toggle() {
                  // here you will cache the variable toToggle
                  // which is the div you want to toggle
                  var toToggle;
      
                  // loop through all divs and if they have a class of body
                  // you hide it
                  for (j = 0; j < divs.length; j += 1) {
                      if (divs[j].className == 'body') {
                          divs[j].className += ' hidden';
      
                          // this is tricky for a beginner. nodeType 1 is an element node
                          // nextSibling will get the nextSibling but if there is white space
                          // in your document it will return a text node when you have to toggle
                          // an element node. this just ensures that it will keep going until it
                          // finds and element node
                          if (this.nextSibling.nodeType !== 1) {
                              toToggle = this.nextSibling.nextSibling;
                          }
                          // then you toggle it by removing the hidden class
                          toToggle.className = 'body';
                      }
                  }
              }
      
          </script>
      </body>
      

      这里有几个链接可以引用 nodeType 和下一个兄弟。 https://developer.mozilla.org/en/nodeType

      https://developer.mozilla.org/En/DOM/Node.nextSibling

      【讨论】:

      • 我不同意,我在学习 jQuery 时整体跳过了 Javascript,每次看一些标准的 Javascript 时,我都觉得我做出了正确的选择。
      • 我想这都是见仁见智的问题。如果您对成为专业的 javascript 开发人员不感兴趣,那么这可能并不重要,因为 jQuery 提供了如此多的插件。话虽如此,我仍然认为知道是什么让 jQuery 做它的工作是有益的。
      • 好吧,我认为说“如果您对成为专业的 javascript 开发人员没有兴趣”有点过分了。我自己编写了大多数“jQuery 插件”,所以我仍在编程,我只是使用更简单、更合乎逻辑(对我而言)的方法。
      • 好吧,也许这太极端了。它只是归结为你自己的意见。我想知道 jQuery 是如何做到的,所以我开始学习 JavaScript。在很多情况下,我现在可以用纯 JavaScript 编写一个快速函数,而以前我会加载整个 jQuery 库而不使用它的 3/4。因此,与仅了解 jQuery 相比,了解 JavaScript 对我来说是一个巨大的好处。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多