1

你能帮我解决以下问题吗?

我有一个表单,您可以在其中选择参数以生成 PDF 报告,该报告将由浏览器打开的 Struts 1.x 操作返回。这在系统中完美地同步工作。

但是我需要保护系统免受用户的影响是请求报告而没有一直做,只在生成报告后才启用按钮。

我的选择是在生成此报告的 AJAX(异步调用)中创建一个函数,虽然此过程没有回复我,但我隐藏了按钮并显示“正在加载”,返回按钮也显示并隐藏了“加载”。

但是我在两个不同的试验中遇到了问题:

在第一次尝试(代码 1)中,按钮的 jQuery 行为和加载是预期的,但我返回以下函数(数据)的 PDF 文件未在浏览器下载窗口中打开:

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

在使用 Dojo 的第二次尝试(代码 2)中,预期会返回 PDF 文件,但是当浏览器的下载窗口打开时会失去控制,以便再次启用按钮并禁用图像加载。

有什么方法可以使用 jQuery 或 Dojo 打开这个 PDF 文件来控制我的 DIV?

谢谢,

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){
        });
    }); 
}
4

1 回答 1

0

不能使用二进制 PDF设置 HTML 文档内容。您的 generateReport.do 返回的是什么,我怀疑它的 .pdf 附件?

您需要做的是让 generateReport.do 使用 pdf 的内容制作一个临时文件 - 然后返回其 URL。获得 URL 后,将其放在 window.open 的位置。

  1. 调用 generateReport.do
  2. 函数(数据)在“数据”中保存“http://mydomain.tld/cached_contents/234kj82341.pdf”
  3. 函数(数据)调用window.open(数据,window_open_parameters);

这将使任一浏览器都提供 PDF 插件并适当地查看。我们不能通过 javascript / dom 执行此操作。

或者,找到一个 flash 插件或类似的插件,然后在你的 window.document.write 中,放一个<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),如果返回的数据不是内容类型的 text/html,它将被丢弃- 在尝试将 text/plain 转换为实际的 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);

});

}
于 2012-05-04T00:27:42.237 回答