2013-02-15 133 views
2

我有一個ajax函數來保存表單數據。我希望它保持異步,因爲用戶可以隨時點擊保存。但是,我有另一個功能將表單轉換爲PDF,我希望它在創建PDF之前運行保存功能(以防用戶添加更多數據)。打開pdf之前有沒有辦法讓$('input.submit')等待保存完成?下面是我使用jQuery:jquery等待直到AJAX調用完成

$("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)等待按鈕保存打開新窗口之前完成。

+0

你打開在'success'或'Ajax請求的complete'回調的PDF文件。 – Danny 2013-02-15 18:53:19

+0

爲什麼你再次觸發點擊? – 2013-02-15 18:58:42

+0

點擊是運行ajax保存功能,所以它在創建PDF之前保存。 @Danny,我不想重寫保存功能,只需額外打開一個窗口行,並且我不希望每次保存的 – Mike 2013-02-15 19:05:00

回答

2

有你的點擊處理程序返回一個承諾的對象,然後使用triggerHandler()觸發點擊事件,並得到這是回報價值。

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

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

概念證明:http://jsfiddle.net/SRzcy/

+0

就像一個魅力一樣打開窗口。謝謝。 – Mike 2013-02-15 19:03:28

4

jQuery的ajax函數返回一個jqXHR對象,其中的行爲如同deferred

通過僅從then函數內調用window.open,它會等待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()); 
     }); 
    }); 

}