【问题标题】:How to make only the .text of a div clickable to trigger an event?如何仅使 div 的 .text 可点击以触发事件?
【发布时间】:2019-11-20 02:30:09
【问题描述】:

我有一些带有 eventListener 的 DIV,用于点击。出于设计原因,这些 DIV 具有使用 CSS 分配的边距,并且有些具有换行符。然而,不知何故,单词周围的区域也是可点击的并触发事件(最近的单词)——我不想要的。那么,除了显示的 DIV 本身的文本之外,我怎样才能防止任何内容都可以点击,例如“趋势”?

    <div id="wordbox">
        <div id="ai"><h2>artificial intelligence</h2></div>
        <div id="tr"><h4>trends</h4><br><br></div>
        <div id="dm"><h3>data mining</h3></div>
    </div>
  var wb = document.querySelectorAll("#wordbox > div");
  Array.from(wb).forEach(function(element, index) {
      element.addEventListener("click", function() {
        alert(element.id);
      });
  });
#ai{
    margin-left: 2.5%;
    margin-right: 1.0%;
} 

【问题讨论】:

    标签: javascript html css dom-events


    【解决方案1】:

    您将点击事件添加到div,它占用了自己的空间,因此如果您想将点击事件添加到内部文本元素,那么您应该使用element.children[0],例如,

      element.children[0].addEventListener("click", function() {
        alert(element.id);
      });
    

    和sn-p如下,

    var wb = document.querySelectorAll("#wordbox > div");
      Array.from(wb).forEach(function(element, index) {
          element.children[0].addEventListener("click", function() {
            alert(element.id);
          });
      });
    #ai{
        margin-left: 2.5%;
        margin-right: 1.0%;
    } 
    <div id="wordbox">
     <div id="ai"><h2>artificial intelligence</h2></div>
     <div id="tr"><h4>trends</h4><br><br></div>
     <div id="dm"><h3>data mining</h3></div>
    </div>

    【讨论】:

    • 嗯,我试过你的代码,但它并没有改变任何东西,单词周围仍有可点击的区域。 children[0] 非常有意义。是否还有其他原因导致了这种影响?
    • @Rome,您想单独点击文本元素,例如trends 还是&lt;h4&gt; trends &lt;/h4&gt;?根据我的解决方案,它现在正在处理&lt;h4&gt; trends &lt;/h4&gt; ..
    • 纯文本。
    • @Rome,您只能在 HTML 元素上使用事件监听器,如果您不想更改 CSS,请使用其他解决方案中提到的 css 更改。
    • @Rome,如果有可能修改您的HTML,那么您可以像这样使用codepen.io/manmur/pen/GRRzPmL
    【解决方案2】:

    同样的想法,但稍微改变一下css

    var wb = document.querySelectorAll("#wordbox > div");
    Array.from(wb).forEach(function (element, index) {
    		element.children[0].addEventListener("click", function () {
    		alert(element.id);
    	});
    });
    #ai{
        margin-left: 2.5%;
        margin-right: 1.0%;
    } 
    
    /* Make the texts not occupying the whole width */
    #wordbox h2,
    #wordbox h3,
    #wordbox h4 {
      display: inline-block;
      cursor: pointer;
    }
    <div id="wordbox">
    	<div id="ai"><h2>artificial intelligence</h2></div>
    	<div id="tr"><h4>trends</h4><br /><br /></div>
    	<div id="dm"><h3>data mining</h3></div>
    </div>

    【讨论】:

    • div &gt; * 完全破坏了我的布局。这是我的词框:#wordbox { visibility: block; background: transparent; position: absolute; align-self: center; height: 440px; min-width: 500px; max-width: 1650px; align-items: left; justify-content: left; } 但你似乎是对的:有些词占用了太多的宽度,甚至在换行符处扩大了可点击区域。对此我还能做些什么吗?
    • @Rome 新的更新怎么样?它只需要具体并且只影响标题标签。
    【解决方案3】:

    我首先将 div 替换为 span。 div 将始终采用容器元素的宽度。在不随意缩小 div 的情况下,使用 spans 更加简洁。然后稍微修改你的事件监听函数,它应该可以正常工作。

    <div id="wordbox">
        <h2><span id="ai">artificial intelligence</span></h2>
        <h4><span id="tr">trends</span></h4><br><br>
        <h3><span id="dm">data mining</span></h3></a>
    </div>
    
    var wb = document.querySelectorAll("span");
    wb.forEach(function(element) {
        element.addEventListener("click", function() {
          alert("clicked!!!");
        });
    });
    

    【讨论】:

    • 尝试了您的方法,但span 带回了单词周围的可点击区域,并且将children[0]div 一起使用是直截了当的恕我直言。不过,您对 EventListener 的更改是一个很好的简化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    相关资源
    最近更新 更多