Hola de nuevo Bruckner, Tengo otro problemilla: tengo una página con texto y fotos, y con un botón de imprimir. Mi idea es que al imprimir me imprima una página con sólo el texto. De momento tengo un link a un target _blank y al onLoad le hago un window. Print y un window.close, funciona bien pero me aparece la ventana con el texto y la caja de diálogo de imprimir, al darle ok, se cierra la caja y la ventana.
Lo que quisiera conseguir es una función que me imprima dicha página pero sin que el usuario la pueda visualizar. Que directamente al cliquear sobre el botón de imprimir salga por la impresora. De nuevo, gracias de antemano.
La solución a tu problema es usar un IFRAME oculto como buffer de carga. El IFRAME, como sabes, se comporta exactamente igual que un FRAME (y por tanto igual que una ventana), pero sin el requisito de estar en un FRAMESET, y permitiendo la carga de páginas en un contenedor tipo bloque. Si en la página desde la que quieres imprimir declaras (no importa dónde, pero yo lo pondría al final del código HTML, antes del cierre de BODY): <iframe name="printBuffer" src="lapaginaquequieresimprimir.html" style="display:none"></iframe> Sólo necesitarás hacer printBuffer.print(); desde tu página (la que contiene el IFRAME) para imprimir los contenidos. Además, puedes reutilizar el IFRAME tantas veces como quieras cargando en él otras páginas, mediante printBuffer.location.href='nuevapagina.html'; Esto funcionará adecuadamente en todas las versiones de Explorer (desde la 4) y en Netscape 6, pero no en Netscape 4, que no soporta el tag IFRAME. Para este navegador es inevitable usar la técnica que estas usando actualmente. Espero que te sea útil, y no dudes en volverme a preguntar cualquier duda que te surja.
Hola bruckner, Tengo una pequeña duda con la pregunta anterior: Sigo las indicaciones que me indicaste ej: En la imagen que sirve para imprimir tengo: <a href="#" onclick="printBuffer.print();" ... y en el final del body, antes del </body> tengo: <iframe name="printBuffer" src="../comun/imprimir.htm" style="display:none"></iframe> Pero el problema que tengo es que me imprime la página actual, y no La página que quiero que es la imprimir.htm Gracias otra vez.
Lo siento, la solución que te di funciona... en teoría. Yo también la probé (desgraciadamente, después de enviártela; la próxima vez no seré tan rápido) y pude comprobar el problema. El asunto estriba en que al parecer la llamada al método print() se resuelve estáticamente, con lo que, llamado desde cualquier ventana, imprime ésta (independientemente del objeto ventana o frame que se le indique). Afortunadamente, esto tiene solución... lo que me lleva al motivo de por qué lo hice así. Intentaba buscar una solución a tu problema que también funcionara en Explorer 4. La solución que había creado antes sólo funcionaba en Explorer 5 y Netscape 6... pero peor es nada. Ahí va: function imprimirURL(url) { var iframeElem=document.createElement('IFRAME'); var bodyElem=document.getElementsByTagName('BODY').item(0); iframeElem.style.display='none'; bodyElem.appendChild(iframeElem); iframeElem.location.href=url; iframeElem.onload=print; } La buena noticia es que no necesitas añadir nada a la página para que eso funcione... Ya se encarga la propia función imprimirURL() de hacerlo: añade dinámicamente un IFRAME oculto y le asigna la url que se le pasa a la función como contenido, y el método print a su evento onLoad, con lo que se consigue que se llame desde el propio IFRAME, y no desde la página que lo contiene. Disculpa las molestias que haya podido causarte... Nadie es perfecto. Si tienes cualquier problema con esta solución, o te surge cualquier otra duda, no dejes de preguntarme de nuevo.
Hola Brckner, Perdona por las molestias tan frecuentes, pero es que sigo teniendo problemillas con la función de imprimir. Ahora he copiado la función y tanto en explorer5 como netscape4.7 me da error: document.createElement is not a function. ¿Sabrías decirme porqué? PD: llamo a la función mediante un <a href=... y la función la tengo antes que el body.
Llevo prácticamente toda la mañana haciendo pruebas con el ordenador de un compañero de trabajo que tiene los navegadores que necesito, y he llegado a la conclusión de que no es posible hacer lo que te dije que sí... "La suposición es la madre de todas las pifias". Lo que he descubierto es, más o menos, lo siguiente. Explorer no puede crear un elemento de tipo IFRAME (esto es una limitación arbitraria, Netscape 6 sí que puede). Esto se puede arreglar usando un método llamado insertAdjacentHTML() sobre el elemento BODY de la página (permite insertar directamente código HTML, no elementos del DOM). Desgraciadamente, este método es propietario de Microsoft (no existe en el estándar del W3C), y por tanto Netscape 6 no lo implementa. Ahora bien, una vez colocado el IFRAME en Explorer, resulta que para imprimirlo no basta con llamar al método print sobre el objeto IFRAME correspondiente... Hay que pasarle el foco (mediante focus()). Pero como lo hemos creado oculto, no puede recibir el foco. Conclusión: es imposible imprimir un IFRAME oculto en Explorer. En Netscape 6 la situación no es mucho mejor. Es posible crear el IFRAME oculto sin problemas. Es posible direccionarlo para cargar en él un documento creado dinámicamente con otro IFRAME que cargue el contenido real. Y es posible mandarlo a imprimir... pero no sale (aparece sólo una parte del contenido, recortado por un borde... y partes fuera). Siento mucho haber llegado a esta situación. Yo también pensaba que si podía cargar los contenidos en un frame oculto, podría imprimirlos. Lamentablemente, no es posible debido a limitaciones de los navegadores. Supongo que en el fondo la culpa es mía por haber dado esperanzas... pero de los errores es de donde más se aprende. Siempre tienes la posibilidad de precargar el contenido de la página que vas a imprimir en un frame oculto, eso sí... <html> <head> </head> <frameset rows="100%,*" border="0"> <frame name="main" src="test.html" noresize> <frame name="printBuffer" src="testPrint.html"> </frameset> </html> En la página test.html, en un script en cabecera: function loadPage(url) { parent.frames[1].location.href=url; } function printPage() { parent.frames[1].focus(); parent.frames[1].print(); } En el cuerpo, puedes poner algo así: <input type="button" value="imprimir" onClick="loadPage('pag_a_imprimir.html')"> Nada te impide que lo saques el url de un SELECT, si quieres dar la opción de imprimir varias páginas. Y finalmente, en las páginas que quieras cargar... (en el frame printBuffer): <body onload="parent.frames[0].printPage()"> La desventaja de este método es que te obliga a fijar el evento onload en todas las páginas que quieras imprimir, y que tienes que cargar todas tus páginas en un frameset. Naturalmente, sólo funciona con páginas de tu propio sitio... Pero a cambio puedes usar cualquier navegador que admita Javascript, incluido Netscape 4 (que nunca funcionaría en el caso de usar IFRAMEs). Sólo lo he probado en Explorer 5.5 y Netscape 6, así que vuelve a escribirme si ves que hay algún problema. Lamento el discurso, pero se ha convertido en una cuestión personal...