【问题标题】:elements with the same class name in javascriptjavascript中具有相同类名的元素
【发布时间】:2017-07-27 00:00:59
【问题描述】:

我是 javascript 新手,因为我跳过它并跳转到 jquery,现在我正在编写一个 javascript 代码,但我遇到了麻烦。我有多个具有相同类名的元素,每个元素下面是一个 a-tag。我想在单击它下面的按钮时隐藏/显示元素。我怎么能在javascript中做到这一点? (请不要使用 jquery)。

HTML

<div>
 <div class="content">content 1</div>
 <a class="show-more" onclick="toggleText();" href="javascript:void(0);">Show more</a>
</div>
<div>
 <div class="content">content 2</div>
 <a class="show-more" onclick="toggleText();" href="javascript:void(0);">Show more</a>
</div>
<div>
 <div class="content">content 3</div>
 <a class="show-more" onclick="toggleText();" href="javascript:void(0);">Show more</a>
</div>

CSS

.content {
 display: none;
}

Javascript

  var status = "less";
  function toggleText1() {
    if (status == "less") {
      document.getElementsByClassName("content")[0].style.display = 'block';
      document.getElementsByClassName("show-more")[0].innerText = "See Less";
      status1 = "more";
    } else if (status1 == "more") {
      document.getElementsByClassName("content")[0].style.display = 'none';
      document.getElementsByClassName("show-more")[0].innerText = "See More";
      status1 = "less";
    }   
  }

在我的原始代码中,我将我的内容命名为 content1、content2,将我的 a-tag 命名为 show-more1、show-more2,然后将我的函数命名为 toggleText1、toggleText2 等等。它有效,但我发现它效率低下。你们能指导我正确的道路吗?

