0

私のフォームでは、関数をフォーム送信にバインドしました。

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

onsubmit_action() では、サブミット イベントのバインドを解除して、人々が再度クリックできないようにし、イベントで preventDefault を呼び出します。

        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

.data('events')要素セットにバインドされたすべてのイベントをリストすると思います。おそらく、それを取得し、送信イベント ハンドルを見つけて、後で再バインドするためにキャッシュできますか?

ここでグーグルで見つけました:http://james.padolsey.com/javascript/things-you-may-not-know-about-jquery/

于 2013-01-25T21:02:38.080 に答える