如何编写 "this" - 函数

How to write a "this" - Function

我想减少我的 Javascript 代码,可能使用变量或 "this"?为了一点点意图,代码太多了。

$("#Linkitem1").click(function() {
  $("#item1").fadeIn(2500);
  $("#item2").hide();
  $("#item3").hide();
  $("#Linkitem3").removeClass("active btn-warning");
  $("#Linkitem2").removeClass("active btn-warning");
  $("#Linkitem1").addClass("active btn-warning");

});


$("#Linkitem2").click(function() {
  $("#item2").fadeIn(2500);
  $("#item1").hide();
  $("#item3").hide();
  $("#Linkitem1").removeClass("active btn-warning");
  $("#Linkitem3").removeClass("active btn-warning");
  $("#Linkitem2").addClass("active btn-warning");

});


$("#Linkitem3").click(function() {
  $("#item3").fadeIn(2500);
  $("#item2").hide();
  $("#item1").hide();
  $("#Linkitem1").removeClass("active btn-warning");
  $("#Linkitem2").removeClass("active btn-warning");
  $("#Linkitem3").addClass("active btn-warning");


});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<main role="main">
  <div id="card-content" class="container">
    <div class="card border-warning text-center">
      <div class="card-header">
        <ul class="nav nav-pills card-header-pills">
          <li class="nav-item">
            <a id="Linkitem1" data-toggle="collapse" href="#item1" role="button" aria-expanded="true" aria-controls="collapseOne" title="" class="nav-link text-white btn-warning active">item1</a>
          </li>
          <li class="nav-item">
            <a id="Linkitem2" data-toggle="collapse" href="#item2" role="button" aria-expanded="true" title="" class="nav-link collapsed text-white">item2</a>
          </li>
          <li class="nav-item">
            <a id="Linkitem3" data-toggle="collapse" href="#item3" role="button" aria-expanded="true" title="" class="nav-link collapsed text-white">item3</a>
          </li>
        </ul>
      </div>

      <!--Content item1-->
      <div id="item1" class="animated fadeIn collapse show card-body" data-parent="#card-content">
        <h5 class="card-title">title for item 1</h5>
        <p class="card-text">content item 1.</p>
      </div>

      <!--content item 2-->
      <div id="item2" class="animated fadeIn collapse card-body" data-parent="#card-content">
        <h5 class="card-title">title item 2</h5>
        <p class="card-text">content item 2</p>

        <!--content 3-->
        <div id="item 3" class="collapse card-body" data-parent="#card-content">
          <h5 class="card-title">title item 3</h5>
          <p class="card-text">content item 3</p>
        </div>
      </div>
</main>

此代码有效。我点的是linkitem1的navigation,card-body里面就是item 1的内容,如果点linkitem2,可以看到item2的内容

如果可能的话,你可以使用那种方式。添加 class "Linkitem"nav-item 锚标签并添加 class "item" 含内容项

$(".Linkitem").click(function(){   
let dataId = $(".Linkitem").index(this);
$('.item:eq('+dataId+')').fadeIn(500);
$('.item:not(:eq('+dataId+'))').fadeOut(500);

$('.Linkitem:eq('+dataId+')').addClass("active btn-warning");
$('.Linkitem:not(:eq('+dataId+'))').removeClass("active btn-warning");

});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.0/jquery.min.js"></script>