【问题讨论】:

    标签: javascript html show-hide getelementsbyclassname classname


    【解决方案1】:

    这是解决问题的方法之一。捕获所有链接,然后使用Array#forEach 对其进行迭代并将click 事件绑定到每个元素。然后在父节点中找到div 元素并将其类从隐藏切换为可见。

    ES6解决方案。

    var elems = document.getElementsByClassName("show-more");
    
    Array.from(elems).forEach(v => v.addEventListener('click', function() {
      this.parentElement.getElementsByClassName('content')[0].classList.toggle('hidden');
    }));
    .hidden {
      display: none;
    }
    <div>
      <div class="content">content 1</div>
      <a class="show-more" href="javascript:void(0);">Show more</a>
    </div>
    <div>
      <div class="content">content 2</div>
      <a class="show-more" href="javascript:void(0);">Show more</a>
    </div>
    <div>
      <div class="content">content 3</div>
      <a class="show-more" href="javascript:void(0);">Show more</a>
    </div>

    ES5解决方案。

    var elems = document.getElementsByClassName("show-more");
    
    for (var i = 0; i < elems.length; i++){
      elems[i].addEventListener('click', function(){
        this.parentElement.getElementsByClassName('content')[0].classList.toggle('hidden');
      })
    }
    .hidden {
      display: none;
    }
    <div>
      <div class="content">content 1</div>
      <a class="show-more" href="javascript:void(0);">Show more</a>
    </div>
    <div>
      <div class="content">content 2</div>
      <a class="show-more" href="javascript:void(0);">Show more</a>
    </div>
    <div>
      <div class="content">content 3</div>
      <a class="show-more" href="javascript:void(0);">Show more</a>
    </div>

    【讨论】:

    • 要注意这个需要用到es6+
    • 确实如此。然而,它仍然不是每个使用 javascript 的人都使用的。我指出它是因为 OP 在他的代码中没有使用任何 es6+ 语法
    • 现在应该可以使用了,但它仍然没有 100% 支持所有浏览器。我只是想向 OP 指出一些事情,以便他/她明白这对他们来说可能无法开箱即用。这不是对您的回答的冒犯。
    • 但它还没有死,IE 11 仍然有 3.6% 的全球使用率,超过 Edge,所以这不是一个微不足道的用户数量。 (caniuse.com/#feat=arrow-functions)。就个人而言,我会提供您的现代版本和“经典”版本,以便 OP 可以决定他想要支持的内容。
    • @Kinduser 我喜欢使用它。所以,我更喜欢你的 es5 解决方案,它对我来说更清晰。一直想使用来自 jquery 的 $(this) 只是不知道如何在 javascript 中做到这一点。谢谢。
    【解决方案2】:

    首先,您可以通过使用 this 作为自变量/参数来传递 onclick 中的元素,以了解 on click 的来源。然后,您获取父级并获取正确的内容 div 并使用样式元素并对要显示或隐藏的内容执行一些逻辑。

    根据您的帖子,您还应该默认隐藏您的内容 div。

    function toggleText(aTag) {
      var content = aTag.parentNode.getElementsByClassName("content")[0];
      if(content.style.display == null || content.style.display == "none")
      {
        content.style.display = 'block';
        aTag.innerText = "See Less";
      }
      else
      {
        content.style.display = 'none';
        aTag.innerText = "See More";
      }
    }
    <div>
     <div class="content" style="display:none;">content 1</div>
     <a class="show-more" onclick="toggleText(this);" href="javascript:void(0)">Show more</a>
    </div>
    <div>
     <div class="content" style="display:none;">content 2</div>
     <a class="show-more" onclick="toggleText(this);" href="javascript:void(0)">Show more</a>
    </div>
    <div>
     <div class="content" style="display:none;">content 3</div>
     <a class="show-more" onclick="toggleText(this)" href="javascript:void(0)">Show more</a>
    </div>

    也只有我一个人,还是这闻起来像家庭作业?

    【讨论】:

    • 好吧,我正在为 ebay 改造一个页面,因为 ebay 在其 iframe 中不太支持 jquery,所以我尝试通过 javscript 执行一些功能。
    【解决方案3】:

    var hidePrev = function(event){
      element = event.target;
      element.previousSibling.previousSibling.classList.toggle('hidden');
    };
    .hidden {
      display: none;
    }
    <div>
      <div class="content">content 1</div>
      <a class="show-more" onclick='hidePrev(event);'
      href="javascript:void(0);">Show more</a>
    </div>
    <div>
      <div class="content">content 2</div>
      <a class="show-more"  onclick='hidePrev(event);'
      href="javascript:void(0);">Show more</a>
    </div>
    <div>
      <div class="content">content 3</div>
      <a class="show-more"  onclick='hidePrev(event);'
      href="javascript:void(0);">Show more</a>
    </div>

    【讨论】:

      【解决方案4】:

      您还可以使用委托事件侦听器,它是分配给公共祖先元素的事件侦听器。

      检查该元素是否是我们要查找的元素类型(这个检查可能会根据页面的实际内容而改变),然后选择上一个元素兄弟并根据当前值。

      此示例使用粗箭头函数(在 ECMAScript 2015 语言规范中引入),但如果需要支持旧浏览器,则普通函数表达式就足够了。

      document.addEventListener('click', event => {
        const element = event.target
        if(event.target.classList.contains("toggle")) {
          const previous = event.target.previousElementSibling
          const text = element.textContent
          element.textContent = element.dataset.toggleText || "Show less"
          element.dataset.toggleText = text
          previous.classList.toggle('hidden')
        }
      })
      .hidden {
       display: none;
      }
      <div>
       <div class="content hidden">content 1</div>
       <a class="toggle" href="#">Show more</a>
      </div>
      <div>
       <div class="content hidden">content 2</div>
       <a class="toggle" href="#">Show more</a>
      </div>
      <div>
       <div class="content hidden">content 3</div>
       <a class="toggle" href="#">Show more</a>
      </div>

      【讨论】:

        【解决方案5】:

        疯狂的,仅限 CSS 的答案 - 仅用于娱乐和教育目的

        这确实有一些实际应用,您可以通过向 url 添加一个哈希来预先打开您的内容区域之一。例如http://yourdomain/page#Content2

        .content .show-less {
          display: block;
        }
        
        .content {
          display: none;
        }
        
        #content-container .content:target {
          display: block;
        }
        
        #content-container .content:target~.show-more {
          display: none;
        }
        <div id="content-container">
          <div>
            <div class="content" id="Content1">content 1 <a href="#content-container" class="show-less">Show Less</a></div>
            <a class="show-more" href="#Content1">Show more</a>
          </div>
          <div>
            <div class="content" id="Content2">content 2 <a href="#content-container" class="show-less">Show Less</a></div>
            <a class="show-more" href="#Content2">Show more</a>
          </div>
          <div>
            <div class="content" id="Content3">content 3 <a href="#content-container" class="show-less">Show Less</a></div>
            <a class="show-more" href="#Content3">Show more</a>
          </div>
        </div>

        更多阅读:

        【讨论】:

        • 感谢 css 中的好概念。我唯一的问题是每次都必须更改元素 ID。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多