【问题标题】:Alert inner HTML of clicked button单击按钮的警报内部 HTML
【发布时间】:2019-06-23 02:08:14
【问题描述】:

我希望我的函数返回按钮内字符串的值,以便稍后用于其他内容。

我尝试(this).innerHTMLthis.innerHTML 提取按钮内部的字符串,然后在js中使用 HTML:

<button class="fonts" value="2" onclick="change((this).innerHTML)">Times New Roman</button><br>
<button class="fonts" value="1" onclick="change(this.innerHTML)">Calibri</button><br>
<button class="fonts" value="3" onclick="change(this.innerHTML)">Arial</button>

JS:

function change(){
  alert();
}

我希望它提醒“Times New Roman”或其他字体,但它提醒一个空白值。

【问题讨论】:

    标签: javascript html ecmascript-6 ecmascript-5


    【解决方案1】:

    试试

    function change(btn) {
      alert(btn.innerHTML);
    }
    <button onclick="change(this)">Times New Roman</button>
    <button onclick="change(this)">Calibri</button>
    <button onclick="change(this)">Arial</button>

    【讨论】:

    • @AliChbinou 这行得通,因为我只是将按钮 (this) 传递给 change 函数,最后将其 innerHTML 传递给警报函数(您的警报函数是空的,所以它不显示任何内容) .如果您以这种方式在 html onclick="change(this.innerHTML)"&gt;function change(text) { alert(text); } 中传递文本,它也应该可以工作。然而,我的解决方案一方面不会强迫您在 html 中重复 this.innerHTML 3 次,另一方面又是清晰和简单的。
    • @AliChbinou 你也不需要使用addEventListener 而不是onclick,你可以像我一样使用e.g. angular/vue.js 模板。所以你可以在html模板中调用JS函数,但是你不应该把整个函数体放到html中。
    【解决方案2】:

    您应该避免使用内联 on* 处理程序(onclickoninput 等),而应在脚本本身中使用事件侦听器来提醒元素的文本内容。

    检查并运行以下 代码片段,以获得我上面描述的实际示例:

    /* JavaScript */
    
    var btns = document.querySelectorAll(".fonts"); // retrieve all buttons
    
    //use forEach() to add a click event listener to each button
    btns.forEach(function (btn) {
      btn.addEventListener("click", function() {
        alert(this.innerHTML);
      });
    });
    <!-- HTML -->
    
    <button class="fonts" value="2">Times New Roman</button><br>
    <button class="fonts" value="1">Calibri</button><br>
    <button class="fonts" value="3">Arial</button>

    您可以使用 JavaScript ES6+ 来进一步缩短上述代码,如下所示:

    document.querySelectorAll(".fonts").forEach(btn => {
      btn.addEventListener("click", () => alert(btn.innerHTML));
    });
    &lt;button class="fonts" value="2"&gt;Times New Roman&lt;/button&gt;&lt;br&gt;&lt;button class="fonts" value="1"&gt;Calibri&lt;/button&gt;&lt;br&gt;&lt;button class="fonts" value="3"&gt;Arial&lt;/button&gt;

    NB 请注意,如果您使用 ES6+ 方法,您将需要使用像 Babel 这样的 JavaScript 编译器将您的 ES6+ 语法转换为向后兼容的 JavaScript 版本,以支持当前以及较旧的浏览器或环境。


    IE11 兼容性:

    如果您担心forEach() 方法的 IE11 兼容性,您可以使用简单的for loop,如下所示:

    /* JavaScript */
    
    var btns = document.querySelectorAll(".fonts"); // retrieve all buttons
    
    //use forEach() to add a click event listener to each button
    
    for(i=0; i < btns.length; i++) {
      btns[i].addEventListener("click", function() {
        alert(this.innerHTML);
      });
    }
    <!-- HTML -->
    
    <button class="fonts" value="2">Times New Roman</button><br>
    <button class="fonts" value="1">Calibri</button><br>
    <button class="fonts" value="3">Arial</button>

    【讨论】:

    • 请注意NodeList在IE 11中不支持forEach
    • 所以首先,我应该避免在 HTML 中使用 on* 处理程序,而是从现在开始使用 addEventListener?我见过 addEventListener 很多次,但我真的不知道它是如何工作的。我会记录自己的
    • 也感谢您的回答,我想我明白了(+/- forEach 部分)
    • @AndrewL64 但你知道为什么在 html 模板中不使用处理程序的好习惯,同时在 html 模板中使用处理程序是好习惯吗?双重标准?
    • @Kamil 这是不好的做法的主要原因之一是因为内联处理程序在全局范围内运行事件。您可以查看SO thread 中的答案,以获得更深入的解释,并强调为什么这是一种不好的做法的其他原因。干杯队友:)
    【解决方案3】:

    使用像onclick="whatever()" 这样的内联事件侦听器被广泛认为是不好的做法。

    相反,使用 document.querySelectorAll(selector) 从 DOM 获取按钮集合,并在 for...of 循环中的每个按钮上使用 addEventListener()

    let buttons = document.querySelectorAll('button.fonts')
    
    for (const button of buttons) {
      button.addEventListener('click', function() { alert(this.textContent); })
    }
    <button class="fonts" value="2">Times New Roman</button><br>
    <button class="fonts" value="1">Calibri</button><br>
    <button class="fonts" value="3">Arial</button>

    【讨论】:

      【解决方案4】:

      您实际上并没有将innerHTML 传递给函数。 JS 应该看起来更像这样:

      function change(font){
          alert(font);
      }
      

      HTML 看起来像这样:

      <button onclick="change(this.innerHTML)">Times New Roman</button>
      <button onclick="change(this.innerHTML)">Calibri</button>
      <button onclick="change(this.innerHTML)">Arial</button>
      

      这是一个实际操作:JSFiddle


      如果你想要一个更简单的实现,你可以这样做:

      JS:

      function change(e){
              e = e || window.event;
          e = e.target || e.srcElement;
          alert(e.innerHTML);
      }
      

      HTML:

      <button onclick="change()">Times New Roman</button>
      <button onclick="change()">Calibri</button>
      <button onclick="change()">Arial</button>
      

      JSFiddle Demo

      【讨论】:

      • 您好!第二个一点也不简单 :') 我还在学习 JS,这看起来很复杂 x) 但是,我使用了您之前编写的代码并在括号之间添加了(字体),它起作用了!你能解释一下为什么会这样吗?
      猜你喜欢
      • 1970-01-01
      • 2010-11-23
      • 2018-05-01
      • 2016-09-14
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-15
      相关资源
      最近更新 更多