0

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

        $(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() 的最后一个建议的反馈。另外,如果默认操作未绑定,您会怎么做?

4

2 回答 2

0

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

$(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. 它是在我们的函数完成后触发的
    • 它什么都不做,并且发生默认行为
于 2013-01-25T22:14:07.500 回答
0

I think .data('events') lists all bound events on an element set. Perhaps you can get that, find the submit event handle, and cache it for later rebinding?

Found it while Googling around here: http://james.padolsey.com/javascript/things-you-may-not-know-about-jquery/

于 2013-01-25T21:02:38.080 回答