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

让您的点击处理程序返回一个承诺对象,然后用于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 回答