![]() | |
![]() |
| | Thread Tools | Display Modes |
#1
| |||
| |||
|
#2
| |||
| |||
|
|
Ich hab folgenden Codeschnippsel auf einer Seite, welches mit das Pdf automatisch runterladen soll. script type="text/javascript" window.setTimeout("location.replace('/pfad/zum/Pdf.pdf')", 1000); /script Diese Website rufe ich ohne aktiviertem Javascript über eine eigene Adresse auf, dort funktioniert der automatische Download genau so wie er soll. Wenn aber Javascript aktiviert ist, soll diese Webseite mittels Ajax auf der Hauptseite nachgeladen werden, was auch wiederum wunderbar funktioniert. Allerdings streikt dann der automatische Download. Nachdem das aber schon einmal funktioniert hat, |
|
lg jakob - etwas verzweifelt |
#3
| |||
| |||
|
|
Jakobus Schuerz - usenet wrote: ^^^^^^^^ Muss das sein? |
|
Hoffentlich bist Du endlich einmal über die proprietäre innerHTML- Eigenschaft gestolpert -- das wäre nämlich eine heilsame Erfahrung. Nirgendwo steht geschrieben, dass der Inhalt von mit `innerHTML' eingefügten SCRIPT-Elementen der Script-Engine übergeben werden muss bzw. dann genauso funktionieren muss als wenn er normal geladen worden wäre. |
|
lg jakob - etwas verzweifelt 1. <http://validator.w3.org/ 2. Wenn Du statt `innerHTML' den Dokument(unter)baum Knoten für Knoten aufbaust (oder importierst), so wie es das W3C-DOM vorschreibt, sind die Chancen grösser, dass es funktioniert. 3. Ganz sicher kannst Du natürlich nur sein, wenn Du den Script-Code separat lieferst und explizit ausführst; mit JSON geht der Transport nur als String-Literal, sonst auch direkt über eine FunctionExpression. Falls nichts davon hilft, wirst Du schon *etwas* mehr Code zeigen müssen. |
#4
| |||
| |||
|
|
Thomas 'PointedEars' Lahn schrieb: Jakobus Schuerz - usenet wrote: Hoffentlich bist Du endlich einmal über die proprietäre innerHTML- Eigenschaft gestolpert -- das wäre nämlich eine heilsame Erfahrung. Nirgendwo steht geschrieben, dass der Inhalt von mit `innerHTML' eingefügten SCRIPT-Elementen der Script-Engine übergeben werden muss bzw. dann genauso funktionieren muss als wenn er normal geladen worden wäre. .... Nun ja, statt der Zeile "if (callback) callback.innerHTML = req.responseText;" habe ich 4 andere Zeilen nach langem Überlegen und probieren eingebaut. Nämlich: "while(callback.firstChild) callback.removeChild(callback.lastChild); var tmpnode = document.createElement("div"); tmpnode.innerHTML = req.responseText; callback.appendChild(tmpnode);" |
|
Hier noch mein fertiges Skript, welches ich dazu benutze, Um meine Ajax-Anfrage an einen Server zu stellen: function ajaxPost(url, postData, callback) { var req; try { req = window.XMLHttpRequest ? new XMLHttpRequest(): new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { // browser does not have ajax support } req.onreadystatechange = typeof callback == 'function' ? callback : function() { if (req.readyState == 4 && req.status == 200) { if(typeof callback == 'string') callback = document.getElementById(callback); |
|
while(callback.firstChild) callback.removeChild(callback.lastChild); var tmpnode = document.createElement("div"); tmpnode.innerHTML = req.responseText; callback.appendChild(tmpnode); } } document.getElementById(callback).innerHTML = ('<div |
#5
| |||||
| |||||
|
|
Jakobus Schuerz - usenet schrieb: |
|
Wie geht das zusammen mit "ich habe keine Ahnung von JS und will hier was lernen"? Thomas hat Dir doch erklärt, dass innerHTML nicht zuverlässig das tut, was Du erreichen willst, warum benutzt Du es hier wieder? |
|
Ein DOM-Element "callback" zu nennen, finde ich etwas ungeschickt. Mit "callback" verbindet man gemeinhin eine Funktion. |
|
Hier noch mein fertiges Skript, welches ich dazu benutze, Um meine Ajax-Anfrage an einen Server zu stellen: function ajaxPost(url, postData, callback) { var req; try { req = window.XMLHttpRequest ? new XMLHttpRequest(): new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { // browser does not have ajax support } req.onreadystatechange = typeof callback == 'function' ? callback : function() { if (req.readyState == 4 && req.status == 200) { if(typeof callback == 'string') callback = document.getElementById(callback); Lesbarer Code ist was anderes. Sooo knapp sind Variablen in JavaScript ja nun nicht, dass man da nicht noch eine spendieren könnte. |
|
while(callback.firstChild) callback.removeChild(callback.lastChild); var tmpnode = document.createElement("div"); tmpnode.innerHTML = req.responseText; callback.appendChild(tmpnode); } } document.getElementById(callback).innerHTML = ('<div Ich kann mir nur schwer vorstellen, dass das funktioniert. Wenn ich mich nicht irre, ist "callback" an dieser Stelle entweder eine Funktion (s.o.: typeof callback == 'function') oder ein DOM-Element (callback = document.getElementById(callback)). Mit beidem als Parameter sollte getElementById() eigentlich nichts Benutzbares liefern. |
#6
| |||
| |||
|
|
Weil ich dringend ein funktionierendes Skript brauche, und dieses hier tut, was es soll. Auch im IE ;-) |
|
Im Firefox funktioniert das jetzt (das Skript, welches die aufgerufene php-Seite liefert, wird ausgeführt, ein Dokument wird automatisch runtergeladen.) In Opera und IE8, sowie kazehakaze (webkit) funktioniert es nicht. Aber ich bitte euch, mir ein wenig zu Seite zu stehen. |
|
Ich rufe eine externe Seite auf, die über einen Systemcall ein Programm am Server ausführt, welches aufgrund der Formulardaten auf der Seite ein Pdf erzeugt. Und ich möchte die Ergebnisseite incl. automatischem Download auf der ursprünglichen Seite mittels Ajax einbinden. |
#7
| |||||||||
| |||||||||
|
|
Thomas 'PointedEars' Lahn schrieb: Jakobus Schuerz - usenet wrote: ^^^^^^^^ Muss das sein? Ja. ;-) |
|
Hoffentlich bist Du endlich einmal über die proprietäre innerHTML- Eigenschaft gestolpert -- das wäre nämlich eine heilsame Erfahrung. Nirgendwo steht geschrieben, dass der Inhalt von mit `innerHTML' eingefügten SCRIPT-Elementen der Script-Engine übergeben werden muss bzw. dann genauso funktionieren muss als wenn er normal geladen worden wäre. Na, warum so geladen? Bin Javascript-Anfänger und versuche mich gerade einmal auf den Boden zu kriegen. Kenn noch nicht mal wirklich die Grobheiten, wie soll ich da schon die Feinheiten von JS kennen? :-) |
|
[...] 2. Wenn Du statt `innerHTML' den Dokument(unter)baum Knoten für Knoten aufbaust (oder importierst), so wie es das W3C-DOM vorschreibt, sind die Chancen grösser, dass es funktioniert. [...] Falls nichts davon hilft, wirst Du schon *etwas* mehr Code zeigen müssen. [...] Dein zweiter Punkt hat mich dann dort hin gebracht, wo ich hin wollte. |
|
Denn du hattest recht, ich hab mir diese Funktion irgendwo aus dem Netz heimgebracht und sie hat eigentlich gut gemacht, was ich wollte. Nur halt wurden keine Skripte ausgeführt... Dann hab ich mir das näher angeschaut und versucht zu verstehen, was das Ding denn da überhaupt macht, und sah das innerHTML. |
|
Nun ja, statt der Zeile "if (callback) callback.innerHTML = req.responseText;" habe ich 4 andere Zeilen nach langem Überlegen und probieren eingebaut. Nämlich: "while(callback.firstChild) callback.removeChild(callback.lastChild); var tmpnode = document.createElement("div"); tmpnode.innerHTML = req.responseText; callback.appendChild(tmpnode);" |
|
Die Zeile mit while löscht alle allfällig vorhandenen Kinder von callback - dem Div-Container (in meinem Falle) - falls da irgendwas drinnen steht. |
|
mit createElement erzeuge ich einen neuen div-Container, in den ich mit innerHTML den Rückgabetext von req.responseText reinschreibe. Das hatte ich so schon öfter probiert, aber es kam nur unformatierter und nicht behandelter Text im Browser an. Also ging ich daran und importiere mit appendChild diesen neue Div-Container in callback. Somit wird der durch die Skript-Engine und den Renderer gewurschtelt und macht das, was er tun sollte. Schön ausschauen |
|
und die Skripte die darin sind, ausführen. |
|
Ich hoffe, ich hab das auch richtig verstanden... Aber so in etwa ist meine Auffassung von dem Skript. Hier noch mein fertiges Skript, welches ich dazu benutze, Um meine Ajax-Anfrage an einen Server zu stellen: [...] |
#8
| |||||||||
| |||||||||
|
|
Jakobus Schuerz - usenet wrote: Thomas 'PointedEars' Lahn schrieb: Jakobus Schuerz - usenet wrote: ^^^^^^^^ Muss das sein? Ja. ;-) Wie Du unschwer erkannt hast, war das eine rhetorische Frage. Bitte weglassen. Es gibt keinen vernünftigen Grund dafür, insbesondere nicht bei Berücksichtigung Deines Newsreaders. |
|
Das war eine allgemeine Bemerkung. Doch wie heisst es so schön: Getroffene Hunde bellen. (Und mit JS-Kenntnissen hat das relativ wenig zu tun, auch wenn hier eine ECMAScript-Implementation benutzt wird, um aufs DOM zuzugreifen.) |
|
[...] 2. Wenn Du statt `innerHTML' den Dokument(unter)baum Knoten für Knoten aufbaust (oder importierst), so wie es das W3C-DOM vorschreibt, sind die Chancen grösser, dass es funktioniert. [...] Falls nichts davon hilft, wirst Du schon *etwas* mehr Code zeigen müssen. [...] Dein zweiter Punkt hat mich dann dort hin gebracht, wo ich hin wollte. |
|
Sieht nicht so aus. Denn du hattest recht, ich hab mir diese Funktion irgendwo aus dem Netz heimgebracht und sie hat eigentlich gut gemacht, was ich wollte. Nur halt wurden keine Skripte ausgeführt... Dann hab ich mir das näher angeschaut und versucht zu verstehen, was das Ding denn da überhaupt macht, und sah das innerHTML. Ach?[tm] |
|
Nun ja, statt der Zeile "if (callback) callback.innerHTML = req.responseText;" habe ich 4 andere Zeilen nach langem Überlegen und probieren eingebaut. Nämlich: "while(callback.firstChild) callback.removeChild(callback.lastChild); var tmpnode = document.createElement("div"); tmpnode.innerHTML = req.responseText; callback.appendChild(tmpnode);" Ist immer noch derselbe Müll, nur mehr. |
|
Die Zeile mit while löscht alle allfällig vorhandenen Kinder von callback - dem Div-Container (in meinem Falle) - falls da irgendwas drinnen steht. Das ändert aber natürlich am innerHTML-Müll nichts. |
|
mit createElement erzeuge ich einen neuen div-Container, in den ich mit innerHTML den Rückgabetext von req.responseText reinschreibe. Das hatte ich so schon öfter probiert, aber es kam nur unformatierter und nicht behandelter Text im Browser an. Also ging ich daran und importiere mit appendChild diesen neue Div-Container in callback. Somit wird der durch die Skript-Engine und den Renderer gewurschtelt und macht das, was er tun sollte. Schön ausschauen Schönheit liegt ja bekanntlich im Auge des Betrachters. Ich finde den Code ein Augenkrebsrisiko und einen potentiellen Wartungsalbtraum. |
|
und die Skripte die darin sind, ausführen. Nein, nachweislich nicht. |
|
Ich hoffe, ich hab das auch richtig verstanden... Aber so in etwa ist meine Auffassung von dem Skript. Hier noch mein fertiges Skript, welches ich dazu benutze, Um meine Ajax-Anfrage an einen Server zu stellen: [...] Siehe (diesmal nicht zufällige) Sig. |
#9
| |||
| |||
|
|
Das hab ich auch schon festgestellt... Aber mehr als den Hinweis, dass es nicht funktioniert und das Stichwort JSON ist hier noch nicht gefalle. Ach ja. schirch wäre mein Code, und für euch nicht interessant. |
#10
| |||||||||||||||
| |||||||||||||||
|
|
Thomas 'PointedEars' Lahn schrieb: Jakobus Schuerz - usenet wrote: Thomas 'PointedEars' Lahn schrieb: Jakobus Schuerz - usenet wrote: ^^^^^^^^ Muss das sein? Ja. ;-) Wie Du unschwer erkannt hast, war das eine rhetorische Frage. Bitte weglassen. Es gibt keinen vernünftigen Grund dafür, insbesondere nicht bei Berücksichtigung Deines Newsreaders. Ich hab einen guten Grund, das hinzuschreiben, deshalb steht es auch dort. Denn mein Icedove/Thunderbird hat ca 15 Mailadressen mit unterschiedlichen Einstellungen/Identitäten zu verwalten, und eine eindeutige Bezeichnung erleichtert mir unheimlich den Zugriff auf die richtige Identität (die unterscheiden sich z.T. nur durch angehängte Sig oder eben nicht...) |
|
[...] 2. Wenn Du statt `innerHTML' den Dokument(unter)baum Knoten für Knoten aufbaust (oder importierst), so wie es das W3C-DOM vorschreibt, sind die Chancen grösser, dass es funktioniert. [...] Falls nichts davon hilft, wirst Du schon *etwas* mehr Code zeigen müssen. [...] Dein zweiter Punkt hat mich dann dort hin gebracht, wo ich hin wollte. Doch, denn ich beschäftige mich gerade mit DOM und JSON sehr intensiv und bin mittlerweile ein gutes Stück weiter. |
|
Nun ja, statt der Zeile "if (callback) callback.innerHTML = req.responseText;" habe ich 4 andere Zeilen nach langem Überlegen und probieren eingebaut. Nämlich: "while(callback.firstChild) callback.removeChild(callback.lastChild); var tmpnode = document.createElement("div"); tmpnode.innerHTML = req.responseText; callback.appendChild(tmpnode);" Ist immer noch derselbe Müll, nur mehr. Der Müll ist mehr, aber ich versteh jetzt endlich, wie ich Elemente zum DOM hinzufüge, verändere und wieder wegnehme. Und ich spiel auch schon ein wenig damit herum. Ist ganz interessant. ;-) Z.b. hab ich ein kleines Skriptchen zum leeren des betreffenden Divs um es mit neuem Inhalt zu füllen vorher mit innerHTML gemacht, jetzt mache ich es mit DOM. Das ist ein Fortschritt in der Erkenntnis für mich. |
|
Die Zeile mit while löscht alle allfällig vorhandenen Kinder von callback - dem Div-Container (in meinem Falle) - falls da irgendwas drinnen steht. Das ändert aber natürlich am innerHTML-Müll nichts. Das mag schon sein. Von euch ist ja nicht wirklich herauszubekommen, wie ich einen Text und einen Link in meine Website so nachträglich einbauen kann, dass der Link nach dem Laden des Codeschnippsels automatisch heruntergeladen wird (und je nach Userwunsch im PDF-Reader geöffnet oder gespeichert). |
|
mit createElement erzeuge ich einen neuen div-Container, in den ich mit innerHTML den Rückgabetext von req.responseText reinschreibe. Das hatte ich so schon öfter probiert, aber es kam nur unformatierter und nicht behandelter Text im Browser an. Also ging ich daran und importiere mit appendChild diesen neue Div-Container in callback. Somit wird der durch die Skript-Engine und den Renderer gewurschtelt und macht das, was er tun sollte. Schön ausschauen Schönheit liegt ja bekanntlich im Auge des Betrachters. Ich finde den Code ein Augenkrebsrisiko und einen potentiellen Wartungsalbtraum. Das mag sein. Ich hab noch keine Erfahrung in Javascript-Programmierung. |
|
Die äussere Form des Codeschnippsels stammt auch nicht von mir, und enspricht dem, was ich vielfach im Internet herumliegen gesehen habe. Hab mich nur daran mal angehalten. |
|
So what. Ich will keinen Schönheitswettbewerb gewinnen, sondern erstmal rasch dieses kleine Problem gelöst haben. Umd schönen Code mach ich mir später, wenn ich mehr Zeit habe, Sorgen. |
|
und die Skripte die darin sind, ausführen. Nein, nachweislich nicht. Das hab ich auch schon festgestellt... Aber mehr als den Hinweis, dass es nicht funktioniert und das Stichwort JSON ist hier noch nicht gefalle. Ach ja. |
|
schirch wäre mein Code, |
|
und für euch nicht interessant. |
|
Ich hoffe, ich hab das auch richtig verstanden... Aber so in etwa ist meine Auffassung von dem Skript. Hier noch mein fertiges Skript, welches ich dazu benutze, Um meine Ajax-Anfrage an einen Server zu stellen: [...] Siehe (diesmal nicht zufällige) Sig. Danke. Ich glaub, mein Auftrag in dieser NG ist damit erledigt. |
|
Soviel Suderei ist mir im Usenet noch selten untergekommen. |
|
Vielleicht findet sich ja jemand, der mir doch noch helfen und nicht nur meckern will. |
|
Es gibt auch Anfänger, auch wenn man nach vielen Jahren im Geschäft das nicht mehr glauben kann. |
|
PS: die Botschaft hab ich wohl verstanden. Ich denk mir meinen Teil. |
![]() |
| Thread Tools | |
| Display Modes | |
| |