Javascript Fotoalbum JPG in einem anderem Frame

ich habe folgendes vor:
2 Frames OBEN,UNTEN,
im Frame OBEN habe ich LINK1, LINK2,LINK3,…
wenn auf einen LINK geklickt wird soll im Frame UNTEN ein Bild angezeigt werden, wenn ein anderer LINK geklickt wird entsprechen ein anderes Bild. Dies funktioniert aber nur beim Internet Explorer und Netscape 4.7. Bei Netscape 6 passiert gar nichts, Opera verzerrt die Bilder weil er die neue Datei in die alte Größe quetschen.
Es ist wohl notwendig unten.htm jedesmal neu zu laden, aber wie bekomme ich es hin das dort direkt das richtige Bild erscheint? Ich möchte je nicht für jedes JPG ein eigenes HTML Dokument erstellen.

Gruß
Harald

die Datei mit dem Frameset habe ich nicht aufgeführt.

oben.htm

<!–
function foto(name)
{
parent.unten.bild.src=name
}
//–>
[Foto1](javascript:foto(‚datei1.jpg‘))
[Foto2](javascript:foto(‚datei2.jpg‘))

unten.htm

Hallo,

das beste ist, wenn Du Deinen unteren Frame immer wieder komplett neu beschreibst.
Es wuerde auch mit einer Division gehen, aber der Opera kann bis dato nicht mit einem layer.write() oder layer.innerHTML umgehen. Desweiteren wuerde ich die betroffenen Images vorladen:

var aryImages = new Array();

aryImages[0] = new Array(3);
aryImages[0][0] = new Image(100,100);
aryImages[0][0].src = „./Bild0.gif“;
aryImages[0][1] = „idImageName0“;
aryImages[0][2] = „theImageTitle0“;

aryImages[1] = new Array(3);
aryImages[1][0] = new Image(200,200);
aryImages[1][0].src = „./Bild1.gif“;
aryImages[1][1] = „idImageName1“;
aryImages[1][2] = „theImageTitle1“;

usw.

var defMainFrame = „NameMainFrame“; // z.B.: „unten“
var defStyleFile = „NameStyleFile“; // z.B.: „./style.css“

Ein Link auf ein Bild, das im MainFrame geladen werden soll, kann z.B. so aussehen:

[
Bild #1 anzeigen
](javascript:onLoadImg(1))

Als naechstes wird dann der gesammte HTML-String zusammengesetzt:

function onLoadImg(prmIdx)
{
var theHtmlStr = getHtmlStr(prmIdx);

with(window.frames[defMainFrame].document) {
open(„text/html“,„replace“);
write(theHtmlStr);
close();
}
}

function getTableStr(prmIdx)
{
var theImgObj = aryImages[prmIdx][0];
var theImgId = aryImages[prmIdx][1];
var theImgTitle = aryImages[prmIdx][2];

var theTableStr = „“;

theTableStr += „“;
theTableStr += „“;
theTableStr += „“;
theTableStr += „“;
theTableStr += „“;
theTableStr += „“;
theTableStr += „“;

return(theTableStr);
}

function getHtmlStr(prmIdx)
{
var theTableStr = getTableStr(prmIdx);
var theHtmlStr = „“;

theHtmlStr += „“;
theHtmlStr += „“;
theHtmlStr += „theTitleOfThisFile“;
theHtmlStr += „“;
theHtmlStr += „“;
theHtmlStr += „“;
theHtmlStr += theTableStr;
theHtmlStr += „“;
theHtmlStr += „“;

return(theHtmlStr);
}

Habe ich nicht getestet, aber sollte abgesehen von ein paar Tipfehlern meinerseits funktionieren.
CU

Hallo Vir2allender,
vielen Dank für Deine Hilfe. Du hast mir ein ganzes Stück weiter geholfen. Aber leider habe ich es noch nicht ganz ans laufen gebracht.

function onLoadImg(prmIdx)
{
var theHtmlStr = getHtmlStr(prmIdx);

with(window.frames[defMainFrame].document) {
open(„text/html“,„replace“);
write(theHtmlStr);
close();
}
}

Diese Funktion habe ich noch nicht ganz verstanden, aber sie funktioniert, nach dem ich window.parent.frames daraus gemacht habe.

Die Ergebnise mit den Browsern sind unterschiedlich, ich habe meinen Versuch mal hochgeladen unter:
http://212.20.168.5/kunden/k1143/htdocs/vir.htm frameset zum starten
vir2.htm hier steht der script
bild1.jpg
bild2.jpg

Es verhält sich immer so, als währen die Dateinamen falsch.
Mit dem IE5 kann man sich den erzeugten Quellcode anzeigen lassen, der sieht ok aus:

Hast Du noch eine Idee?
Gruß
Harald

Hallo, nochmal,

der Source-Code hat doch einen Kippfehler :smile:
Es muss im img-Tag nicht scr heissen, sondern src !!!
Dann werden auch die Bilder geladen.

