【问题标题】:Why is onclick for the first button in a form triggered when I hit ENTER key (and no keyCode in event)?为什么当我按下 ENTER 键时触发表单中第一个按钮的 onclick(并且事件中没有 keyCode)?
【发布时间】:2020-06-04 09:55:53
【问题描述】:

为什么当我按下 ENTER 键时会触发表单中第一个按钮的 onclick?我试图弄清楚为什么 onclick 是由 ENTER 键触发的,然后如果它是实际的鼠标/点击按钮单击则让函数继续执行,或者如果它是 ENTER 键则让函数忽略按键。

我尝试检查 event.keyCode(传递到 javascript 函数),但它未定义。

实际上似乎设置的唯一属性是 event.isTrusted 但不存在其他属性。

编辑:创建新的演示代码以更好地解释我遇到的问题...

这是解决问题的 js:https://jsfiddle.net/Ld142qx3/24/

当您将光标放在 Quantity 2 输入框(第二个框)并单击 Enter 时,它会为 Quantity 1 输入框前面的第一个 LESS 按钮触发 onclick 事件。

没有通过事件传入的keyCode属性来识别onclick实际上是由鼠标点击触发还是由ENTER键触发。

我原来的测试代码HTML是:

<form onsubmit="return false;">
  Quantity 1: <button id="b1-less" onclick="return b1Less(this.id, event);">less</button>
  <input type="text" id="q1" value="10" size="10">
  <button id="b1-more" onclick="return b1More(this.id, event);">more</button>
  <br>
  Quantity 2: <button id="b2-less" onclick="return b2Less(this.id, event);">less</button>
  <input type="text" id="q2" value="5" size="10">
  <button id="b2-more" onclick="return b2More(this.id, event);">more</button>
</form>

我原来的 javascript 是:

function b1Less(_id, _event) {
  alert(_event.keyCode);
  _val = parseInt(document.getElementById('q1').value);
  _val = _val - 1;
  document.getElementById('q1').value = _val;
  return false;
}
function b1More(_id, _event) {
  _val = parseInt(document.getElementById('q1').value);
  _val = _val + 1;
  document.getElementById('q1').value = _val;
  return false;
}

function b2Less(_id, _event) {
  _val = parseInt(document.getElementById('q2').value);
  _val = _val - 1;
  document.getElementById('q2').value = _val;
  return false;
}
function b2More(_id, _event) {
  _val = parseInt(document.getElementById('q2').value);
  _val = _val + 1;
  document.getElementById('q2').value = _val;
  return false;
}

【问题讨论】:

  • 您为什么期望在click 事件上定义keyCode?尝试将 onkeyup="doClickMeButton(event, this.id)" 添加到您的 input 中,您将看到 keyCode 值...
  • @jsherk 我已经上传了你可以检查的答案,只是好奇为什么会出现点击我按钮你想要实现什么功能
  • @Adityatoke 我刚刚重新创建了新的演示代码,可以更好地显示我遇到的问题。我删除了 CLICK ME 按钮。
  • @Nick ENTER 键导致 onclick 触发,但没有 keyCode 属性来确定它是通过鼠标单击还是 ENTER 键触发的。我创建了新的演示代码以更好地显示问题。
  • @jsherk 你可以查看我的答案,如果它解决了你的问题,请告诉我

标签: javascript html


【解决方案1】:

您的问题是表单内的按钮类型默认为"submit" 按钮(请参阅spec),并且当隐式提交表单时(当您在输入字段中按ENTER 时会发生这种情况,表单中的第一个"submit" 按钮也触发了其onclick 事件处理程序(请参阅spec)。将您的按钮更改为type="button" 可以解决此问题:

function b1Less(_id, _event) {
  _val = parseInt(document.getElementById('q1').value);
  _val = _val - 1;
  document.getElementById('q1').value = _val;
  return false;
}

function b1More(_id, _event) {
  _val = parseInt(document.getElementById('q1').value);
  _val = _val + 1;
  document.getElementById('q1').value = _val;
  return false;
}

function b2Less(_id, _event) {
  _val = parseInt(document.getElementById('q2').value);
  _val = _val - 1;
  document.getElementById('q2').value = _val;
  return false;
}

function b2More(_id, _event) {
  _val = parseInt(document.getElementById('q2').value);
  _val = _val + 1;
  document.getElementById('q2').value = _val;
  return false;
}
<form onsubmit="return false;">
  Quantity 1: <button type="button" id="b1-less" onclick="return b1Less(this.id, event);">less</button>
  <input type="text" id="q1" value="10" size="10">
  <button type="button" id="b1-more" onclick="return b1More(this.id, event);">more</button>
  <br> Quantity 2: <button type="button" id="b2-less" onclick="return b2Less(this.id, event);">less</button>
  <input type="text" id="q2" value="5" size="10">
  <button type="button" id="b2-more" onclick="return b2More(this.id, event);">more</button>
</form>

【讨论】:

    【解决方案2】:

    检查doClickMeButton 函数事件是鼠标事件,鼠标事件没有键盘绑定细节。
    您可以在input 标签上绑定基于键盘的事件。 我已经提到了下面的代码,它的行为与您想要的相同。

    function doClickMeButton() {
      alert("I am called");
    }
    
    function doMoreLess(_id) {
      alert("clicked on " + _id);
      return false;
    }
    
    function myFunction(event) {
      var x = event.which || event.keyCode;
      if (x === 13) {
        console.log(event.which, "which"), console.log(event.keyCode, "keycode");
        doClickMeButton();
      }
    }
     <form>
     
             // first thing I dont know why you need this button
            <button id="my-button"
           
            onclick="">CLICK ME</button>
          
            <br>
            Enter something in the input textbox below, and hit the ENTER key and notice that:<br>
            &nbsp;&nbsp;(1) keyCode is undefined, and<br>
            &nbsp;&nbsp;(2) ENTER fires the onclick action of the first element with an onclick in it.
            <br>
          
            <button id="less" onclick="return doMoreLess(this.id);">
            less
            </button>
            <input type="text" size="10"  onkeypress="myFunction(event)">
            <button id="more" onclick="return doMoreLess(this.id);">
            more
            </button>
          </form>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-17
      • 2019-06-02
      • 1970-01-01
      • 2015-01-24
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      • 2023-02-03
      相关资源
      最近更新 更多