如何将事件对象传递给Javascript函数?


75
<button type="button" value="click me" onclick="check_me();" />

function check_me() {
  //event.preventDefault();
  var hello = document.myForm.username.value;
  var err = '';

  if(hello == '' || hello == null) {
    err = 'User name required';
  }

  if(err != '') { 
     alert(err); 
     $('username').focus(); 
     return false; 
   } else { 
    return true; }
}

在Firefox中,当我尝试提交一个空值时,它将引发错误并将焦点重新设置为element。但是在IE中不会发生同样的事情,因为它会引发错误,并且单击“确定”并发布表单后(返回true)。

我如何避免这种情况?我当时想避免使用event.preventDefault(),但是我不确定如何使用此方法来执行此操作。我尝试通过checkme(event)..但是没有用。我正在使用原型js。

(我知道如何在Java语言中绑定.click函数时传递事件,而不是onclick使用Jquery在html ..中调用,但是我必须调试这段代码)

Answers:


28

尽管这是公认的答案,但下面的toto_tico答案更好:)

尝试使onclick js使用'return'以确保使用所需的返回值...

<button type="button" value="click me" onclick="return check_me();" />

1
并非完全符合我的要求。但是我会将其标记为已回答。谢谢。
TigerTiger

内联javascript现在很皱眉!
daniella

1
好,已经十岁了。另一个答案是更好的,我将带人们去那里……
Paul Dixon

205
  1. 将函数check_me的定义修改为:

     function check_me(ev) {
    
  2. 现在,您可以根据情况访问事件的方法和参数:

     ev.preventDefault();
    
  3. 然后,您必须在内联调用的onclick上传递参数:

     <button type="button" onclick="check_me(event);">Click Me!</button>
    

一个有用的链接来了解这一点。


完整示例:

<!DOCTYPE html>
<html lang="en">
  <head>
    <script type="text/javascript">
      function check_me(ev) {
        ev.preventDefault();
        alert("Hello World!")
      }
    </script>
  </head>
  <body>
    <button type="button" onclick="check_me(event);">Click Me!</button>
  </body>
</html>









替代方法(最佳做法):

尽管以上是问题的直接答案(将事件对象传递给内联事件),但是还有其他处理事件的方法可以使逻辑与表示分离

A.使用addEventListener

<!DOCTYPE html>
<html lang="en">
  <head>
  </head>
  <body>
    <button id='my_button' type="button">Click Me!</button>

    <!-- put the javascript at the end to guarantee that the DOM is ready to use-->
    <script type="text/javascript">
      function check_me(ev) {
        ev.preventDefault();
        alert("Hello World!")
      }
      
      <!-- add the event to the button identified #my_button -->
      document.getElementById("my_button").addEventListener("click", check_me);
    </script>
  </body>
</html>

B.隔离Javascript:

上面的两种解决方案都适合于小型项目,或者适用于棘手的快速而肮脏的解决方案,但是对于大型项目,最好将HTML与Javascript分开。

只需将这两个文件放在同一文件夹中:

  • example.html:
<!DOCTYPE html>
<html lang="en">
  <head>
  </head>
  <body>
    <button id='my_button' type="button">Click Me!</button>

    <!-- put the javascript at the end to guarantee that the DOM is ready to use-->
    <script type="text/javascript" src="example.js"></script>
  </body>
</html>
  • example.js:
function check_me(ev) {
    ev.preventDefault();
    alert("Hello World!")
}
document.getElementById("my_button").addEventListener("click", check_me);

1
我很好奇,如果使用addEventListener会如何?例如,它看起来像这样吗?buttonElement.addEventListener(“ click”,check_me(event))。
代码新手

2
具有.addEventListener('click', check_me);该事件的@CodeNovice自动作为第一个参数传递。因此,如果您像这样定义函数,check_me(e){...}则可以e在函数中使用事件而不会出现问题。有时人们会像这样构造它,但这不是必需的.addEventListener('click', (e) => check_me(e));
Alex L

2
问题,@ toto_tico的回答集中在我们所谓的“内联事件”上,其中事件处理程序定义为字符串,该字符串被解析并评估为函数调用(或其他有效的JavaScript)。您可以只编写一行,<button ... onclick="console.log("Hello world");">Click</button>然后将执行该行。您还可以定义两个函数,例如... onclick="check_me(event); another_func(event);"...是否确实要执行两个函数。除了关键字之外event,您还可以传递this对调用元素的引用。
亚历克斯L

-4

我将您的绑定更改为:

<button type="button" value="click me" onclick="check_me" />

然后,我将您的check_me()函数声明更改为:

function check_me() {   
  //event.preventDefault();
  var hello = document.myForm.username.value;
  var err = '';

  if(hello == '' || hello == null) {
    err = 'User name required';
  }

  if(err != '') { 
     alert(err); 
     $('username').focus(); 
     event.preventDefault(); 
   } else { 
    return true; }
}

您不能仅假设已定义“事件”。您的代码给了我这个运行时错误:“ ReferenceError:未定义事件”。示例代码:function awesome(){console.info(event); } awesome();
HoldOffHunger

@HoldOffHunger内联发生事件时,应该调用此函数。为什么在事件之外直接调用它。
安德鲁斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.