【问题标题】:add OnClick event on a div在 div 上添加 OnClick 事件
【发布时间】:2020-05-19 06:30:25
【问题描述】:

我正在尝试添加一个 div 中的按钮事件。

HTML:

<template id="modele-panier" type="text/AhuntsicModele">
  <div class="dialog-item">
    <table>
      <tr>
        <td>
          <img src={cheminImage} alt="">
        </td>
        <td>
          <h2>Article : {libelleProduit}</h2>
          <p>Qte : {qteProduit} prix : {prixProduit}$</p>
        </td>  
        <div class="supp">
          <td>
            <a href="#" id="{libelleProduit}">Supprimer </a>
          </td>
        </div>
      </tr>
    </table>
  </div>
</template>

控制器.js

document.addEventListener('click', function (e) {
  if (e.target && e.target.matches('button')) {
    controleur.ajouterPanier(e.target.id);
  } else if (e.target && e.target.matches('#main')) {
    controleur.loadCatalogue();
  } else if (e.target && e.target.matches('#getBMW')) {
    controleur.loadBMW();
  } else if (e.target && e.target.matches('#getAudi')) {
    controleur.loadAudi();
  } else if (e.target && e.target.matches('#getMercedes')) {
    controleur.loadMercedes();
  } else if (e.target && e.target.matches('#icone_compte')) {
    controleur.creationCompte();
  }  // THIS EVENT RIGHT HERE :
  else if (event.target.matches('supp')) { 
    alert(e.target.id)
    controleur.supprimerItem();
  }
});

我无法将事件添加到 div 类 supp 所有其他都工作正常,因为我没有为其他类使用 div 类。 谢谢

【问题讨论】:

  • event 未定义,因为您在函数中将其称为 e

标签: javascript html events eventhandler


【解决方案1】:

你可以用这个

const div = document.getElementsByClassName("supp");

  else if (div[0]!=undefined) { 
    alert(e.target.id)
    controleur.supprimerItem();
  }

希望对你有帮助

【讨论】:

  • 非常感谢这个工作编辑:这个工作但 (div[0]!=undefined) 现在影响了我的所有页面,它试图在我点击的所有东西上应用这个方法
  • 它的作用是找到 div 类名称 supp,如果该类存在,则向其添加侦听器事件,即无论您在文档中的哪个位置单击它都会执行此操作。查看您的代码,您希望仅在单击确切的 div 时发生这种情况,您可以在 if 部分执行 e.target.className.contains("supp") 以使其工作
【解决方案2】:

如果我理解正确,您希望您的控制器逻辑能够检测和处理具有 supp 类的元素上的点击事件。

要以最少的代码更改来实现这一点,您可以通过classList 接口执行以下操作:

document.addEventListener('click', function(e) {
  
  /* Existing code removed for bervity */
  
  /* Use classList.contains method to check if target element has supp class */
  if (event.target.classList.contains('supp')) {
    alert(e.target.id)
    controleur.supprimerItem();
  }

});
<table>
  <tr>
    <td><img src="https://via.placeholder.com/150" alt=""></td>
    <td>
      <h2>Article : {libelleProduit}</h2>
      <p>Qte : {qteProduit} prix : {prixProduit}$</p>
    </td>
    <div class="supp">
      <td><a href="#" id="foo">Supprimer </a></td>
    </div>
  </tr>

</table>

我假设点击处理程序的目标是动态添加到 DOM 的元素(这就是为什么您在点击处理程序内部运行 if/else if 检查的原因?) - 这种逻辑的另一种方法可能给你更多的灵活性是通过类似 CSS 的选择器和 querySelector() 方法查询 DOM:

document.addEventListener('click', function(e) {
  
  /* Existing code removed for bervity */
  
  /* Query document during click for first .supp relative to table */
  const suppDiv = document.querySelector("table .supp")
  if(suppDiv) {
    alert('clicked .supp')
  }

});
<table>
  <tr>
    <td><img src="https://via.placeholder.com/150" alt=""></td>
    <td>
      <h2>Article : {libelleProduit}</h2>
      <p>Qte : {qteProduit} prix : {prixProduit}$</p>
    </td>
    <div class="supp">
      <td><a href="#" id="foo">Supprimer </a></td>
    </div>
  </tr>

</table>

希望有帮助!

【讨论】:

  • 正是我想要做的事情,但我无法在该 div 上放置事件处理程序我尝试了你的 classList,但它也没有用仍然感谢
  • 这很奇怪 - 刚刚用涉及querySelector() 的第二种方法更新了答案。这有帮助/有意义吗?
【解决方案3】:

您正在尝试使用函数参数event,该函数未在您的函数中调用。您在函数中将参数命名为 e

另外,.matches() 会根据选择器字符串检查元素是否通常被定位。这是您通常使用document.querySelector() 来定位元素的方法。所以supp应该改成.supp

因此,当您将代码更改为:

} else if (e.target.matches('.supp')) { 
  controleur.supprimerItem();
}

甚至:

} else if (e.target && e.target.matches('.supp')) { 
  controleur.supprimerItem();
}

就像你的其他 if 语句一样。

这是一个 sn-p,表明此代码应按预期工作:

document.addEventListener("click", function (e) {
  if (e.target && e.target.matches(".supp")) {
    alert("It works");
  }
});
.supp {
  width: 100px;
  height: 100px;
  background-color: blue;
  color: white;
  display: flex;
  justify-content: center;
  align-items: center;
  cursor: pointer;
}
&lt;div class="supp"&gt;Click me&lt;/div&gt;

【讨论】:

  • 尝试在 if 语句后添加alert('It works');。我认为controleur.supprimerItem() 那时不起作用。您是否在控制台中遇到任何错误?
  • 请检查我的代码 sn-p 以获得概念证明@Anasde。
猜你喜欢
  • 2012-10-08
  • 1970-01-01
  • 2022-09-26
  • 2013-01-18
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多