Javascript 防止onclick着火

Javascript 防止onclick着火,javascript,jquery,Javascript,Jquery,我正在处理html格式的表单提交。请看下面的代码 <form id="form1"> <button id="btn1" onclick="clicked();">Submit</button> </form> <script> $("#btn1").click(function (event) { alert("event triggered"); if(some_condition == t

我正在处理html格式的表单提交。请看下面的代码

<form id="form1">
 <button id="btn1" onclick="clicked();">Submit</button>
</form>
<script>
    $("#btn1").click(function (event) {
        alert("event triggered");
        if(some_condition == true){
             // stop firing onclick method but it always submits the form
             event.stopImmediatePropogation(); // not working
             event.preventDefault(); // not working
             event.stopPropogation(); // not working it's for bubbled events
         }
     });
     function clicked(){ alert("clicked me"); }
</script>

提交
$(“#btn1”)。单击(函数(事件){
警报(“事件触发”);
if(某些条件==true){
//停止激发onclick方法,但它始终提交表单
event.stopImmediateProporation();//不工作
event.preventDefault();//不工作
event.stopPropogation();//不工作它用于冒泡事件
}
});
函数clicked(){alert(“clicked me”);}

我想停止
clicked()
函数的激发,该函数附加到内联
onclick
属性。我想运行jquery click函数,如果出现问题,我不想触发onclick,但它总是运行clicked()函数。谁能帮我一下吗。非常感谢您的帮助

尝试
event.stopPropagation()

相对于动态附加的处理程序,调用
onxyz
处理程序的顺序因浏览器而异,因此处理程序可能不会在原始处理程序运行之前运行

要处理此问题,请保存并删除
onclick
处理程序:

var btn = $("#btn1");
var clickHandler = btn[0].onclick;
btn[0].onclick = false;
然后,在处理程序中,如果希望调用该函数,可以调用它:

clickhandler.call(this, event);
例如:

//获取按钮
风险值btn=$(“#btn1”);
//保存并删除onclick处理程序
var clickHandler=btn[0]。onclick;
btn[0]。onclick=false;
//把你的接线员接上
$(“#btn1”)。单击(函数(事件){
警报(“事件触发”);
如果(!确认(“允许?”){
//不允许,不要叫它
警惕(“停止”);
}否则{
//允许,叫它
clickHandler.call(此,事件);
}
});
//onclick处理程序
函数单击(){
警惕(“点击我”);
}

提交

如果条件为真,则删除“onclick”属性

if (some_condition == true) {
    $("#btn1").removeAttr('onclick').click(function(event) {
        alert("event triggered");

        //do something
    });
}


function clicked() {
    alert("clicked me");
}

我正在分享一个快速解决方案,但不知道为什么不能添加逻辑来停止添加“onclick=”clicked();“您所说的代码将自动添加

我建议您隐藏id为“btn1”的按钮。添加样式显示:无。您不需要启用就绪功能,只需将样式属性添加到按钮btn1,或者如果这也不可能,则直接使用jQuery完成发布文档就绪。 阅读:

然后使用id为“btn2”的jQuery向表单添加一个新按钮,并添加注册btn2点击事件。在表单加载后执行此操作

<form id="form1">
<div id="newbut">
<button id="btn1" onclick="clicked();">Submit</button>
</div>
</form>

jQuery("#newbut").html('<button id="btn2">Submit</button>');
$(document).on('click', '#btn2', function(){ 
     // Your Code
 });

提交
jQuery(“#newbut”).html('Submit');
$(文档).on('click','#btn2',function(){
//你的代码
});
请参阅下面的url以了解如何注册“新建”按钮的单击事件:


您不能在一个函数中执行条件检查和单击()逻辑吗

<script>
 function clicked() { 
     if(some_condition == true){
         return;
     }
     alert("clicked me");
 }
</script>

函数已单击(){
if(某些条件==true){
返回;
}
警惕(“点击我”);
}

它将不起作用,它适用于冒泡事件,而不适用于同一元素您注册了两个侦听器。OP已尝试了
stopImmediateProposition()
,它将完成所有操作
stopProposition()
does和more.onclick不是一个监听器,它附加了一个处理程序,唯一的方法是设置为onclick=null;但是如何在不设置为null的情况下停止从事件监听器触发内联事件要求是内联的“onclick”事件,必须在那里有它的要求。
clicked()
onclick
属性中的函数首先运行?如果使用jQuery,为什么还要有一个内联的
onclick
属性?使用
绑定两个处理程序。单击()
函数,并且您首先绑定的任何一个都可以调用
stopImmediateProposition()
,以阻止第二个处理程序运行。(或将它们合并到一个处理程序中。)@nnnnnn抱歉,但“onclick”是自动生成的代码,我们无法删除onclick事件,如果我们想附加事件,请通过jquery添加它们,但我们无法在任何时候删除onclick并注意“onclick”"事件处理程序最后运行
stopPropogation
是一个输入错误,它应该是
stopPropogation
正确的。或者,更好的是,转储内联
onclick
处理程序并使用单个函数,或者使用jQuery绑定两个函数。@nnnnnnnn:的确。我假设这是因为某种原因而无法更改的代码被添加到某个对象中(令人惊讶的是,有这么多这样的问题。)是的,OP在回答我在问题下的评论时确认了这一点。我也这么想,但我认为是否有任何解决办法,但我相信这会造成额外的开销,包括理解代码、将onclick内联附加到html、通过js将其设置为false以及使用.call运行(另一种方式)。难道这不令人困惑吗?代码可读性可能会让新手感到困惑?@user3205479:你必须做你必须做的事情。如果你一开始就坚持使用
onclick
处理程序,那么这几乎是你能做的唯一一件事来解决浏览器之间的差异。我认为代码不是特别的c但如果需要,您可以使用注释来帮助稍后到来的人。