Avatar billede peer Nybegynder
28. december 2001 - 12:44 Der er 47 kommentarer og
1 løsning

Problemer med print-funktion

Jeg har på en side lavet en printfunktion som åbner et nyt vindue, hvorefter print-boksen kommer frem. Når han har trykket ok, lukker siden igen. Funktionen virker fint indtil man har brugt den en 4-5 gange, eller det vil sige at den virker stadig men det vinduer der bliver åbnet med printindholdet er helt hvid, som om der ingen html var. Men kigger man på kilden ser det godt nok ud og printet bliver da også godt nok. Det er bare den detalje med at printindholdet ikke vises i vinduet efter en 4-5 gange.

Her er koden som bliver aktiveret når man trykker på print site.

<script type=\"text/javascript\">
function udskriv(string){
str = \"<html><head><link rel=\'stylesheet\' href=\'css/cnm.css\' type\'text/css\'><title>::: Print :::</title></head><body onload=\'window.print(), window.close();\'>\";
str += document.all[\"\"+string].innerHTML;
str += \"</body></html>\";
win = window.open(\"\", \"printer\")
win.document.write(str);
win.document.close();
}
</script>
Avatar billede kasseper Nybegynder
28. december 2001 - 12:58 #1
hvad kan der f.eks. stå i String... ?
Avatar billede peer Nybegynder
28. december 2001 - 13:04 #2
sting er navnet på den tabel jeg ønsker at skrive ud. Jeg har flere tabeller som hvert at et id. Det id tages så med som variabel når jeg kalder udskriv og den udskriver så den tabel som svaret til string.
Avatar billede kasseper Nybegynder
28. december 2001 - 13:11 #3
OK, har du prøvet at sætte et timeout ind i scriptet inden du printer, og optræder dette både i IE og i NS, man skal huske på at man ikke kan stole på hvor hutigt ting eksekveres i javascript.
Avatar billede peer Nybegynder
28. december 2001 - 13:15 #4
Kan du give et eksempel på time-outen... Jeg har kun testet det i IE, og har forekommer problemet jo som sagt.
Avatar billede nikolajdu Nybegynder
28. december 2001 - 13:17 #5
Prøv at sætte den ind i onload.

onload=\'setTimeout(\\\'window.print\\\'),500)\'

/Nikolaj
Avatar billede kasseper Nybegynder
28. december 2001 - 13:20 #6
OK, det er ikke den endelige løsning at sætte et timeout ind, men det hjælper så man kan se om det er et synkroniserings problem eller ej.
http://www.devguru.com/Technologies/ecmascript/quickref/win_settimeout.html
Du skal så bare sætte det ind inden du printer....

Alternativt, kan du prøve at fjerne dit window.print() og window.close og dit win.document.close(), Så du bare åbner vinduet, og er fejlen der så også.....!
Avatar billede peer Nybegynder
28. december 2001 - 13:24 #7
virker ikke!
Avatar billede nikolajdu Nybegynder
28. december 2001 - 13:25 #8
Damn peer du må få printet en hel del i dag :))
Avatar billede peer Nybegynder
28. december 2001 - 13:29 #9
kasseper - > Når jeg fjerner window.print() og window.close() og win.document.close(), er fejlen der ikke.
Avatar billede peer Nybegynder
28. december 2001 - 13:30 #10
nikolajdu - > hvor er det lige man poster et sprøgsmål om hvad man gør hvis ens printer går amok... hihi :)
Avatar billede nikolajdu Nybegynder
28. december 2001 - 13:33 #11
Du kan jo så prøv at sætte timeout på din window.close
Avatar billede kasseper Nybegynder
28. december 2001 - 13:47 #12
Hvis det virker når du ikke har print og close på så er det et synkroniserings problem. Så prøv det her istedet :
<script type=\"text/javascript\">
function udskriv(string){
str = \"<html><head><link rel=\'stylesheet\' href=\'css/cnm.css\' type\'text/css\'><title>::: Print :::</title></head><body>\";
str += document.all[\"\"+string].innerHTML;
str += \"<script>window.print();window.close();</script></body></html>\";
win = window.open(\"\", \"printer\")
win.document.write(str);
win.document.close();
}
</script>
Avatar billede nikolajdu Nybegynder
28. december 2001 - 13:48 #13
altså:

setTimeout(\'win.document.write(str)\',500)
setTimeout(\'win.document.close\'),500)
Avatar billede peer Nybegynder
28. december 2001 - 14:28 #14
Kasseper, din virker ikke. Det virker som om det går galt så snart <script>-elementet kommer ind i sætningen.
Nikolajdu, ved din løsning brokker den sig over at et objekt var ventet?
Avatar billede peer Nybegynder
28. december 2001 - 14:29 #15
Jeg lægger 150 point oven i til den der kan klare det.
Avatar billede nikolajdu Nybegynder
28. december 2001 - 14:30 #16
Det er sgu nok fordi jeg har levet en bummert  Der mangler en slut parentes :))

setTimeout(\'win.document.write(str)\',500)
setTimeout(\'win.document.close\'),500)
Avatar billede nikolajdu Nybegynder
28. december 2001 - 14:31 #17
Nej ikke flere point.

Du har allerede afsat langt flere end nødvendigt. Hold dig en anden gang til de normale satser. 15,30,60
Avatar billede peer Nybegynder
28. december 2001 - 14:31 #18
Hvor, i forhold til det du skrev før?
Avatar billede peer Nybegynder
28. december 2001 - 14:33 #19
Jeg givet den høje indsats fra starten af, den jeg bare skal have det her til at virke perfekt. Og med lidt flere point er der ofte nogle der synes det er mere attraktivt at svare. :-)
Avatar billede nikolajdu Nybegynder
28. december 2001 - 14:33 #20
Gah, jeg bummer lige igen :((((

setTimeout(\'win.document.write(str)\',500)
setTimeout(\'win.document.close()\',500)
Avatar billede peer Nybegynder
28. december 2001 - 14:36 #21
Det virker lidt underligt. Når jeg sætter en timer på, hvad enten det er i onload eller som du lige har skrevet nikolajdu så åbner den godt nok vinduet, men så sker der heller ikke mere. Jeg har prøvet at sætte timeren ned - men lige lidt har det hjulpet.
Avatar billede nikolajdu Nybegynder
28. december 2001 - 14:37 #22
Mange mennesker tror at flere point giver bedre resultater. Bullshit!! (undskyld udtrykket).

Du har netop spurgt i den kategori der bekymrer sig mest over pointinflation. 80% af top 10 i javascript accepterer ikke tåbeligt høje pointsatser.

Prøv f.eks at se Jumpers svar på mit spørgsmål om hans hjælp her: http://www.eksperten.dk/spm/151526

/Nikolaj
Avatar billede peer Nybegynder
28. december 2001 - 14:39 #23
Nikolaj -> det skal jeg huske til en anden gang. SORRY
Avatar billede kasseper Nybegynder
28. december 2001 - 14:40 #24
jeg må også opfordre til at du ikke bruger flere point på det her det skulle nok være til at løse, også for mindre.
Hvad med at lave 2 filer, altså din side først også en hvor alt dit script ligger i, også overfører du bare dit object, til vinduet.....
Skal det laves ved at strikke en streng sammen, som indeholder hele documentet....?
Avatar billede peer Nybegynder
28. december 2001 - 14:42 #25
Jeg med en streng som indeholder hele vinduet, men er det ikke netop det jeg gør.
Avatar billede nikolajdu Nybegynder
28. december 2001 - 14:42 #26
Nok om point bare du ikke afsætter flere :))

Du har i øvrigt en fejl i din onload:

onload=\'window.print(), window.close();\'>\";

Skal ikke være , men ;

onload=\'window.print();window.close();\'>\";
Avatar billede peer Nybegynder
28. december 2001 - 14:42 #27
Jeg = Ja ;-)
Avatar billede kasseper Nybegynder
28. december 2001 - 14:42 #28
Hvad hvis du sætter timeren op til    onload=\'setTimeout(\\\'window.print\\\'),3000)\'
For jeg er ret sikker på at det er fordi at du stopper eksekveringen af indsættlsen af din str, ved at kalde print...!

Avatar billede kasseper Nybegynder
28. december 2001 - 14:44 #29
Jamen, jeg ville bare høre om det virkelig skulle være med en streng....! Og om man ikke måtte lave det på en anden måde ?
Avatar billede peer Nybegynder
28. december 2001 - 14:48 #30
Jo, bare det kommer til at virke. Jeg er bare ude på at undgå at skulle til at lave en ekstra side til hver eneste tabel for så at printe den ud.

Der er noget jeg ikke forstår i den timeout sætning.

onload=\'setTimeout(\\\'window.print\\\'),3000)\'

den sidste parentes? Hvor hører den til?
Avatar billede nikolajdu Nybegynder
28. december 2001 - 14:51 #31
det er my bad igen. skal være:

onload=\'setTimeout(\\\'window.print()\\\',3000)\'
Avatar billede kasseper Nybegynder
28. december 2001 - 15:03 #32
OK, men du behøver jo heller ikke at lave en HTML side til hver af dine tabeller men bare en. Noget i denne stil :

Dette er din side :
<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">

<html>
<head>
    <title>Untitled</title>
</head>

<body>
<script type=\"text/javascript\">
function openThis(a)
{
win = window.open(\"test2.html\", \"printer\")
win.getThis(a);
}
</script>
<input type=\"button\" value=\"test\" onClick=\"openThis(test.innerHTML)\">
<div id=\"test\">Her står din tabel<br>
eller hvad du nu vil printe ud...</div>
</body>
</html>



Og dette er din x-tra side :

<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">

<html>
<head>
    <title>Untitled</title>
<script>

function getThis(a)
{
        test2.innerHTML = a;
        this.focus();
        this.print();
}
</script>
</head>
<body>
<div id=\"test2\"></div>


</body>
</html>


henholdsvis : test.html og test2.html, men det kan du jo bare ændre...!
Avatar billede kasseper Nybegynder
28. december 2001 - 15:05 #33
Og den kan altså klare ret store tabeller...!
Avatar billede peer Nybegynder
28. december 2001 - 15:21 #34
Ja, det virker egentlig godt nok. Men så snart man kommer på på udskrift 5 eller 7 eller hvad det nu er. Så åbner der sig godt nok en side. Men denne gang kun med titelbar og så er den bare grå. Akurat ligesom før. Det virker som om der er en buffer der bliver fyldt. Kigger man på kilden bag, er html\'en helt ok, og printet der kommer ud er da også ok. Det er bare det på skærmen det er gal med. Igen.. lige som før.
Avatar billede nikolajdu Nybegynder
28. december 2001 - 15:34 #35
Prøv at gøre det lidt anerledes. Lav en decideret printSide. så kan du også få det til at virke i Netscape.

Siden med teksten der åbner vinduet:

<html>
<body>

<a href=\"java script:void(0)\" onclick=\"window.open(\'printSide.html\',\'print\',\'height=300,width=300\');\">Åbn og print</a>

<div id=\"tilPrinter\">min tekst her :))</div>

</body>
</html>

Og så:

<html>
<head>
    <link rel=\'stylesheet\' href=\'css/cnm.css\' type\'text/css\'>
    <title>::: Print :::</title>

    <script>
   
    function printMe(){
   
    document.all[\'indHer\'].innerHTML=window.opener.document.all[\'tilPrinter\'].innerHTML

    window.print()
    setTimeout(\'self.close\',1000)   
    }
   
    </script>
</head>

<body onload=\"printMe()\">
<div id=\"indHer\"></div>

</body>

/Nikolaj
Avatar billede nikolajdu Nybegynder
28. december 2001 - 15:35 #36
sidste skal gemmes som printSide.html
Avatar billede nikolajdu Nybegynder
28. december 2001 - 15:47 #37
Hvis du laver mit script om til:

<script>
   
    ns4 = (document.layers)? true:false
    ie4 = (document.all)? true:false
       
    function printMe(){
   
    if(!ns4){
   
var hertil = (ie4)? document.all[\'indHer\'] : document.getElementById(\'indHer\');
var fraSiden = (ie4)? window.opener.document.all[\'tilPrinter\'] : window.opener.document.getElementById(\'tilPrinter\');

alert(hertil.innerHTML)
alert(fraSiden.innerHTML)
 
hertil.innerHTML = fraSiden.innerHTML

window.print()
setTimeout(\'self.close\',1000)

}else{
alert(\'Adrv du bruger Ns 4 eller ældre. Fyføj!!\')
    }
}
   
    </script>

Så virker det i Netscape 6.x og IE 4 og frem. Det kan aldrig kommer til at virke i NS 4.x på den her måde, da denne ikke understøtter innerHTML.

/Nikolaj
Avatar billede nikolajdu Nybegynder
28. december 2001 - 15:48 #38
Hov du skal lige fjerne de 2 alert()

:))
Avatar billede peer Nybegynder
28. december 2001 - 16:15 #39
Jeg kigger lige på det senere... så skal jeg nok vende tilbage.

Peer
Avatar billede peer Nybegynder
19. januar 2002 - 22:19 #40
Lukke fandt selv en løsning
Avatar billede nikolajdu Nybegynder
19. januar 2002 - 22:26 #41
Ja ja - Du ryger direkte i den sorte.
Avatar billede pelkjaer Nybegynder
19. januar 2002 - 22:30 #42
hehe..har du en \"sortDU-liste\"?
Avatar billede peer Nybegynder
19. januar 2002 - 22:54 #43
Ja.. ja sortlist mig bare det er da også det nemmeste. Men prøv lige at forklare mig hvad der er jeg skal når jeg ikke fik en bedre løsning end den jeg startede med og så lader det være som det var i starten. Jeg takker da for jeres tid som i har brugt på spørgsmålene men hvis jeg ikke får et svar jeg kan bruge hva f..... skal jeg så ?

Som jeg kan se er der da mange her på eksperten der lukker svarene når de ikke har fundet noget det kunne bruge til noget konstruktivt.
Avatar billede nikolajdu Nybegynder
19. januar 2002 - 23:06 #44
Du fik faktisk funktionelle versioner der var en hel del mere brugbare og knapt så ensporet. At du så ikke kan overskue det er jo hverken min eller andres fejl.

At der er mange der lukker deres spørgmål er også helt hen i vejret. De beder folk om at tage deres tid med at hjælpe og pisser på så dem bagefter.

Læg her mærke til hvordan vi andre gør alt for at du får den bedst mulige løsning og så lukker du til sidst med lige præcis det som alle forsvarer sig med: \"fandt selv en løsning\" - Det er sgu flot - Du har jo også lige fået alt foræret.

Tak for jeres opmærksomhed, men jeg kan ikke bruge det til en dyt. Det holder ikke en meter.

Forestil dig du sender din bil til mekanikeren og bagefter siger til ham - \"Lukker fandt selv en løsning\" - du tog hans tid/penge - Der er ingen forskel. Vi laver frivilligt arbejde herinde og værdsætter man ikke det tja, så ryger man i den sorte (Der til Fri-hash´s oplysning dog ikke findes andre steder end i hukommelsen).

/Nikolaj
Avatar billede peer Nybegynder
19. januar 2002 - 23:20 #45
Nikolaj -

Tak for dit svar. Jeg må jo nok indrømme at jeg har lavet en bommer, og en af de store endda.
Jeg kan godt selv se at det var forkert af mig at lukke et spørgsmål uden at give de personer point for deres tid og gode råd. Jeg ved godt at det ikke så meget handler om pointene, det gør det i hvert fald ikke for mig, men mere princippit i det.

Jeg skal selvfølgelig ikke lukke et spørgsmål bare fordi jeg ikke har anvendt jeres løsninger, hvilket jeg ikke har, men selvfølgelig vise at jeg er glad for jeres besvarelse og tiden i har brugt ved at hjælpe. Jeg kan kun undskylde mange gange og denne fejl vil jeg selvfølgelig ikke lave ingen. Jeg fuldte nok så mange andres eksempel... Mange gange undskyld og tak for hjælpen. Jeg vil være meget glad hvis dig og kasseper ville tage imod 75 point hver også selvom i er ligeglade med dem - men så har jeg det i hvert fald bedre.

Endnu engang undskyld.

Peer
Avatar billede nikolajdu Nybegynder
19. januar 2002 - 23:48 #46
Peer - Pointene er fuldstændigt ligegyldige, men anerkendelsen af at man har brugt tid og kræfter på noget er ikke.

Pointene er desværre kun til for det onde - Folk tror de får hurtigere/bedre svar ved at udlove 500 point - Det gør de ikke - De lokker bare folk uden forstand til. Folk der interesserer for javascript /dhtml eller whatever skal nok kigge forbi alligevel - De abbonerer jo på kategorierne.

Specielt bliver jeg rigtigt irriteret med kommentaren \"har selv fundet ud af det\" - Den kommer alt for tit og som regel gerne når man virkeligt har såret ting ud i pap.

Pointene herinde er gratis og de an bruges som tak til folk - I Flash kategorien gør vi ofte det at vi får folk til at acceptere med 0 point - Altså ingen point, men dog en venlig hilsen.

No hard feelings :))

/Nikolaj
Avatar billede peer Nybegynder
19. januar 2002 - 23:56 #47
Takker for dine no hard feeling.

Det er jeg glad for. For jeg må indrømme at jeg havde det lidt skidt over at jeg havde lukket spørgsmålet, især efter at det gik op for mig at jeg heller ikke selv vil synes det var fair.

Håber at du stadig vil svare på mine spørgsmål hvis det engang var.

Endnu engang.. igen :o)

Tak for lektionen.

Peer
Avatar billede nikolajdu Nybegynder
19. januar 2002 - 23:58 #48
fino fino :))
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester