将JavaScript的事件监听器绑定到分层目标

前端开发 2026-07-09


用于澄清布局的落地页卡片图片

在我们的落地页上,我们有标注特定类别的“卡片”,以及该类别下的一些具体项目。目标是把对面板本身的点击和对目标网页的点击区分开来(见下图)。

对整个卡片的点击,以及类别标题的点击都会触发一个弹出覆盖层。点击目标项将导航到相应的目标网页。

如何给图片分配一个事件监听器,使其忽略覆盖在其上的其他链接的点击?(在弄清楚怎么做之前,我还没有为JS指定ID或 CLASS以便定位。)

<div class="card">
  <div class="dark">
    <a href="https://pedalers.travel/pacific-islands-bicycle-tours-hawaii-tahiti-bora-bora.htm">
      <header><h2 class="title3">South Pacific Bike Tours</h2></header>
    </a>
    <a href="https://pedalers.travel/bicycling-tahiti-french-polynesia.htm">Tahiti</a>,
    <a href="https://pedalers.travel/samoa-bicycle-tour-samoa-cycling.htm">Samoa</a>,
    <a href="https://pedalers.travel/hawaii-bike-tours-big-island-dreams-cycling-tours.htm">Hawaii</a>
  </div>
  <a href="https://pedalers.travel/pacific-islands-bicycle-tours-hawaii-tahiti-bora-bora.htm">
    <img src="img/pedalers-homepage/cycling-on-raiatea-island.jpg"
         alt="cycling in French Polynesia" 
         title="island bicycling tours around the Pacific">
  </a>
</div>

解决方案

以下是对所建议方案的一个可行实现——从卡片本身委派点击事件。

我需要生成一些CSS来模拟你的卡片,但我没有修改HTML

const showOverlay = (href) => console.log(href);
document.querySelector('.card').addEventListener('click', (e) => {
  const link = e.target.closest('a');
  const header = e.target.closest('header');
  // Link in the header or with an image triggers overlay.
  // other links are followed
  if (link && !header && !link.querySelector('img')) return;
  e.preventDefault(); // stop the link
  showOverlay(link.href);
});
.card {
  position: relative;
  overflow: hidden;
  border-radius: 1rem;
  min-height: 500px;
  text-align: center;
}

.card>a {
  display: block;
  position: absolute;
  inset: 0;
  z-index: 1;
}

.card img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* text overlay */
.card .dark {
  position: relative;
  z-index: 2;
  padding: 1rem;
  color: white;
  background: rgba(0, 0, 0, 0.45);
}


.card a {
  color: inherit;
  text-decoration: none;
}


/* debug at SO */
.as-console-wrapper { z-index: 100 !important }
<div class="card">
  <div class="dark">
    <header>
      <h2 class="title3"><a href="https://pedalers.travel/pacific-islands-bicycle-tours-hawaii-tahiti-bora-bora.htm">South Pacific Bike Tours</a></h2>
    </header>
    <a href="https://pedalers.travel/bicycling-tahiti-french-polynesia.htm">Tahiti</a>,
    <a href="https://pedalers.travel/samoa-bicycle-tour-samoa-cycling.htm">Samoa</a>,
    <a href="https://pedalers.travel/hawaii-bike-tours-big-island-dreams-cycling-tours.htm">Hawaii</a>
  </div>
  <a href="https://pedalers.travel/pacific-islands-bicycle-tours-hawaii-tahiti-bora-bora.htm"><img src="https://pedalers.travel/img/pedalers-homepage/cycling-on-raiatea-island.jpg" alt="cycling in French Polynesia" title="island bicycling tours around the Pacific"></a>
</div>
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章