Abra el archivo PDF con AJAX manteniendo presionado el botón

¿Me pueden ayudar con el siguiente problema?

Tengo un formulario donde selecciona los parámetros para generar un informe en PDF que será devuelto por una acción de Struts 1.x que abrirá el navegador. Esto está funcionando perfectamente sincrónicamente en el sistema.

Pero lo que necesito para proteger el sistema del usuario es solicitar el informe sin haberlo hecho todo el tiempo, poniendo un candado al botón para que se habilite solo una vez generado el informe.

Mi elección fue crear una función en AJAX (llamada asíncrona) a la que se generó este informe, y mientras este proceso no me responde, escondo el botón y muestro el "cargando" y también lo tiene el botón de retorno. Muestro y escondo el "cargando".

Pero estoy teniendo problemas en dos ensayos diferentes:

En el primer intento (código 1) con jQuery se espera el comportamiento del botón y la carga, pero mi archivo PDF que devuelve la función (datos) a continuación no se abre en la ventana de descarga del navegador:

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

En el segundo intento (código 2) con Dojo, se espera que se devuelva el archivo PDF, pero cuando se abre la ventana de descarga del navegador, se pierde el control para habilitar el botón nuevamente y deshabilitar la carga de imágenes.

¿Hay alguna forma de abrir este archivo PDF usando jQuery o Dojo para controlar mis DIV?

Gracias,

Fragmento 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>
...

Código 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(); 
        }
    }); 
}

Código 2 (Dojo):

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

preguntado el 02 de mayo de 12 a las 19:05

1 Respuestas

podrá establecer el contenido del documento HTML con PDF binario.. ¿Qué está devolviendo su generateReport.do, sospecho que es el archivo adjunto .pdf?

Lo que debe hacer es generar un informe. hacer un archivo temporal con el contenido del pdf y luego devolver su URL. Una vez que tenga la URL, colóquela en la ubicación de su ventana.abrir..

  1. llame a generarReporte.do
  2. función (datos) contiene "http://mydomain.tld/cached_contents/234kj82341.pdf" en 'datos'
  3. function(data) llama a window.open(data, window_open_parameters);

Esto hará que cualquiera de los navegadores sirva el complemento PDF y lo vea correctamente. No podemos hacer esto a través de javascript / dom.

Alternativamente, busque un complemento flash o similar y en su window.document.write, coloque un <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,

ver manejar como: http://dojotoolkit.org/reference-guide/1.7/dojo/io/iframe.html en su caso de prueba (con handleAs:html), si los datos devueltos no son de tipo de contenido de texto/html, se descartarán, después de intentar convertir texto/sin formato en un documento html real

            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);

});

}

contestado el 04 de mayo de 12 a las 01:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.