【问题标题】:Intercept click event on a button, ask for confirmation, then proceed拦截按钮上的点击事件,要求确认,然后继续
【发布时间】:2011-01-12 22:57:30
【问题描述】:

基于变量SomeCondition,我需要拦截一个按钮上的点击事件,并请求确认,如果他们说ok,则继续,否则忽略点击。

比如:

if(SomeCondition) {

// disable click on button

var isOk = window.confirm("Are you sure?");

if(isOk) {
        $("#button1").click();
}

}

注意:button1 已经通过我无法更改的外部 .js 文件中的 javascript 与点击事件连接起来。

我也不知道点击事件是绑定了什么,所以如果SomeCondition为真我必须禁用点击,然后要求确认,然后继续点击。

【问题讨论】:

    标签: jquery


    【解决方案1】:

    Process isOK你的window.confirm按钮的功能内

    $('#button1').click(function(){ 
       if(window.confirm("Are you sure?"))
         alert('Your action here');
    });
    

    您将遇到的问题是,当您触发“您确定”时,点击已经发生,如果它是启动原始 window.confirm 的那一次,则调用 preventDefault 不会停止执行原始点击。

    有点鸡/蛋的问题。

    编辑:阅读您编辑的问题后:

        var myClick = null;
    
        //get a list of jQuery handlers bound to the click event
        var jQueryHandlers = $('#button1').data('events').click;
    
        //grab the first jquery function bound to this event
        $.each(jQueryHandlers,function(i,f) {
           myClick = f.handler; 
           return false; 
        });
    
        //unbind the original
        $('#button1').unbind('click');
    
        //bind the modified one
        $('#button1').click(function(){
            if(window.confirm("Are You Sure?")){
                myClick();
            } else {
                return false;
            }
        });
    

    【讨论】:

    • 这就是我写的。 +1
    • @Blankman 对不起这个坏习惯(如果有多个匹配元素,那么你可以通过简单地引用 jQuery 对象数组中的第一个元素来获取第一个)
    • 如果原始点击事件不只是一个本地 dom 处理程序,就会发生这种情况。我将编辑我的答案以展示如何复制 jQuery 点击处理程序。
    • 没有一个本地 dom 处理程序是什么意思?感谢您提供此信息!
    • 对于信息... 'if(window.confirm("Are You Sure?"){' -> 'if(window.confirm("Are You Sure? ")){'。但我没有编辑权限...
    【解决方案2】:

    使用 jQuery 来防止默认你只是 return false:

    $("#button1").click(function () {
        //do your thing
        return false;
    });
    

    【讨论】:

    • 呃...不是真的。这样可以防止冒泡。
    • @Stephen api.jquery.com/submit "我们可以通过在事件对象上调用 .preventDefault() 或从我们的处理程序返回 false 来取消提交操作"
    • @Stephen return false; 实际上确实 preventDefault 和 stopPropagation
    【解决方案3】:

    致任何正在寻找简单解决方案的人(不限于此处提到的特殊情况)

    只需将此属性添加到按钮:

    .... , onclick = "return confirm('are you sure?')"
    

    当确认框返回 false 时,点击事件被取消。 注意:内联明确提到的 onclick 处理程序将覆盖任何其他绑定。

    【讨论】:

      【解决方案4】:

      我无法使用 jquery 1.9.1 获得上述任何答案

      这是对先前设置的 click 事件有效的方法

      var elem = $('#button1');
      var oldClick = $._data(elem[0], 'events').click[0].handler;
      elem.off('click');
      
      // Pass the original event object.
      elem.click(function(e){
        if(window.confirm("Are You Sure?")){
          oldClick(e);
        } else {
          return false;
        }
      });   
      

      与上面 Jason Benson 的回答非常相似

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-26
        • 1970-01-01
        • 1970-01-01
        • 2012-01-12
        • 2012-06-15
        相关资源
        最近更新 更多