2

フォームデータを保存するためのajax関数があります。ユーザーはいつでも保存を押すことができるので、非同期のままにしておきたいです。ただし、フォームをPDFに変換する別の関数があり、PDFを作成する前に保存関数を実行する必要があります(ユーザーがさらにデータを追加した場合)。$('input.submit')PDFを開く前に保存が完了するのを待つ方法はありますか?以下は私が使用しているjQueryです:

$("button#save").on('click', function (){
                $.ajax({
                    type: 'POST',
                    url: '<?php echo matry::base_to('utilities/crm/field_day_save');?>',
                    data: $("form#trip_form").serialize(),
                    dataType: 'json',
                    success: function (data)
                    {
                        $("#alerts").html(data.alert);
                        $("#form_id").val(data.id);
                    }
                    });
            });
        $("input.submit").on('click', function(event){
            event.preventDefault();
            $("button#save").trigger('click');
            window.open('<?php echo matry::base_to('custom_worddocs/field_day');?>' + '&fd_id=' + $("#form_id").val());
        });

つまり、$('button#save').click()非同期のままにしておきたいのです$(input.submit)が、ボタンの保存が完了するのを待ってから、新しいウィンドウを開きます。

4

2 に答える 2

4

jQuery のajax関数はjqXHR、とりわけdeferredのように動作するオブジェクトを返します。

window.open関数内から呼び出すだけthenで、AJAX が完了するまで待機します。

$("button#save").on('click', function () {

    var jqXHR = $.ajax({ /* your config... */ });

    $("input.submit").one('click', function(event) {
        event.preventDefault();
        $("button#save").trigger('click');

        jqXHR.then(function () {
            window.open('<?php echo matry::base_to('custom_worddocs/field_day');?>' + '&fd_id=' + $("#form_id").val());
        });
    });

}
于 2013-02-15T18:51:01.280 に答える
2

クリック ハンドラーに promise オブジェクトを返させてから、それを使用triggerHandler()してクリック イベントをトリガーし、その戻り値を取得します。

$("button#save").on('click', function (){
    return $.ajax({
        ...

...
$("button#save").triggerHandler('click').done(function(){
    window.open(...);
});
...

概念実証: http://jsfiddle.net/SRzcy/

于 2013-02-15T19:00:16.407 に答える