【问题标题】:jQuery: Rebind default form action after unbind?jQuery:取消绑定后重新绑定默认表单操作?
【发布时间】:2013-01-27 01:37:54
【问题描述】:

在我的表单中,我绑定了一个函数来提交表单:

        $(document).ready(function() {
            // Bind the submission to the form
            $('form').bind('submit', onsubmit_action);
        });

在 onsubmit_action() 中,我解除了提交事件的绑定,因此人们无法再次点击,并在该事件上调用 preventDefault,因为我正在做一些 AJAX 废话:

        function onsubmit_action(event) {
            if (initiator == "form.buttons.finish") {
                $('form').unbind('submit', onsubmit_action);
                event.preventDefault();
                sendRequest();
            } else {
                this.submit();
            }
        }

函数 sendRequest() 在这里做真正的 AJAX 工作。如果 sendRequest 失败,我只需重新绑定表单,一切都很好。但如果成功了,我需要重新绑定表单,但不是绑定到 onsubmit_action() 而是绑定到表单的原始操作:

<form action="/carry_on" method="post"></form>

sendRequest() 方法及其处理程序:

handleResponse = function(data, code, jqXHR) {

switch (data.status) {
    case "SUCCESS":
        // This doesn't work because "submit" is unbound
        $('#form-buttons-finish').click();
        // Same with this
        $('form').submit()
        break;

    case "ERROR":
        alert('error')
        break;

    case undefined:
        alert('undefined');
        break;

    default:
        alert("Some kind of horrible error occurred: " + data.status);
        break;
    }
};

sendRequest = function() {

// Poll the the server for a response
$.ajax({
    type: "POST",
    cache: "false",
    url: "/json/get_status",
    dataType: "json",
    data: { ref_token: token },
    success: handleResponse,
    error: handleError
});
};

我要做的是重新绑定表单的提交事件,但将其绑定到表单的默认操作:/carry_on 而不是 onsubmit_action 函数。我想我需要做一些类似的事情:

$('form').on('submit', function() {
 post(this.action, this.serialize(), null, "script");
});

什么的。 (我猜测上面的语法)任何有用的想法都值得赞赏。


有其他东西干扰了我的提交。表单实际上仍然绑定到它的默认操作,因为我只解除了 onsubmit_action 的绑定。

抱歉打扰了。但是,我想对我关于使用 post() 的最后一个建议的反馈。另外,如果默认操作未绑定,您会怎么做?

【问题讨论】:

    标签: jquery forms unbind


    【解决方案1】:

    我认为.data('events') 列出了元素集上的所有绑定事件。也许你可以得到它,找到提交事件句柄,然后缓存它以供以后重新绑定?

    在这里谷歌搜索时发现它:http://james.padolsey.com/javascript/things-you-may-not-know-about-jquery/

    【讨论】:

    • 首先,该页面很棒。其次,使用 .data('events') 我能够确定其他事情正在破坏我的一天,因为我可以看到默认操作仍然是绑定的。感谢您提供此链接并花时间阅读。
    【解决方案2】:

    这里的代码绑定和事件处理程序到链接,没有 unbind() 而是一个简单的开关和一个jQuery data(),my_process() 应该将 'status' 设置为 'normal'。

    $(document).ready(function(){
    
        $('a').bind('click', function(e){
            var status = $(this).data('status');
            switch(status){
                case 'processing':
                    e.preventDefault();
                    $(this).data('status', 'processing');
                    break;
                case 'normal':
                    break;
                default: /* First click */
                    e.preventDefault();
                    my_process($(this));  
            } /* end of switch */
        });/* end of bind() */
    });/* end of ready() */
    

    示例:http://jsbin.com/etuqig/4/edit

    事件处理器的逻辑

    使用 data() 函数,它检测链接状态并采取相应措施:

    1. 如果是第一次触发:
      • 它会触发我们的自定义函数
      • 它可以防止默认
    2. 如果在我们的自定义函数工作时触发
      • 它可以防止默认
    3. 在我们的函数完成后触发
      • 什么都不做,发生默认行为

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多