Link 同名 classes 这样当一个被点击时另一个被给予一个 class

Link simillary name classes so that when one is clicked the other is given a class

基本上,我是在寻求一种优化此代码的方法。我想将它缩减为几行,因为它对每次点击绑定都做同样的事情。

    $("#arch-of-triumph-button").click(function(){
        $("#arch-of-triumph-info").addClass("active-info")
    });
    $("#romanian-athenaeum-button").click(function(){
        $("#romanian-athenaeum-info").addClass("active-info")
    });
    $("#palace-of-parliament-button").click(function(){
        $("#palace-of-parliament-info").addClass("active-info")
    });

有没有办法将 "arch-of-triumph"、"romanian-athenaeum"、"palace-of-parliament" 存储到数组中,然后将它们拉出到单击绑定中?我在想也许有些串联?

$("+landmarkName+-button").click(function(){
    $("+landmarkName+-info").addClass("active-info")
});

这样的事情有可能吗? 预先感谢您的所有回答。

编辑:这是完整的 HTML。

        <div class="landmark-wrapper">
            <div class="page-content landmark">
                <div class="heading span-after">
                    <span>Arch of Triumph</span>
                </div>
                <div class="landmark-button" id="arch-of-triumph-button"></div>                 
            </div>
        </div>
        <div class="landmark-wrapper">
            <div class="page-content landmark">
                <div class="heading span-after">
                    <span>Romanian Athenaeum</span>
                </div>
                <div class="landmark-button" id="romanian-athenaeum-button"></div>                  
            </div>
        </div>


----------------------------------------------------------

        <div class="landmarks-info-wrapper">
            <div class="landmark-info" id="arch-of-triumph-info">
                <div class="info-landmark section">
                    <span class="landmark-title">Arch of Triumph</span>
                    <span class="landmark-coord">44°28′1.99″N 26°4′41.06″E</span>
                </div>
            </div>
            <div class="landmark-info" id="romanian-athenaeum-info">
                <div class="info-landmark section">
                    <span class="landmark-title">The Romanian Athenaeum</span>
                    <span class="landmark-coord">44.4413°N 26.0973°E</span>

                </div>
            </div>

因为每个 .landmark-button 看起来和它的相关 .landmark-info 顺序相同,你可以把两个集合放在一个数组中,然后当点击其中一个时,只需要找到具有另一个数组中的相同索引:

const buttons = [...$('.landmark-button')];
const infos = [...$('.landmark-info')];
$(".landmark-button").click(function() {
  const i = buttons.indexOf(this);
  $(infos[i]).addClass('active-info');
});

这根本不依赖于 ID - 随意将它们从您的 HTML 中完全删除以进行整理,因为它们现在没有任何用途,因为它们不再被用作 selectors.

实时片段:

const buttons = [...$('.landmark-button')];
const infos = [...$('.landmark-info')];
$(".landmark-button").click(function() {
  const i = buttons.indexOf(this);
  $(infos[i]).addClass('active-info');
});
.active-info {
  background-color: yellow;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="landmark-wrapper">
  <div class="page-content landmark">
    <div class="heading span-after">
      <span>Arch of Triumph</span>
    </div>
    <div class="landmark-button" id="arch-of-triumph-button">click</div>
  </div>
</div>
<div class="landmark-wrapper">
  <div class="page-content landmark">
    <div class="heading span-after">
      <span>Romanian Athenaeum</span>
    </div>
    <div class="landmark-button" id="romanian-athenaeum-button">click</div>
  </div>
</div>


----------------------------------------------------------

<div class="landmarks-info-wrapper">
  <div class="landmark-info" id="arch-of-triumph-info">
    <div class="info-landmark section">
      <span class="landmark-title">Arch of Triumph</span>
      <span class="landmark-coord">44°28′1.99″N 26°4′41.06″E</span>
    </div>
  </div>
  <div class="landmark-info" id="romanian-athenaeum-info">
    <div class="info-landmark section">
      <span class="landmark-title">The Romanian Athenaeum</span>
      <span class="landmark-coord">44.4413°N 26.0973°E</span>

    </div>
  </div>


较旧的答案,不知道 HTML:您可以提取单击按钮的 ID,切掉它的 button 部分,然后 select 它与 -info:

$(".landmark-button").click(function() {
    const infoSel = this.id.slice(0, this.id.length - 6) + 'info';
    $(infoSel).addClass('active-info');
  });

虽然 HTML 可能会有更优雅的解决方案。

假设您无法修改 HTML 标记(在这种情况下使用 CSS 类 会更干净),您的问题的解决方案如下如下所示:

// Assign same click handler to all buttons
$("#arch-of-triumph-button, #romanian-athenaeum-button, #palace-of-parliament-button")
.click(function() {

  // Extract id of clicked button
  const id = $(this).attr("id");

  // Obtain corresponding info selector from clicked button id by replacing
  // last occurrence of "button" pattern with info.
  const infoSelector = "#" + id.replace(/button$/gi, "info");

  // Add active-info class to selected info element
  $(infoSelector).addClass("active-info");
});