Übergabe in Funktion?
McLoi
- javascript
0 twseiten_de0 Der Martin0 Struppi0 McLoi
Hallo, Community!
Erst mal großer Dank für das Entgegenkommen! Ich sehe, daß meine Formulierung nicht gelungen ist. Aber nach mehreren Stunden Computer ist man wie ausgelaugt. Nebenbei, ich finde meinen Thread nicht mehr.
Also ...
Für die Web-Seite von meinem Vater will ich JavaScript verwenden, ich "bastele" an die zweite Version der Web-Seite. Die erste Version ist unter www.sibari-poesie-art.de zu finden. Dort sieht man viele Thumbnails von seinen Bilder.
Ich will für die neue Version die Darstellung des vergrößerten Bildes etwas schöner gestalten. Wenn man auf einem Thumbnail klickt, öffnet sich ein neues Fenster mit dem Bild. In dem neuen Fenster sollte man durch die Bildersammlung aber auch blättern können.
Meine Idee ist:
Dem Thumbnaillink (mit entsprechender Funktion) die Bezeichnung der Bilddatei als Parameter zu geben:
<a href="javascript:funOpenPictureShow('pic_03.jpg')">
<img src="../pics/pic-ref_03.jpg" width="94" height="94" border=0>
</a>
Die JavaScript-Funktion öffnet das neue Fenster mit dem entsprechenden Bild.
Vorvorgestern habe ich rum probiert und hatte das Gefühl "ICH HAB'S"! Aber ganz sauber läuft es nicht. Der JavaScript-Code sieht so aus:
function funOpenPictureShow(parPicture)
{
var varPictureWindow = window.open("bul-picture-show.htm","_blank");
varPictureWindow.document.getElementById("idBild").src = varPicturePath+parPicture;
}
Dabei tritt sporadisch ein Fehler auf, manchmal gibt's ein Bild in dem neuen Fenster und manchmal nicht.
Durch die Test-Funktion:
function funOpenPictureShow(parPicture)
{
var varPictureWindow = window.open("bul-picture-show.htm","_blank");
if(varPictureWindow.document.getElementById('idBild'))
{
alert(varPictureWindow.document.getElementById('idBild'));
varPictureWindow.document.getElementById("idBild").src = varPicturePath+parPicture;
}
else// Hier ist etwas falsch!
{
alert(varPictureWindow);
}
}
habe ich rausgefunden, daß manchmal " varPictureWindow.document.getElementById('idBild')" kein Objekt ist, nur null gemeldet wird.
Ist es überhaupt so eine Übergabe möglich oder macht mein Browser seltsames? Was kann sonst falsch sein?
Ach ja, ... wie kann man sich aus dem Forum ausloggen?
Hallo,
<a href="javascript:funOpenPictureShow('pic_03.jpg')">
<img src="../pics/pic-ref_03.jpg" width="94" height="94" border=0>
</a>
bedeutet, dass A-Tag ein Container ist, in dem ein IMG gerendet wird.
HREF im A-Tag tut irgendwas, was sich auf sein Kind also das IMG beziehen soll.
Für funOpenPictureShow() muss also neben A-Tag auch das IMG verfügbar sein.
HREF wird vorallem für Link-Bezüge benutzt.
Die Eventsteuerung z.B. zu A-Tag benötigt keinen HREF. Z.B. geht
das mit onclick etc - z.B. onclick="funOpenPictureShow('pic_03.jpg')".
Würde man onmouseover benutzen über A-Tag, dann wäre nicht mal klick nötig.
Genau genommen könnten A-Tag und IMG getrennt sein, oder A-Tag entfällt einfach (IMG in einem SPAN mit Text geht auch).
Zur Adressierung bitte nicht ID-Attribut vergessen.
IMG und A-Tag sind Kinder von document.body und nicht document.
Im Fenster varPictureWindow sind Referenzen auf den Opener nicht
automatisch bekannt (vom Opener in das erzeugte Fenster schon).
Einem Objekt im Fenster muss also eventuell der Opener bekanntgegeben werden (parent).
funOpenPictureShow(parPicture) liegt im Opener-Dokument und kann
im geöffneten Fennster ohne Referenz auf den Opener nicht bekannt sein.
Wenn das IMG im geöffneten Fenster erzeugt wird, dann kann Opener
per ID auf das IMG im geöffneten Fenster zugreifen. Ein IMG im Opener kann eh nicht im geöffneten Fenster gerendert werden.
Grund für die Misere ist, dass jede windows-Instanz selbständig ist
und nur in bestimmten Fällen auf Eltern (parent) zugreifbar sein soll (z.T. browserabhängig).
Variablen, die in einer Funktion deklariert sind, sind lokal, und werden mit Ende der Abarbeitung der Funktion ungültig - gnadenlos.
Deswegen globale Variable für Instanzen, die die Funktion überleben sollen und müssen, z.B. Zeigervariable eines offenen Fensters nach
einem Funktionsaufruf.
Gruss Tom.
Hallo twseiten_de,
Variablen, die in einer Funktion deklariert sind, sind lokal, und werden mit Ende der Abarbeitung der Funktion ungültig - gnadenlos.
Deswegen globale Variable für Instanzen, die die Funktion überleben sollen und müssen, z.B. Zeigervariable eines offenen Fensters nach
einem Funktionsaufruf.
Du solltest Dich mal mit OOP beschäftigen und zusätzlich http://aktuell.de.selfhtml.org/artikel/javascript/organisation/ lesen.
Gruß, Jürgen
<a href="javascript:funOpenPictureShow('pic_03.jpg')">
<img src="../pics/pic-ref_03.jpg" width="94" height="94" border=0>
</a>bedeutet, dass A-Tag ein Container ist, in dem ein IMG gerendet wird.
HREF im A-Tag tut irgendwas, was sich auf sein Kind also das IMG beziehen soll.Für funOpenPictureShow() muss also neben A-Tag auch das IMG verfügbar sein.
Wieso das?
HREF wird vorallem für Link-Bezüge benutzt.
Genau das möchte er auch.
Die Eventsteuerung z.B. zu A-Tag benötigt keinen HREF. Z.B. geht
das mit onclick etc - z.B. onclick="funOpenPictureShow('pic_03.jpg')".
Nein, besser:
<a href="pic_03.jpg" onclick="funOpenPictureShow(this.href)">
dann hat der Link auch ohne JS eine Funktion.
Würde man onmouseover benutzen über A-Tag, dann wäre nicht mal klick nötig.
Aber es wäre ziemlich nervig, wenn ständig irgendwelöche Fenster o.ä. aufgehen.
Zur Adressierung bitte nicht ID-Attribut vergessen.
In diesem Falle ist das völlig unnötig.
IMG und A-Tag sind Kinder von document.body und nicht document.
Quatsch. Werf nochmal einen Blick in selfhtml.
Im Fenster varPictureWindow sind Referenzen auf den Opener nicht
automatisch bekannt (vom Opener in das erzeugte Fenster schon).
Einem Objekt im Fenster muss also eventuell der Opener bekanntgegeben werden (parent).
Was?
funOpenPictureShow(parPicture) liegt im Opener-Dokument und kann
im geöffneten Fennster ohne Referenz auf den Opener nicht bekannt sein.
Spielt das hier eine Rolle?
Wenn das IMG im geöffneten Fenster erzeugt wird, dann kann Opener
per ID auf das IMG im geöffneten Fenster zugreifen. Ein IMG im Opener kann eh nicht im geöffneten Fenster gerendert werden.
Wieso nicht?
Grund für die Misere ist, dass jede windows-Instanz selbständig ist
und nur in bestimmten Fällen auf Eltern (parent) zugreifbar sein soll (z.T. browserabhängig).
Quatsch, das was du parent nennst ist opener und operner ist die Referenz auf das Fenster das ein Fenster geöfnnet hat.
Variablen, die in einer Funktion deklariert sind, sind lokal, und werden mit Ende der Abarbeitung der Funktion ungültig - gnadenlos.
Nicht ganz, Variabeln die mit var in einer Funktion deklariert werden,...
Struppi.
Hallo Struppi,
Variablen, die in einer Funktion deklariert sind, sind lokal, und werden mit Ende der Abarbeitung der Funktion ungültig - gnadenlos.
Nicht ganz, Variabeln die mit var in einer Funktion deklariert werden,...
... und nicht z.B. in Closures eingepackt werden. SetTimeout und Eventhandler sind auch ohne globale Variablen möglich.
Gruß, Jürgen
Hallo,
Nebenbei, ich finde meinen Thread nicht mehr.
wenn du gesagt hättest, worum es ging, dann hätte ihn dir bestimmt schon jemand gezeigt. ;-)
<a href="javascript:funOpenPictureShow('pic_03.jpg')">
<img src="../pics/pic-ref_03.jpg" width="94" height="94" border=0>
</a>
Dieser Code ist aus zwei Gründen unsauber. Erstens fehlt dem img-Element das vorgeschriebene alt-Attribut, und zweitens sollte man den Aufruf von Javascript-Funktionen mit dem Pseudoprotokoll javascript: möglichst vermeiden. Der JS-Aufruf ist in einem onclick-Eventhandler besser aufgehoben, und das href-Attribut soll auf eine Ressource verweisen, die dem Besucher ohne Javascript den Inhalt auf alternativem Weg zugänglich macht.
Die JavaScript-Funktion öffnet das neue Fenster mit dem entsprechenden Bild.
Vielleicht. ;-)
Wenn Javascript aktiviert ist und der Popup-Blocker (oder sonstige Browsereinstellungen) das Öffnen eines neuen Fensters duldet.
function funOpenPictureShow(parPicture)
{
var varPictureWindow = window.open("bul-picture-show.htm","_blank");
varPictureWindow.document.getElementById("idBild").src = varPicturePath+parPicture;
}Dabei tritt sporadisch ein Fehler auf, manchmal gibt's ein Bild in dem neuen Fenster und manchmal nicht.
Ja, das dürfte ein Timing-Problem sein. Durch window.open() wird das neue Fenster zwar sofort erzeugt, und auch die Anforderung der darin zu öffnenden Seite wird quasi sofort an den Server übermittelt. Aber es kann einen Moment dauern, bis diese angeforderten Daten auch wirklich da sind. Wenn dein Zugriff auf den Seiteninhalt nun schon erfolgt, bevor die Seite geladen ist, geht das schief.
Besser: Verlege das dynamische Laden des Bildes in die neu geladene Seite. Entweder mit DOM-Methoden, wie du es auch machst - dann aber erst über den onload-Handler. Oder übergib den Bildnamen als URL-Parameter und werte ihn in der neu geladenen Seite über location.search aus.
Ach ja, ... wie kann man sich aus dem Forum ausloggen?
Wie sollte man? Man loggt sich ja technisch gesehen auch nicht ein. Hier findet ja "nur" ein HTTP-AUTH statt.
So long,
Martin
function funOpenPictureShow(parPicture)
{
var varPictureWindow = window.open("bul-picture-show.htm","_blank");
varPictureWindow.document.getElementById("idBild").src = varPicturePath+parPicture;
}
Der Martin hat dich schon auf das Timing Problem hingewiesen. Du solltest einfach das was in bul-picute-show.htm als HTML Code steht, per JS in das Fenster schreibe, dass ist zuverlässiger.
Struppi.
Hallo, Community!
Danke für die vielen Ratschläge. Sie haben mich weiter gebracht. Die letzte Tage habe ich viel ausprobiert und jetzt klappt's sogar mit IE 5.0. Ich wollte dabei ein JavaScript-Kode, der knapp ist.
Der Tipp
Übergib den Bildnamen als URL-Parameter und werte ihn in der neu geladenen Seite über location.search aus.
hat sich als goldwert gezeigt. So ist es möglich Daten an das neue Fenster zu übergeben.
Dabei kommen zwei Funktionen in Einsatz. Die erste Funktion
function funOpenPictureShow(parPictureFile)
{
var varFileToOpen;
varFileToOpen = "picture-show.htm?"+parPictureFile;
window.open(varFileToOpen,"_blank");
}
wird von dem öffnenden Fenster ausgeführt. Die zweite Funktion
function funInitialisePicture()
{
var varStringLength = window.location.search.length - 1;
var varPicture = window.location.search.substr(1,varStringLength);
self.document.getElementById("idBild").src = varPicturePath+varPicture;
}
wird von dem neuen Fenster mit dem onLoad-Handler ausgeführt.
GUT ... Aber ...
Jetzt möchte ich die Funktonalität erweitern. In dem neuen Fenster soll auch der Bildtitel als Überschrift gezeigt werden. Es geht mit location.search gut. Dabei habe ich die Funktion erweitert:
function funOpenPictureShow(parPictureFile,parPictureTitleId)
{
var varPictureTitle;
var varFileToOpen;
varPictureTitle = document.getElementById(parPictureTitleId).firstChild.nodeValue;
varFileToOpen = "bul-picture-show.htm?"+parPictureFile+","+varPictureTitle;
window.open(varFileToOpen,"_blank");
}
function funInitialisePicture()
{
var varStringLength = window.location.search.length - 1;
var varString = window.location.search.substr(1,varStringLength);
var varPicture = varString.split(",");
self.document.getElementById("idBildTitel").firstChild.data = varPicture[1];
self.document.getElementById("idBild").src = varPicturePath+varPicture[0];
}
Aber die Problematik ist, daß die Web-Seite zwei sprachig ist. Die Zeichensatz-Kodierung erfolgt nach ISO-8859-5. Ich habe den Bildtitel als URL-Parameter übergeben, da kommt nur so was "??? ?? ??????".
Gibt es eine Kodierung für Zeichensätze der ISO-8859 so, daß man es als URL-Parameter übergeben kann?