<main role="main">
  <div id="card-content" class="container">
    <div class="card border-warning text-center">
      <div class="card-header">
        <ul class="nav nav-pills card-header-pills">
          <li class="nav-item">
            <a id="Linkitem1" class="Linkitem" data-toggle="collapse" href="#item1" role="button" aria-expanded="true" aria-controls="collapseOne" title="" class="nav-link text-white btn-warning active">item1</a>
          </li>
          <li class="nav-item">
            <a id="Linkitem2" class="Linkitem" data-toggle="collapse" href="#item2" role="button" aria-expanded="true" title="" class="nav-link collapsed text-white">item2</a>
          </li>
          <li class="nav-item">
            <a id="Linkitem3" class="Linkitem" data-toggle="collapse" href="#item3" role="button" aria-expanded="true" title="" class="nav-link collapsed text-white">item3</a>
          </li>
        </ul>
      </div>

      <!--Content item1-->
      <div id="item1" class="item animated fadeIn collapse show card-body" data-parent="#card-content">
        <h5 class="card-title">title for item 1</h5>
        <p class="card-text">content item 1.</p>
      </div>

      <!--content item 2-->
      <div id="item2" class="item animated fadeIn collapse card-body" data-parent="#card-content">
        <h5 class="card-title">title item 2</h5>
        <p class="card-text">content item 2</p>
</div>
        <!--content 3-->
        <div id="item3" class="item collapse card-body" data-parent="#card-content">
          <h5 class="card-title">title item 3</h5>
          <p class="card-text">content item 3</p>
        </div>
      </div>
</main>

您可以应用 for 循环,但您需要更改 class 上的属性 id。否则,您应该使用其他属性,例如 data-.

$(()=>{

  $(".item").each(function(){
      $(this).hide();
  });
          
  for (let i = 0; i < 3; i++){

      $(".Linkitem").eq(i).click(function(){
          $(".item").each(function(){
              $(this).hide();
          });
          $(".item").eq(i).fadeIn(2500); 

          $(".Linkitem").each(function(){
              $(this).removeClass("active btn-warning");
          });
          $(this).addClass("active btn-warning");  
      });
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a class='Linkitem otherclass'>Linkitem11111111</a> <br>
<a class='Linkitem otherclass'>Linkitem22222222</a> <br>
<a class='Linkitem otherclass'>Linkitem33333333</a> <br>

<br><br><br>
<div class='item other'>1 1 1 1 1 1 1</div>
<div class='item other'>2 2 2 2 2 2 2</div>
<div class='item other'>3 3 3 3 3 3 3</div>
   

这是一个使用 event.target 而不是 this(或 $(this))的解决方案。
JQuery 仍然用于 .fadeIn.hide,尽管这也可以在没有 JQuery 的情况下完成。

点击侦听器区分对 "link" 按钮的点击和所有其他点击,并循环遍历 item div,隐藏它们并仅显示 "active" 一个。

// Calls `changeActiveItem` when something is clicked
document.addEventListener("click", changeActiveItem);

// Defines a listener (with automatic access to the triggering event)
function changeActiveItem(event){
  const clickedElement = event.target; // `target` property holds the clicked element

  // Makes sure the clicked element is a link before proceeding
  if(!clickedElement.classList.contains("link")){
    return; // Function will stop here if a non-link element was clicked
  }   

  // Gets the item id stored in the link's "data-linked-item-id" attribute
  const linkedItemId = clickedElement.dataset["linkedItemId"]; // Magic name conversion

  // Deactivates and hides all items
  const items = document.getElementsByClassName("item");
  for(let item of items){
    item.classList.remove("active");
    item.classList.remove("btn-warning"); // This class currently has no effect
    $(item).hide(); // Hides item

    // Activates and animates the selected item
    if(item.id === linkedItemId){
      $(item).fadeIn(2500);
      item.classList.add("active");
      item.classList.add("btn-warning");
    }
  }
}
div{ margin-bottom: 15px; }
.item{ display: none; font-size: 3em; }
.active{ display: block; color: darkred; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="item1Link" class="link" data-linked-item-id="item1">activate item 1</button>
<div>
  <div id="item1" class="item active">Item 1</div>
</div>
<button id="item2Link" class="link" data-linked-item-id="item2">activate item 2</button>
<div>
  <div id="item2" class="item">Item 2</div>
</div>
<button id="item3Link" class="link" data-linked-item-id="item3">activate item 3</button>
<div>
  <div id="item3" class="item">Item 3</div>
</div>