jQuery:unbind后重新绑定默认表单操作?

时间:2013-01-25 20:49:15

标签: jquery forms unbind

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

        $(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()方法&amp;它的处理程序:

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()的最后一个建议的反馈。另外,你会做什么HAD默认动作是未绑定的?

2 个答案:

答案 0 :(得分:0)

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

在谷歌搜索时找到它:http://james.padolsey.com/javascript/things-you-may-not-know-about-jquery/

答案 1 :(得分:0)

此处的代码将链接和事件处理程序绑定到链接,没有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. 在我们的功能完成后触发
    • 它什么都不做,并且默认行为发生