【问题标题】:Onclick event on <a> tag needs to be clicked twice<a> 标签上的 onclick 事件需要点击两次
【发布时间】:2020-11-26 18:57:57
【问题描述】:

为什么我需要在“a”标签上单击两次才能运行 onclick 事件? 我的目标:当点击“a”标签时,将下面默认隐藏的div显示为块。

function myFunction1(num) {
  var x = document.getElementById("description");
  if (x.style.display === "none") {
    x.style.display = "block";
  } else {
    x.style.display = "none";;
  }
}

function myFunction2(num) {
  var x = document.getElementById("benefits");
  if (x.style.display === "none") {
    x.style.display = "block";
  } else {
    x.style.display = "none";;
    return
  }
}

function myFunction(button) {
  var x = button.id;
  switch (x) {
    case '1':
      myFunction1(x);
      break;
    case '2':
      myFunction4(x);
      break;
    default:
      return false;
  }
}
var buttons = document.getElementsByTagName('a');
for (var i = 0, len = buttons.length; i < len; i++) {
  buttons[i].onclick = function() {
    myFunction(this);
  }
};
<header class="container">
  <nav class="navbar">
    <a id="1">Description</a>
    <a id="2">Benefits</a>
  </nav>
</header>

<div class="details">
  <div class="details_object" id="description" style="display: none">
    <p> <span></span> Lorem ipsum dolor sit, amet consectetur adipisicing elit. Illo, dolorem. </p>
    <p> <span></span> Lorem ipsum dolor sit, amet consectetur adipisicing elit. Illo, dolorem. </p>

  </div>

  <div class="details_object" id="benefits" style="display: none">
    <p> <span></span> Lorem ipsum dolor sit, amet consectetur adipisicing elit. Illo, dolorem. </p>
    <p> <span></span> Lorem ipsum dolor sit, amet consectetur adipisicing elit. Illo, dolorem. </p>

  </div>
</div>

我还尝试实现的是一次只显示一个 .details_object,所以如果显示了一个,但调用了另一个函数,请将第一个设置为默认值。

【问题讨论】:

标签: javascript html onclick


【解决方案1】:

我会稍微更改您的 html,以便您可以使用链接的 href 属性,然后只有一个函数来显示和隐藏相关的 div,而不是每个链接的函数(js 中的 cmets 解释了我所做的事情):

var divs = document.getElementsByClassName('details_object'); // get all the detail divs
var buttons = document.getElementsByTagName('a'); // get all the links

for (var i = 0, len = buttons.length; i < len; i++) {
  buttons[i].addEventListener("click", function(e) { // bind your click to the buttons (pass the event into the function)
    e.preventDefault(); // stop the default click event of the anchor

    for (var j = 0; j < divs.length; j++) {
      if (divs[j].id === e.currentTarget.hash.substr(1)) { // compare the id of the div with the hash value of the link href (minus the #)
        divs[j].style.display = 'block'; // if they match - show the div
        buttons[j].classList.add('highlight');
      } else {
        divs[j].style.display = 'none'; // if they don't match - hide the div
        buttons[j].classList.remove('highlight');
      }
    }
  });
};
.highlight {
  background: green;
}
<header class="container">
  <nav class="navbar">
    <a id="1" href="#description">Description</a>
    <a id="2" href="#benefits">Benefits</a>
  </nav>
</header>

<div class="details">
  <div class="details_object" id="description" style="display: none">
    description
    <p> <span></span> Lorem ipsum dolor sit, amet consectetur adipisicing elit. Illo, dolorem. </p>
    <p> <span></span> Lorem ipsum dolor sit, amet consectetur adipisicing elit. Illo, dolorem. </p>
  </div>

  <div class="details_object" id="benefits" style="display: none">
    benefits
    <p> <span></span> Lorem ipsum dolor sit, amet consectetur adipisicing elit. Illo, dolorem. </p>
    <p> <span></span> Lorem ipsum dolor sit, amet consectetur adipisicing elit. Illo, dolorem. </p>
  </div>
</div>

【讨论】:

  • 还有一件事。我想在单击“a”标签时更改背景和颜色。我试图在 "divs[j].style.display ='block'" 行之后添加这段代码:buttons[i].classList.add('bckgrnd');但它不起作用。我是否必须为此创建一个新函数,或者我只是在错误的地方编写它?谢谢!! :)
  • 查看编辑 - 你想使用j(不是i),上面假设你的链接与你的div的顺序相同,如果不是,你需要循环你的按钮删除类,然后将类添加到currentTarget
  • 再次感谢您的回答。我编辑了我的代码,但它似乎不起作用。我的链接按钮和我的 div 的顺序相同。如果它保持这样也没什么大不了的,只是为了学习目的,我很好奇我错过了什么。
  • @Steve94Bp 您能否就新问题提出一个新问题,以便我们可以看到您更改的代码是如何变化的 - 可能是您有更多链接 - 正如您在链接,您可能需要给与 div 匹配的链接一个类并使用getElemntsByClassName(就像我为 div 做的那样)
【解决方案2】:

您可以使用 Javascript 的 innerHTML 属性使其更加优化和简单。您可以通过here了解更多信息。

function myFunction1 (num) {
    document.getElementById("description").innerHTML= "Description paragraph";
}

function myFunction2 (num) {
    document.getElementById("description").innerHTML= "Benefits paragraph";    
}
function myFunction (button) {
    var x = button.id;
    switch (x) {
        case '1':
            myFunction1(x);
            break;
        case '2':
            myFunction2(x);
            break;
        default:
            return false;
    }
}
var buttons = document.getElementsByTagName('a');
for (var i = 0, len = buttons.length; i < len; i++) {
    buttons[i].onclick = function (){
        myFunction (this);
    }};
<header class="container">
    <nav class="navbar">
        <a id="1">Description</a>
        <a id="2">Benefits</a>        
    </nav> 
</header>

<div class="details">

    <div class="details_object"  id="description"/>

    <div class="details_object"  id="benefits" />
       
 </div>

【讨论】:

    猜你喜欢
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2023-03-17
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多