如何使用 OnClick 事件调用 JS 函数

Posted

技术标签:

【中文标题】如何使用 OnClick 事件调用 JS 函数【英文标题】:How to Call a JS function using OnClick event 【发布时间】:2014-02-24 00:12:45 【问题描述】:

我正在尝试调用我在标题中添加的 JS 函数。 请在下面找到显示我的问题场景的代码。 注意:我无权访问我的应用程序中的正文。 每次我单击带有id="Save" 的元素时,它只调用f1() 而不是fun()。我怎样才能让它呼叫我的fun()? 请帮忙。

  <!DOCTYPE html>
  <html>
  <head>

  <script>

   document.getElementById("Save").onclick = function fun()
    
     alert("hello");
     //validation code to see State field is mandatory.  
       

    function f1()
    
       alert("f1 called");
       //form validation that recalls the page showing with supplied inputs.    
    

  </script>
  </head>
  <body>
  <form name="form1" id="form1" method="post">
            State: 
            <select id="state ID">
               <option></option>
               <option value="ap">ap</option>
               <option value="bp">bp</option>
            </select>
   </form>

   <table><tr><td id="Save" onclick="f1()">click</td></tr></table>

   </body>
   </html>

【问题讨论】:

f1 根本不应该被调用,因为你有一个运行时错误。另见Why does jQuery or a DOM method such as getElementById not find the element?。但无论如何,func 不会运行,因为您没有在任何地方调用它。 【参考方案1】:

我同意@George。如果我们要通过 javascript 添加或绑定事件监听器到 HTML 元素,我们需要在 DOM 加载后执行。为此,我们可以在 JavaScript 中使用 window.onload() 函数。

<script>
   window.onload = function() 
      document.getElementById("Save").onclick = function fun() 
        alert("hello");
         
   
</script>

另一种方法是在 HTML 中使用 onclick 事件处理程序,如下代码所示:

<div onclick="myFunction()"></div>
<script>
   function myFunction() 
      alert("Hello");
   
</script>

注意:不建议同时使用这两种方法。因为它会导致一次单击调用两个函数。这很烦人。

【讨论】:

【参考方案2】:

您也可以使用iife 使用匿名javascript 函数来执行此操作。 请注意,这被认为是一种不好的做法,尽管在​​极少数情况下没有其他选择。

...
<span onclick="(function()  // function code here )())">click me!</span>
...

【讨论】:

【参考方案3】:

使用onclick 属性或将函数应用于您的JS onclick 属性将删除您在&lt;head&gt; 中的onclick 初始化。

您需要做的是添加按钮上的点击事件。为此,您需要 addEventListenerattachEvent (IE) 方法。

<!DOCTYPE html>
<html>
<head>
    <script>
        function addEvent(obj, event, func) 
            if (obj.addEventListener) 
                obj.addEventListener(event, func, false);
                return true;
             else if (obj.attachEvent) 
                obj.attachEvent('on' + event, func);
             else 
                var f = obj['on' + event];
                obj['on' + event] = typeof f === 'function' ? function() 
                    f();
                    func();
                 : func
            
        

        function f1()
        
            alert("f1 called");
            //form validation that recalls the page showing with supplied inputs.    
        
    </script>
</head>
<body>
    <form name="form1" id="form1" method="post">
        State: <select id="state ID">
        <option></option>
        <option value="ap">ap</option>
        <option value="bp">bp</option>
        </select>
    </form>

    <table><tr><td id="Save" onclick="f1()">click</td></tr></table>

    <script>
        addEvent(document.getElementById('Save'), 'click', function() 
            alert('hello');
        );
    </script>
</body>
</html>

【讨论】:

【参考方案4】:

我在你的函数之前删除了你的document.getElementById("Save").onclick =,因为它是一个已经在你的按钮上调用的事件。我还必须通过 onclick 事件分别调用这两个函数。

     <!DOCTYPE html>
      <html>
      <head>
      <script>
       function fun()
        
         alert("hello");
         //validation code to see State field is mandatory.  
           
        function f1()
        
          alert("f1 called");
           //form validation that recalls the page showing with supplied inputs.    
        
      </script>
      </head>
      <body>
      <form name="form1" id="form1" method="post">
                State: 
                <select id="state ID">
                   <option></option>
                   <option value="ap">ap</option>
                   <option value="bp">bp</option>
                </select>
       </form>

       <table><tr><td id="Save" onclick="f1(); fun();">click</td></tr></table>

   </body>
   </html>

【讨论】:

【参考方案5】:

您正试图在加载元素之前附加事件侦听器函数。将 fun() 放在 onload 事件侦听器函数中。在此函数中调用f1(),因为onclick 属性将被忽略。

function f1() 
    alert("f1 called");
    //form validation that recalls the page showing with supplied inputs.    

window.onload = function() 
    document.getElementById("Save").onclick = function fun() 
        alert("hello");
        f1();
        //validation code to see State field is mandatory.  
    

JSFiddle

【讨论】:

我无权访问正文中的代码。我的应用程序与上面的代码不同。无论如何现在,即使按照您的建议,它也只调用 fun() 而不是 f1()。 @VineethVarma 然后请发布您使用过的代码。 @VineethVarma 已编辑。【参考方案6】:

您可以使用 addEventListener 添加任意数量的侦听器。

  document.getElementById("Save").addEventListener('click',function ()
    
     alert("hello");
     //validation code to see State field is mandatory.  
      ); 

还要在元素后添加script 标记,以确保在脚本运行时加载Save 元素

您可以在加载 dom 时调用它,而不是移动脚本标签。然后你应该把你的代码放在

document.addEventListener('DOMContentLoaded', function() 
    document.getElementById("Save").addEventListener('click',function ()
    
     alert("hello");
     //validation code to see State field is mandatory.  
      ); 
);

example

【讨论】:

【参考方案7】:

内联代码的优先级高于其他代码。要调用你的其他函数 func() 从 f1() 调用它。

在你的函数中,添加一行,

function fun () 
// Your code here


function f1()
    
       alert("f1 called");
       //form validation that recalls the page showing with supplied inputs.    

fun ();

    

重写整个代码,

 <!DOCTYPE html>
    <html>
      <head>

      <script>

       function fun()
        
         alert("hello");
         //validation code to see State field is mandatory.  
           

        function f1()
        
           alert("f1 called");
           //form validation that recalls the page showing with supplied inputs.   
           fun (); 
        

      </script>
      </head>
      <body>
       <form name="form1" id="form1" method="post">

         State: <select id="state ID">
                   <option></option>
                   <option value="ap">ap</option>
                   <option value="bp">bp</option>
                </select>
       </form>
       <table><tr><td id="Save" onclick="f1()">click</td></tr></table>

      </body>
</html>

【讨论】:

“内联代码的优先级高于其他代码”这是什么意思?

以上是关于如何使用 OnClick 事件调用 JS 函数的主要内容,如果未能解决你的问题,请参考以下文章

一个onclick事件触发一个函数,如何将该元素的对象作为函数的参数传过去

js如何阻止onclick点击事件响应两次

html5中onclick中的js函数无法执行,如何解决?

如何在 Node.js 中从客户端(例如 html 按钮 onclick)调用服务器端函数?

如何使用 C# Selenium 调用 JS onclick 函数和参数

在HTML中,如何写js代码(或者别的)以实现flash的点击事件