【问题标题】:How to prevent default event handling in an onclick method?如何防止 onclick 方法中的默认事件处理?
【发布时间】:2011-08-14 11:58:59
【问题描述】:

如何防止 onclick 方法中的默认值?我有一个方法,其中我还传递了一个自定义值

<a href="#" onclick="callmymethod(24)">Call</a>
function callmymethod(myVal){
    //doing custom things with myVal
    //here I want to prevent default
}

【问题讨论】:

    标签: javascript


    【解决方案1】:

    让您的回调返回 false 并将其传递给 onclick 处理程序:

    <a href="#" onclick="return callmymethod(24)">Call</a>
    
    function callmymethod(myVal){
        //doing custom things with myVal
        //here I want to prevent default
        return false;
    }
    

    然而,要创建 可维护 代码,您应该避免使用 "inline Javascript"(即:直接在元素标签内的代码)并通过以下方式修改元素的行为包含的 Javascript 源文件(称为 unobtrusive Javascript)。

    标记:

    <a href="#" id="myAnchor">Call</a>
    

    代码(单独文件):

    // Code example using Prototype JS API
    $('myAnchor').observe('click', function(event) {
        Event.stop(event); // suppress default click behavior, cancel the event
        /* your onclick code goes here */
    });
    

    【讨论】:

    • @AamirAfridi 是的,它正在工作。你应该调整你的小提琴并将onLoaded更改为no wrap。或者干脆编写自己的 .html 标记。
    • 请看下面的答案! “在我看来答案是错误的!他要求 event.preventDefault(); 当你简单地返回 false; 它调用 event.preventDefault(); 和 event.stopPropagation(); 以及!”
    • 为了挑剔,OP的问题从来没有提到preventDefault,问题是,如何“防止[the]默认点击”
    • @LinusKleen,也请说一下,如何防止点击这个case
    • @vp_arth 为此使用“CSS click through”。看this question
    【解决方案2】:

    几个不同的答案。即使过了这么多年,这个问题仍然很重要。因此,这里是编译:

    // 1
    function myFn1 (e, value) {
        console.log('value:', value)
        e.preventDefault();
    }
    
    // 2
    function myFn2 (value) {
        console.log('value:', value)
        return false;
    }
    
    // 3,5,6,7
    function myFn3 (value) {
        console.log('value:', value)    
    }
    
    // 4
    document.getElementById("clicki-1").addEventListener('click', function(event){
        event.preventDefault();
        console.log('value:',this.getAttribute("data-value"));
    });
    <h3>onclick Attribute</h3>
    <div>
      <a href="/hello" onclick="myFn1(event, 42)">Click 1</a>
    </div>
    
    <div>
      <a href="/hello" onclick="return myFn2(42)">Click 2</a>
    </div>
    
    <div>
      <a href="/hello" onclick="myFn3(42); return false;">Click 3</a>
    </div>
    
    <h3>EventListener (addEventListener)</h3>
    <div>
      <a href="/hello" id="clicki-1" data-value="42">Click 4</a>
    </div>
    
    <h3>onclick Attribute without linkaddress when hovering</h3>
    <div>  
      <a href="javascript:;" onclick="event.preventDefault(); myFn3(42)">Click 5</a>
    </div>
    
    <div>  
      <a href="javascript:void(0);" onclick="myFn3(42)">Click 6</a>
    </div>
    
    <div>  
      <a href="javascript:;" onclick="myFn3(42)">Click 7</a>
    </div>
    
    <h5>Set Anchor Hashtag</h5>
    <div>  
      <a href="#" onclick="myFn3(42)">Click 8</a>
    </div>

    我更喜欢返回 false 的变体 2;如果它必须快速进行。否则变体 4 (AddEventListener)。

    【讨论】:

      【解决方案3】:

      在我看来答案是错误的!当你简单地返回 false 时,他要求event.preventDefault();;它也调用event.preventDefault();event.stopPropagation();

      你可以这样解决:

      <a href="#" onclick="callmymethod(event, 24)">Call</a>
      
      function callmymethod(e, myVal){
          //doing custom things with myVal
      
          //here I want to prevent default
          e = e || window.event;
          e.preventDefault();
      }
      

      【讨论】:

      【解决方案4】:

      只需放置“javascript:void(0)”,代替 href 标记中的“#”

      <a href="javascript:void(0);" onclick="callmymethod(24)">Call</a>
      

      【讨论】:

        【解决方案5】:

        试试这个(但如果您没有graceful degradation 的有效href 值,请在这种情况下使用按钮)

        <a href="#" onclick="callmymethod(24); return false;">Call</a>
        

        【讨论】:

        • 最好不过了。我想要同样的 event.preventDefault();
        • 它对我有用,但你能解释一下为什么你必须return false;吗?我们甚至返回 false 到什么?
        • 你可以只返回而不是返回false,返回将避免链接导航到href。从技术上讲,我们应该在这种情况下使用按钮。
        【解决方案6】:

        你可以使用:

        event.stopPropagation();
        

        https://dom.spec.whatwg.org/#dom-event-stoppropagation

        【讨论】:

          【解决方案7】:

          另一种方法是使用属性onclick 内的event 对象(无需向函数添加额外的参数来传递事件)

          function callmymethod(myVal){
              console.log(myVal);
          }
          &lt;a href="#link" onclick="event.preventDefault();callmymethod(24)"&gt;Call&lt;/a&gt;

          【讨论】:

            【解决方案8】:

            您可以捕获该事件,然后使用 preventDefault() 阻止它 - 使用纯 Javascript

            document.getElementById("xyz").addEventListener('click', function(event){
                event.preventDefault();
                console.log(this.getAttribute("href"));
                /* Do some other things*/
            });
            

            【讨论】:

              【解决方案9】:

              这对我有用

              <a href="javascript:;" onclick="callmymethod(24); return false;">Call</a>
              

              【讨论】:

                【解决方案10】:

                给元素一个类或id并使用jquery函数unbind();

                $(".slide_prevent").click(function(){
                                $(".slide_prevent").unbind();
                              });
                

                【讨论】:

                  【解决方案11】:

                  将所有html页面中的函数用法更改为return false太繁琐了。

                  所以这是一个经过测试的解决方案,它只修补函数本身:

                  function callmymethod(myVal) {
                      // doing custom things with myVal
                  
                      // cancel default event action
                      var event = window.event || callmymethod.caller.arguments[0];
                      event.preventDefault ? event.preventDefault() : (event.returnValue = false);
                  
                      return false;
                  }    
                  

                  这正确地阻止了 IE6、IE11 和最新的 Chrome 在 onclick 事件处理程序完成后访问href="#"

                  学分:

                  【讨论】:

                    【解决方案12】:

                    如果你需要把它放在标签里。不是最好的解决方案,但它会起作用。

                    确保将 onclick 事件放在 href 前面。只对我这种方式有效。

                    <a onclick="return false;" href="//www.google.de">Google</a>
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2014-07-09
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2015-05-30
                      相关资源
                      最近更新 更多