2012-05-02 73 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); 

}); 

}