2012-05-02 66 views
1

您可以幫我解決以下問題嗎?通過AJAX打開PDF文件,按住按鈕

我有,你選擇的參數生成將由將由瀏覽器中打開一個Struts 1.x的動作返回一個PDF報告的形式。這在系統中完全同步工作。

但我需要保護系統從用戶請求報告而不必做所有的時間,把一個鎖按鈕,一旦生成的報告中才啓用。

我的選擇是在生成此報告的AJAX(異步調用)中創建一個函數,雖然此過程沒有回答我,但我隱藏了按鈕並顯示「加載」,因此返回按鈕I顯示並隱藏「加載」。

,但我有兩個不同的審判問題:

在第一次嘗試與按鈕和裝載預計,但我的PDF文件,返回功能(數據)的jQuery的行爲(代碼1)下方在瀏覽器的下載窗口沒有打開:

... 
success: function (data) { 
    WinID var = window.open ('', 'newwin', 'width = 400, height = 500'); 
    WinId.document.open(); 
    WinId.document.write (data); 
    WinId.document.close(); 
... 

在第二次嘗試(代碼2)使用道場返回PDF文件預期,但在瀏覽器的下載窗口中打開,以便重新啓用按鈕和禁用圖像失去控制加載。

有什麼辦法打開使用jQuery或道場在控制我的DIV此PDF文件?

謝謝

HTML片段:

... 
<tr> 
    <td colspan="3" align="center" valign="middle"> 
     <div id="button"> 
      <a href="javascript:execute();"> 
       <img src="images/btnExecute.png" alt="Execute" border="0" class="inputImage" /> 
      </a> 
     </div> 
     <div id="loadingImage"> 
      <img src='images/loading.gif' style="{align:right;}" /> 
     </div> 
    </td> 
</tr> 
... 

代碼1(jQuery的):

function execute() 
{ 
    $.ajax({ 
     type:"GET", 
     url: "generateReport.do", 
     data: "action=print&param1=param1", 
     dataType: "html", 
     beforeSend : function() { 
      //It works 
      $('#button').hide(); 
      $('#loadingImage').show(); 
     }, 
     complete : function() { 
      $('#button').show(); 
      $('#loadingImage').hide(); 
     }, 
     success : function(data) { 
      var WinId = window.open('', 'newwin', 'width=400,height=500'); 
      WinId.document.open(); 
      WinId.document.write(data); 
      WinId.document.close(); 
     } 
    }); 
} 

代碼2(道場):

function execute() 
{ 
    //It works 
    $('#button').hide(); 
    $('#loadingImage').show(); 

    var url = "generateReport.do?action=print&param1=param1";    

    require(["dojo/io/iframe"], function(ioIframe){ 
     ioIframe.send({ 
      url: url, 
      handleAs: "html" 
     }).then(function(data){ 
      //It only works when my page returns the html message "Empty report" 
      $('#button').show(); 
      $('#loadingImage').hide(); 
     }, function(err){ 
     }); 
    }); 
} 

回答

0

不能設置HTML文檔內容與二進制PDF ..什麼是你的generateReport.do返回,我懷疑它的.pdf附件?

你需要做的是有generateReport.do做一個臨時文件與PDF格式的內容 - 然後返回它的URL。一旦你的網址,把它放在你的window.open的位置..

  1. 呼叫generateReport.do
  2. 功能(數據)持有的「http://mydomain.tld/cached_contents/234kj82341.pdf 「在 '數據'
  3. 功能(數據)調用window.open(數據,window_open_parameters);

這將使任一瀏覽器服務PDF插件和appropiately查看..我們不能這樣做通過javascript/dom。

或者,找一個flash插件或相似的,在你的window.document。寫,把一個<object src="my_pdf_plugin" ...></object>

function execute() 
{ 
    // this is Not dojo, it looks like jQuery, see below onload function 
    $('#button').hide(); 
    $('#loadingImage').show(); 

    var url = "generateReport.do?action=print&param1=param1";    

    require(["dojo/io/iframe"], function(ioIframe){ 
     ioIframe.send({ 
      url: url, 

看到handleAs:在你的測試用例http://dojotoolkit.org/reference-guide/1.7/dojo/io/iframe.html (與handleAs:HTML),如果返回的數據是內容類型文本的不/ HTML時,它就會被丟棄 - 試圖將文本轉換後/顯然是一個實際的html文檔

  handleAs: "text" 
     }).then(function(data){ 
      //It only works when my page returns the html message "Empty report" 
      $('#button').show(); 
      $('#loadingImage').hide(); 
     }, function(err){ 
     }); 
    }); 
} 

dojo.addOnLoad(function() { 

// this will create a disabled dojo button 
require(["dijit/form/Button"], function(dijitButton) { 
    var domNode = dojo.byId('button'); 
    var btn = new dijitButton({ 
    diabled: true, 
    id: 'PDFBUTTON', 
    label: domNode.innerHTML // default behavior even so, for show here 
    }, domNode); 

    // showcase: 
    var enabled = true; 
    dijit.byId('PDFBUTTON').set("disabled", !enabled); 

}); 

}