2010-07-26 16 views
17

Deseo enviar información a mi base de datos cuando un usuario imprime una determinada página web. Puedo hacer esto en IE con onbeforeprint() y onafterprint() pero me gustaría hacer un navegador de manera independiente de hacer lo mismo. No importa qué combinación de tecnologías tenga que usar (PHP, MySQL, JavaScript, HTML) siempre que se haga. ¿Algunas ideas?onbeforeprint() y onafterprint() equivalente para navegadores que no sean IE

EDIT:

Aún teniendo algunos problemas con esto. Intenté poner mi función en mi Print.css como una imagen, pero estoy estropeando de alguna manera. Luego intenté simplemente agregar un detector de eventos, pero tampoco puedo hacer que funcione bien. Si alguien puede proporcionar más detalles sobre cómo llamar a una función justo antes de imprimir en CUALQUIER navegador, lo agradecería.

EDIT:

estoy renunciando en esto por ahora, me he instalado con otra forma de hacer lo que quiero. Espero con ansias el día en que FireFox admita onbeforeprint() y onafterprint().

Respuesta

6

No soy sure other browsers will allow you to. Se podría, por supuesto, especificar una imagen en algún lugar de una hoja de estilos de impresión, que probablemente sólo será llamado en una impresión, para la onbeforeprint

+0

¿Estás sugiriendo algo como esto? http://www.siteexperts.com/forums/viewConverse.asp?d_id = 19568 – ubiquibacon

+1

No sé si eso funcionará. Sugeriría que se llame un script del lado del servidor como la fuente de la imagen que realmente devuelve una imagen, y simplemente hace lo que le gusta (registrar una acción de impresión, posiblemente establecer una variable de sesión que otros js en la página puedan recuperar/sondear, etc.) – Wrikken

+0

onbeforeprint es compatible con Firefox desde la versión 6, consulte https://developer.mozilla.org/en/DOM/window.onbeforeprint –

4

Try enmascarar el nativo window.print() con su propio ...

// hide our vars from the global scope 
(function(){ 

    // make a copy of the native window.print 
    var _print = this.print; 

    // create a new window.print 
    this.print = function() { 
    // if `onbeforeprint` exists, call it. 
    if (this.onbeforeprint) onbeforeprint(this); 
    // call the original `window.print`. 
    _print(); 
    // if `onafterprint` exists, call it. 
    if (this.onafterprint) onafterprint(this); 
    } 

}()) 

Actualizado: comentarios

+0

Gracias @no, pero estoy teniendo problemas para seguir su código. ¿Dice que esto enmascarará la función de impresión nativa en cualquier navegador? Esto plantea otra pregunta para mí también, ¿podría simplemente hacer una función de JavaScript que marque CADA evento de ventana y luego ejecutar la función que quiero ejecutar antes de imprimir cuando 'window.print == true'? – ubiquibacon

+0

@typoknig: lo hará; por eso es posible que desee elegir diferentes nombres para 'onbeforeprint' y' onafterprint'. Supongo que quiere capturar llamadas a 'window.print' desde otros scripts además del suyo. Sobre la segunda parte de su pregunta, creo que funcionaría, pero suena demasiado caro ... –

+0

@typoknig: Agregué comentarios de código a mi respuesta, debería ayudar a explicar lo que está sucediendo. –

0

Creo que simplemente no es posible hacerlo correctamente. O al menos, no con ninguna tecnología que conozco ni con ninguna de las respuestas dadas previamente.

Tanto el uso de una copia impresa como el script de generación de imágenes dinámicas en el servidor le dirían que la página se imprimió incluso cuando el visitante simplemente se fue a imprimir el modo de vista previa y luego se canceló.

Sin embargo, me gustaría aprender cómo obtener la información adecuada, para que pueda ser seguro esa página fue realmente impresa.

30

Many browsers ahora es compatible con window.matchMedia. Esta API le permite detectar cuándo entran en vigencia las consultas de medios CSS (por ejemplo, rotando la pantalla o imprimiendo el documento). Para un enfoque de navegador cruzado, combine window.matchMedia con window.onbeforeprint/window.onafterprint.

Lo siguiente puede resultar en varias llamadas a beforePrint() y afterPrint() (por ejemplo, Chrome fires the listener every time the print preview is regenerated). Esto puede o no ser deseable dependiendo del procesamiento particular que esté haciendo en respuesta a la impresión.

if ('matchMedia' in window) { 
    // Chrome, Firefox, and IE 10 support mediaMatch listeners 
    window.matchMedia('print').addListener(function(media) { 
     if (media.matches) { 
      beforePrint(); 
     } else { 
      // Fires immediately, so wait for the first mouse movement 
      $(document).one('mouseover', afterPrint); 
     } 
    }); 
} else { 
    // IE and Firefox fire before/after events 
    $(window).on('beforeprint', beforePrint); 
    $(window).on('afterprint', afterPrint); 
} 

Más: http://tjvantoll.com/2012/06/15/detecting-print-requests-with-javascript/

+3

Merece la pena señalar que Chrome parece activar el evento de impresión dos veces. – jlarson

+0

... en realidad cuatro veces - una vez con media.matches = true, luego media.matches = false, luego media.matches = true, luego media.matches = false. – jlarson

+0

Esto no funciona cuando utilizo "Imprimir usando el diálogo del sistema" en Chrome. La ventana se cierra pero la impresión falla. Simplemente informando :) – Augiwan

0
(function() { 
var beforePrint = function() { 
    if($('.modal').hasClass('in')){ 
     $('body').removeClass('modal-open'); 
    } 
}; 
var afterPrint = function() { 
    if($('.modal').hasClass('in')){ 
     $('body').addClass('modal-open'); 
    } 
}; 

if (window.matchMedia) { 
    var mediaQueryList = window.matchMedia('print'); 
    mediaQueryList.addListener(function(mql) { 
     if (mql.matches) { 
      beforePrint(); 
     } else { 
      afterPrint(); 
     } 
    }); 
} 
window.onbeforeprint = beforePrint; 
window.onafterprint = afterPrint;}()); 

Este código funciona en todos los navegadores para la detección de eventos de impresión.

Cuestiones relacionadas