1

次の問題について教えていただけますか?

パラメータを選択して、ブラウザによって開かれるStruts1.xアクションによって返されるPDFレポートを生成するフォームがあります。これは、システムで完全に同期して機能しています。

しかし、ユーザーからシステムを保護するために必要なのは、レポートが生成されたときにのみ有効になるようにボタンをロックして、常に実行せずにレポートを要求することです。

私の選択は、このレポートが生成されたAJAX(非同期呼び出し)で関数を作成することでした。このプロセスでは応答がありませんが、ボタンを非表示にして「読み込み中」を表示し、戻るボタンを表示して非表示にします。 「読み込み中」。

しかし、私は2つの異なる試験で問題を抱えています。

ボタンのjQuery動作とロードを使用した最初の試行(コード1)では、ロードが期待されますが、以下の関数(データ)を返す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回目の試行(コード2)ではPDFファイルが返されますが、ブラウザのダウンロードウィンドウが開くと、ボタンを再度有効にして画像の読み込みを無効にするために制御が失われます。

DIVの制御にjQueryまたはDojoを使用してこの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){
        });
    }); 
}
4

1 に答える 1

0

バイナリPDFでHTMLドキュメントのコンテンツを設定することはできません..あなたのgenerateReport.doは何を返していますか?

あなたがする必要があるのは、generateReport.doにpdfの内容を含む一時ファイルを作成させ、そのURLを返すことです。URL を取得したら、それを window.open.. の場所に配置します。

  1. generateReport.do を呼び出します
  2. function(data) は、「data」に「http://mydomain.tld/cached_contents/234kj82341.pdf」を保持します
  3. function(data) は window.open(data, 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-document に変換しようとした後

            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 に答える