ugrás a tartalomhoz

(i)Frame nyomtatás

tiku I tikaszvince · 2006. Okt. 11. (Sze), 13.33
Sziasztok!

Létezik crossbrowser megoldás a következő problémára?
Van egy lapom, amin van egy iframe és egy gomb. A gombra kattintva JS-el feltöltöm a keretet tartalommal, és szeretném kinyomtatni azt. Csak az iframe tartalmát.

function printR(r) {
  var rf = document.getElementById('rframe');
  doc = rf.contentDocument;
  if (doc == undefined || doc == null) {
    doc = rf.contentWindow.document;
  }
  doc.open();
  doc.write("<html><head><title>rf</title><link rel=\"stylesheet\" type=\"text/css\" href=\"print.css\"></head><body>"+
// kb 20 sor HTML kód
"</body></html>");
  doc.close();
  rf.contentWindow.focus();
  rf.contentWindow.print();
}
Ezzel csak annyi bajom van, hogy Opera csak a teljes dokumentumot hajlandó nyomtatóra küldeni, kerettel, gombbal, soksokhejehujával...

Azok a megoldások melyek a frame+print kulcsszavakra elődugják orrukat a keresőből vagy csak Explorerben, vagy csak Firefoxban produkálják az általam várt működést.

Létezik valakinek erre bejáratott megoldása? Rosszul kerestem, vagy csak az Operához más dialektusban kell beszélnem?

köszi
tikuVoltam
 
1

print media?

Anonymous · 2006. Okt. 11. (Sze), 16.09
Es ha css-el ugyeskednel a nyomtatasi kephez az nem megoldas?

Amit betoltesz iframe-be html-t, azt style sheet-ezed.
2

sajna nem

tiku I tikaszvince · 2006. Okt. 12. (Cs), 09.54
Lehet félreérthető voltam. Én már eleve egy CSS-el megformázott dokumentumot szeretnék kinyomtatni. Azt a dokumentumot, ami az iframe-ben megjelent. Ez csak precízen elhelyezett szövegeket tartalmaz.
Az Opera, a részdokumentum helyett az iframe-et tartalmazó ("fő")dokumentumot nyomtatja.

Bár most adtál egy ötletet. Kipróbálom és elmesélem mire jutottam.
3

egy igazán ronda megoldás

tiku I tikaszvince · 2006. Okt. 12. (Cs), 11.40
mivel, nem találtam sem magyarázatot, sem megoldást a problémámra, egy igazán rettenetes megoldást szültem.
function printR(r) {
  var rf = document.getElementById('rframe');
  doc = rf.contentDocument;
  if (doc == undefined || doc == null) {
    doc = rf.contentWindow.document;
  }
  doc.open();
  doc.write("<html><head><title>rf</title><link rel=\"stylesheet\" type=\"text/css\" href=\"print.css\"></head><body>"+
// kb 20 sor HTML kód
"</body></html>");
  doc.close();
  if (navigator.appName=='Opera') {
    elements = document.body.getElementsByTagName("*");
    for (i=0; element = elements[i]; i++) {
      if (element.nodeName=='IFRAME' && element.id == 'rframe') {
        element.style.width = '95mm';
        element.style.height = '185mm';
      }
      else {
        element.oldDisplay = element.style.display;
        element.style.display = 'none';
      }
    }
    rf.contentWindow.focus();
    rf.contentWindow.print();
    for (i=0; element = elements[i]; i++) {
      if (element.nodeName=='IFRAME' && element.id == 'receptframe') {
        element.style.width = '0px';
        element.style.height = '0px';
      }
      else {
        element.style.display = element.oldDisplay;
      }
    }
  }
  else {
    rf.contentWindow.focus();
    rf.contentWindow.print();
  }
}
Kicsit bizonytalanul írom le, de arra jutottam, hogy az Operában nem működik a focus() metódus. Ez elképzelhető?

Míg ezt írtam, kipróbáltam egy másik módszert is, ami CSS media típusokkal mahinál (köszi Anonymus az ötletet).
<style type="text/css" media="screen">
iframe#rframe {
width: 0; height: 0; margin: 0; border: none;
}
</style>
<style type="text/css" media="print">
body * { display: none; }
iframe#rframe {
  display: block;
  width: 92mm;
  height: 185mm;
  border: none;
}
</style>
Ezt a módszert viszont az Explorer nem szereti, ugyanis csak egy üres keretet nyomtat ki.

Gondolkozom még tovább igy kicsit, hátha sikerült a két megoldásból valami használhatót és elegánsat kihozni. De azért ha valakinek van megoldása kérem ne tarsa magában :) Köszi.

tikuVoltam
4

no JS, only CSS

tiku I tikaszvince · 2006. Okt. 12. (Cs), 12.27
Megvan a megoldás. A fentebb említett CSS módszer, csak annyival kell kiegészítenem, hogy az iframe-ben használt CSS-ben kell egy
html, body { display: static; }
szabályt betenni.

Mégegyszer köszönet a kezdő ötletért Anonymus

tikuVoltam