2

我正在修复 jsp 页面中的一个错误,其中即使在第一次打开页面然后按下 Enter 键时使用onkeypress事件定义了一个函数以单击特定按钮(实际上它是具有与之关联的属性的按钮的图像)onclick它抛出一个错误。

当我调试代码时,我发现实际上同时进行了两个调用。即第一个具有onclick属性的按钮也被单击。

这里只是一个示例代码:

<html>
<head>
</head>
<body>
<div onkeypress =handleEnter()>
name <input  type="text" src='Create.gif' >
</br>
<input  type="image" src='Create.gif' onclick="alert('not done')">
<input  type="image" src='Create.gif' onclick="alert('done')">
</div>
</body>
<script>
function handleEnter()
{
if(window.event.keyCode==13)
{
alert('nothing');
event.cancelBubble=true;
}
}
</script>
</html>

在按下回车键时,两个函数都被调用。

4

2 回答 2

4

以下可能会起作用。通过阻止按键的默认操作,它应该阻止浏览器触发标准的“表单提交”——这就是我认为正在发生的事情。

function handleEnter(e)
{
  e || (e = window.event); /// support for both ie and non-ie browsers
  if(e.keyCode==13)
  {
    alert('nothing');
    // old ie support
    e.cancelBubble = true;
    e.returnValue = false;
    // non-ie
    e.preventDefault && e.preventDefault();
    e.stopPropagation && e.stopPropagation();
  }
}

您必须记住,如果您在整个页面上阻止默认输入,它将停止它在 textareas 和其他可能使用输入的地方工作。如果这是一个问题,您可以决定是否阻止默认操作,具体取决于:

var elm = e.srcElement || e.target;

elm应该包含事件的触发元素。scrElement适用于旧版 IE,target适用于非 IE 浏览器。例如,您可以使用它在达到阻止默认值之前使代码短路。

if ( elm.nodeName == 'textarea' ) return;

但是,我没有 IE8 来测试它,但考虑到以下链接,它可能会起作用:

http://support.microsoft.com/kb/298498

于 2013-10-03T08:56:59.583 回答
0

我知道这是一个老问题,但我没有找到任何其他问题/答案,而且我在按钮上遇到了同样的问题。

但是由于某种原因,当我查看传递给 javascript 函数的“事件”时,没有传入 keyCode,所以我无法区分按下了哪个键。仅供参考,“事件”只是传入 isTrusted 属性(没有别的),但这是另一个问题......

我的解决方案是,我只是在所有其他元素的前面添加了一个按钮,onclick="return false;"这样style="display:none;"ENTER 键会影响这个元素并且基本上被忽略,并且是不可见的。使用 onclick='return false;' 表格将不会提交。使用 onclick='return true;' 表格将被提交。

<button id='prevent-onclick-on-enter' style='display:none;' onclick='return false;'/>
<input  type="image" src='Create.gif' onclick="alert('not done')">
<input  type="image" src='Create.gif' onclick="alert('done')">

第二个答案 所以这可能是一个稍微不同的问题,只涉及按钮(而不是输入),但这对于一些不知道这一点的人(比如我)来说可能很好知道......当你在表单中有一个按钮时,它默认键入“提交”,这意味着表单中的第一个按钮将通过 ENTER 键触发其 onclick 事件。为了防止这种情况发生,只需将 type="button" 分配给按钮,输入键将不再影响它。

于 2020-06-01T23:26:25.857 回答