Desweiteren hast Du bei Dir recht, dass es nicht window.frames[defMainFrame].document heissen sollte.
Allerdings wuerde ich nur parent.frames[defMainFrame].document schreiben und nicht window.parent.frames…
Parent ist naemlich schon ein spezieller Name fuer window, genauso wie opener oder self einer ist.
Netscape wirft naemlich einen Error bei mir: window.parent.frames[defMainFrame] has no property…
Was in diesem Zusammenhang klar sein sollte, der MSIE ist da tolleranter oder intelligenter :smile:

CU

Hallo Vir2allender,

jetzt habe ich den Code geändert IE5 zeigt nun die korrekt Bilder.
Netscape zeigt komischerweise nur das erste Bild.
muß ich bei
var aryImages = new Array();
noch etwas angeben? ich habe es mit (3) versucht hat nichts gebracht.
OPERA 5 zeigt noch garnichts an.

http://212.20.168.5/kunden/k1143/htdocs/vir.htm

Nochmals Danke
Harald

Hallo,

also mein Netscape macht es offline korrekt, wenn ich deine Seite komplett runterlade. Auf Deiner Test-Seite allerdings nicht. Da kommt die fehlermeldung:

JavaScript Error:
http://212.20.168.5/kunden/k1143/htdocs/vir2.htm, line 32:

parent.frames[defMainFrame] has no properties.

Kann es sein, das in deinem Frame „unten“ keine Source vorgeladen wird? Denn ich sehe nur:

Testseite Dieser Browser ist nicht framefähig!

Meine damit:

hat kein src="…"

Vielleicht solltest Du da eine korrekte HTML-Seite vorladen. Einfach nur:

und dem einen Namen geben (z.B.unten.htm) und auch als src=„unten.htm“ im Frame-Tag eintragen. Ich benutze naemlich selber solche Technik und da funktioniert es auch im Netscape einfach und sicher.

Tschau

Hallo Vir2allender,

du hast recht, ich habe nun noch einen leeren Frame unten reingeladen.
Aber das Problem ist vermutlich ein anderes.
Wenn man dem Browser genug Zeit gibt alle Bilder vorzuladen funktioniert es. Wenn man kurz nach erscheinen der Links einen drückt bekommt man nur das kleine Kötzchen des leeren Rahmen zu sehen. Der Browser lädt auch nicht weiter. Aber genau dieses vorladen möchte ich dem Besucher bei vielen hochauflösenden Bildern durch kleine Thumbnails eigentlich ersparen.
Man dürfte sonst erst klicken wenn alle Bilder geladen sind.

IE5 lädt das letzte Bild früher, wenn man es als erstes ansehen möchte.

OPERA 5 hat ein anderes Problem er stellt die Bilder nur da wenn einer der beiden Größenangaben width oder heigth weggelassen wird welcher ist egal. Ich habe als Beispiel mal alle 3 Varianten eingebaut.

http://212.20.168.5/kunden/k1143/htdocs/vir.htm

Hallo,

dann musst Du es so machen, dass Du auf ein Image-Object verzichtest:

var aryImages = new Array();
aryImages[0] = new Array(3);
aryImages[0][0] = „./Bild0.gif“;
aryImages[0][1] = „idImageName0“;
aryImages[0][2] = „theImageTitle0“;

In der getTableStr() Funktion sieht es dann so aus:

var theImgStr = aryImages[prmIdx][0];
var theImgId = aryImages[prmIdx][1];
var theImgTitle = aryImages[prmIdx][2];

Und das img-Tag wird dann so zusammengesetzt:

theTableStr += „“;

Ich hoffe dass dann die Bilder bei Dir besser geladen werden…
Ansonsten kann natuerlich nur das Bild anzeigt werden ueber ein Object, wenn es vollstaendig geladen wurde,
aber das ist letztendlich Browser-abhaengig.
Man kann einen Klick auf die Links solange unterbinden, bis die Bilder da sind.
Das geht auch mit JavaScript ueber die events onload, onerror sowie onabort.
Aber so eine komplizierte Loesung willst Du wohl auch nicht.

CIAO

Hallo Vir2allender,

ich bin der Lösung ein gutes Stück näher, IE5 und Netscape 4.7 und 6 verhalten sich wie sie sollen.
Das Vorladen der Bilder werde ich versuchen in den oben Frame mit 1x1 Pixel großen Bildern zu machen. Aber vermutlich wird dies gestoppt, wenn ein Link geklickt wird.
Wäre aber nicht so schlimm.

OPERA 5 mag noch nicht. Er zeigt mir ein leeres Bild an, wenn ich mit rechts darauf klicke hab ich die Möglichkeit es zu laden. Anschließend ist es im Cache und wird auch beim wechseln der Links angezeigt. Ich denke es liegt nicht an den Einstellungen des OPERA, weil die Bildr auf anderen Seiten ja sofort gezeigt werden.

Habe ich eine Möglichkeit an dieser Stelle den erzeigten HTML Code nicht nur zu tauschen, sondern bewußt auszuführen?

with(parent.frames[defMainFrame].document) {
open(„text/html“,„replace“);
write(theHtmlStr);
close();

Hast Du auch OPERA auf deinem PC?

Vielen Dank für deine bisherige Hilfe wenn ich Dich nerve sags ruhig.

Gruß
Harald