【问题标题】:Show/Hide Requires a Double-click显示/隐藏需要双击
【发布时间】:2020-04-28 19:40:56
【问题描述】:

我正在编写一个基本的显示/隐藏函数,它显示一个内容块并将一些文本从“显示更多好处”更改为“显示更少好处”(反之亦然)。

但由于某种原因,当我第一次单击“显示更多好处”时,它需要单击两次才能运行。之后,一键来回切换就好了。

这是我的代码:

<div class="content" id="content"><br>
<p><span class="benefit-stat">$2B</span> lorem</p>
<p><span class="benefit-stat">$2B</span> ipsum</p>
<p><span class="benefit-stat">$100</span> ipsum</p>
<p><span class="benefit-stat">32%</span> ipsum</p>
</div>
<p class="benefits-drop" id="text" onclick="showHide()">See More Benefits</p>
<script>
function showHide(c,t) {
  var c = document.getElementById("content");
  var t = document.getElementById("text");
  if (c.style.display === "none") {
    c.style.display = "block";
    t.innerHTML = 'See Less Benefits';
  } else {
    t.innerHTML = 'See More Benefits';
    c.style.display = "none";
  }
}
</script>

为什么会发生这种情况?我将如何解决它?

【问题讨论】:

  • console.log(c.style.display, c.style.display === "none")
  • 呃:“未捕获的类型错误:无法读取未定义的属性“样式”-(然后是很长的 id,因为这是一个 hubspot 页面)
  • 所以表示找不到你引用的元素

标签: javascript html css show-hide


【解决方案1】:

需要点击两次的原因:

element.style.display 仅指内联样式

最初,您的元素没有style-属性。结果,element.style.display 返回空字符串:

function showHide(c,t) {
  var c = document.getElementById("content");
  var t = document.getElementById("text");
  console.log("c.style.display is:" + c.style.display);
  if (c.style.display === "none") {
    c.style.display = "block";
    t.innerHTML = 'See Less Benefits';
  } else {
    t.innerHTML = 'See More Benefits';
    c.style.display = "none";
  }
}
<div class="content" id="content"><br>
<p><span class="benefit-stat">$2B</span> lorem</p>
<p><span class="benefit-stat">$2B</span> ipsum</p>
<p><span class="benefit-stat">$100</span> ipsum</p>
<p><span class="benefit-stat">32%</span> ipsum</p>
</div>
<p class="benefits-drop" id="text" onclick="showHide()">See More Benefits</p>

糟糕但简单的解决方案:

style="display: block" 添加到您的初始 HTML:

function showHide(c,t) {
  var c = document.getElementById("content");
  var t = document.getElementById("text");
  console.log("c.style.display is:" + c.style.display);
  if (c.style.display === "none") {
    c.style.display = "block";
    t.innerHTML = 'See Less Benefits';
  } else {
    t.innerHTML = 'See More Benefits';
    c.style.display = "none";
  }
}
<div class="content" id="content" style="display: none"><br>
<p><span class="benefit-stat">$2B</span> lorem</p>
<p><span class="benefit-stat">$2B</span> ipsum</p>
<p><span class="benefit-stat">$100</span> ipsum</p>
<p><span class="benefit-stat">32%</span> ipsum</p>
</div>
<p class="benefits-drop" id="text" onclick="showHide()">See More Benefits</p>

更好的解决方案:

不要在noneblock 之间切换style.display,而是切换通用属性hidden

function showHide() {
  const c = document.getElementById("content");
  const t = document.getElementById("text");
  
  t.textContent = c.hidden ? 'See Less Benefits' : 'See More Benefits';
  c.hidden = !c.hidden;
}
<div class="content" id="content" hidden><br>
<p><span class="benefit-stat">$2B</span> lorem</p>
<p><span class="benefit-stat">$2B</span> ipsum</p>
<p><span class="benefit-stat">$100</span> ipsum</p>
<p><span class="benefit-stat">32%</span> ipsum</p>
</div>
<p class="benefits-drop" id="text" onclick="showHide()">See More Benefits</p>

【讨论】:

    【解决方案2】:

    另一个选项,带有过渡动画:

        <button class="Show">Show</button>
    <button class="Hide">Hide</button>
    <div id="target"></div>
    
    <style>
    .Hide{display:none;}
    </style>
    
    <script>
    $('.Show').click(function() {
        $('#target').show(500);
        $('.Show').hide(0);
        $('.Hide').show(0);
    });
    $('.Hide').click(function() {
        $('#target').hide(500);
        $('.Show').show(0);
        $('.Hide').hide(0);
    });
    $('.toggle').click(function() {
        $('#target').toggle('fast');
    });
    </script>
    

    【讨论】:

    • 我强烈建议您远离 jQuery 或任何其他库,直到您的本机 Javascript 和本机 DOM API 的知识值得称为流媒体。
    猜你喜欢
    • 2019-07-30
    • 2018-07-31
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多