Stack overflow vermeidbar?
Sven Franck
- javascript
0 MudGuard0 Sven Franck
0 Maxx
Hallo,
habe ein Script, dass einen Array mit 75 Images durchläuft, Fehlbilder überspringt und existierende Bilder in einem Table abbildet.
Problem:
Wenn nur wenige Bilder im Array enthalten sind, erhalte ich stets einen Stack Overflow error, da der "Bilderzähler" nicht bei 75 anhält, sondern munter weiterzählt.
Frage:
Kann man diesen stack overflow Error irgendwie vermeiden???
Mit return true funktioniert es nicht, weil dass Script dann nicht mehr durchläuft.
Den Zähler auf auf 75 zu begrenzen, wäre fein, aber leider kommt der overflow Error schon bei einem Stand von ca. 30!!! Würde aber gerne den gesamten Array mit den 75 Bildern durchsuchen.
Vielen Dank für die Hilfe,
Sven
Hi,
habe ein Script, dass einen Array mit 75 Images durchläuft, Fehlbilder überspringt und existierende Bilder in einem Table abbildet.
Problem:
Wenn nur wenige Bilder im Array enthalten sind, erhalte ich stets einen Stack Overflow error, da der "Bilderzähler" nicht bei 75 anhält, sondern munter weiterzählt.
Kann man diesen stack overflow Error irgendwie vermeiden???
Ja.
Du mußt in der 17. Zeile ein ; ans Zeilenende setzen. *)
*) Du erwartest, daß wir hellsehen?!
cu,
Andreas
Naja, hab ich mir fast gedacht, dass ich ein wenig mehr ins Detail gehen sollte...
Folgend Script mit ein wenig Instruktionen und hoffentlich ausreichend zusammengekürzt.
<!--
//globals
var catory = "012"
var Saison = 8;
var i = "";
var s = "";
var a = "";
var y = 0;
var stopper = 0;
var mistakecounter = "";
//array
container = new Array ();
for (i=0; i<76; ++i) {
if (i<10) {
j = "0" + i;
} else {
j = i;
}
container[i] = new Image (50,50);
container[i] = catory + "-" + Saison + "-" + [j] + ".jpg";
}
//main part
s = 0;
var Pix = container[s];
testImage (Pix);
//------------start function loop-----------------
//initial
function testImage(Pix)
{
var tester=new Image();
tester.onload=Wasda;
tester.onerror=Nixda;
tester.src=Pix;
}
//Bild vorhanden
function Wasda()
{
y = ++y;
document.all.tags("div")[y].innerHTML = "<img src='T" + container[s] + "' name='"+"Bild"+ s + "' border=0 height=50px width= 50px alt='' onclick='NLarge(name);'>";
y = ++y;
var Pix = container[s];
var DisplayMain = Pix.slice(Pix.length-Pix.length,[Pix.length-4]);
document.all.tags("div")[y].innerText = DisplayMain;
//anhalter, fuer den Table
if (stopper <=20)
{
stopper = ++stopper;
s = ++s;
var Pix = container[s];
testImage (Pix);
}
}
//kein Bild vorhanden
function Nixda()
{
mistakecounter = ++mistakecounter
s = ++s
if (mistakecounter<18)
{
Pix = container[s];
testImage (Pix);
}
// HIER KOMMT DER STACK OVERFLOW; WENN MISTAKECOUNTER > 18 wird!!!
}
//------------Ende function loop-----------------
//onclick Function
function NLarge (name){
//extract s aus URL
var merker = document.all[name].src;
var merker2 = merker.slice(merker.length-6, [merker.length]);
var merker3 = merker2.slice(merker2.lenght-merker2.length, [merker2.length-4]);;
if (merker3.charAt(0) == 0) {
var merker4 = merker3.slice(merker3.length-1, [merker3.length]);
} else {
var merker4 = merker3;
}
var s = merker4;
var Display = container[s];
//extract Name of jpg aus URL
Display2 = Display.slice(Display.length-Display.length, [Display.length-4]);
Detail = window.open ("Detail.html", "Detail", "toolbar=no,...");
//open large version in new picture
window.Detail.document.write("<...>")
window.Detail.document.write("<...>");
}
//-->
Hoffe man wird schlau draus und jemand kann mir weiterhelfen...
Merci nochmal
Sven
Naja, hab ich mir fast gedacht, dass ich ein wenig mehr ins Detail gehen sollte...
Folgend Script mit ein wenig Instruktionen und hoffentlich ausreichend zusammengekürzt.
<!--
//globals
var catory = "012"
var Saison = 8;
var i = "";
var s = "";
var a = "";
var y = 0;
var stopper = 0;
var mistakecounter = "";//array
container = new Array ();
for (i=0; i<76; ++i) {
if (i<10) {
j = "0" + i;
} else {
j = i;
}
container[i] = new Image (50,50);
container[i] = catory + "-" + Saison + "-" + [j] + ".jpg";
}//main part
s = 0;
var Pix = container[s];
testImage (Pix);//------------start function loop-----------------
//initial
function testImage(Pix)
{
var tester=new Image();
tester.onload=Wasda;
tester.onerror=Nixda;
tester.src=Pix;
}//Bild vorhanden
function Wasda()
Ich weiss nicht ob dir das nicht gesagt wurde als du das letzte Mal gefragt hast, aber in dieser Funktion ist this gleich dem Bild. D.h. src = this.src und width = this.width usw.
Und du musst die Funktion nicht immer neu aufrufen, da du sie in einer Schleife aufrufen kannst:
for(var i = 0; container[i]; i++) testImage(container[i]);
Das ruft dann für alle Bilder die entsprechende Funktion auf, wenn du allerdings sicher gehen willst, das die nacheinander aufgerufen werden musst du in der onload/error Funktion das nächste Bild aufrufen am besten mit setTimeout.
und das sollte das Hauptproblem lösen.
Naja, hab ich mir fast gedacht, dass ich ein wenig mehr ins Detail gehen sollte...
Folgend Script mit ein wenig Instruktionen und hoffentlich ausreichend zusammengekürzt.
Bah mir ist gar nicht aufgefallen was da in dem Skript noch alles drin steckt. Auweia.
<!--
//globals
var catory = "012"
var Saison = 8;
var i = "";
var s = "";
var a = "";
var y = 0;
Sowas GLobal zu deklarieren ist sehr gefährlich und kann dich am Schluss einige Stunden debuggen kosten.
var stopper = 0;
var mistakecounter = "";//array
container = new Array ();
for (i=0; i<76; ++i) {
if (i<10) {
j = "0" + i;
} else {
j = i;
}
container[i] = new Image (50,50);
container[i] = catory + "-" + Saison + "-" + [j] + ".jpg";
Erst weist du dem Element ein Image Objekt zu und dann doch ein String. Wenn dir die Reihenfolge der Bilder egal ist würde ich die erste Variante verwenden und das Objekt um die Eigneschaften die du benötigst erweitern.
container[i] = new Image ();
container[i].onload=Wasda;
container[i].onerror=Nixda;
container[i].src = catory + "-" + Saison + "-" + [j] + ".jpg";
}
//main part
s = 0;
var Pix = container[s];
testImage (Pix);
Der 'main Part' ist dann überflüssig.
//------------start function loop-----------------
//Bild vorhanden
function Wasda()
{
y = ++y;
document.all.tags("div")[y].innerHTML = "<img src='T" + container[s] + "' name='"+"Bild"+ s + "' border=0 height=50px width= 50px alt='' onclick='NLarge(name);'>";
Das ist IE 4.x syntax, du solltest dich mal mit neueren Browsern beschäftigen.
wie gesagt container[s] ist this.src
y = ++y;
var Pix = container[s];
var Pix = this.src;
var DisplayMain = Pix.slice(Pix.length-Pix.length,[Pix.length-4]);
Keine ahnung was du da genau willst, ich vermute mal den Dateinnamen.
document.all.tags("div")[y].innerText = DisplayMain;
all.tag() ist IE 4.x
//anhalter, fuer den Table
if (stopper <=20)
{
stopper = ++stopper;
Du musst hier stopper nichts zuweisen stopper++ erhöht bereits stopper um eins auch ohne Zuweisung.
s = ++s;
dito.
var Pix = container[s];
testImage (Pix);
Nicht mehr nötig.
}
}//kein Bild vorhanden
function Nixda()
{
mistakecounter = ++mistakecounter
s = ++s
if (mistakecounter<18)
{
Pix = container[s];
testImage (Pix);
}
// HIER KOMMT DER STACK OVERFLOW; WENN MISTAKECOUNTER > 18 wird!!!
Nixda() ist eigenlich auch nicht mehr nötig. Da in wasDa() ja schon mitgezählt werden kann, wieviele Dateien erfolgreich angezeigt wurden.
Struppi.
Naja, hab ich mir fast gedacht, dass ich ein wenig mehr ins Detail gehen sollte...
Folgend Script mit ein wenig Instruktionen und hoffentlich ausreichend zusammengekürzt.
Bah mir ist gar nicht aufgefallen was da in dem Skript noch alles drin steckt. Auweia.
<!--
var catory = "012"
var Saison = 8;
var i = "";
var s = "";
var a = "";
var y = 0;//array
container = new Array ();
for (i=0; i<76; ++i) {
if (i<10) {
j = "0" + i;
} else {
j = i;
}
container[i] = catory + "-" + Saison + "-" + [j] + ".jpg";Erst weist du dem Element ein Image Objekt zu und dann doch ein String. Wenn dir die Reihenfolge der Bilder egal ist würde ich die erste Variante verwenden und das Objekt um die Eigneschaften die du benötigst erweitern.
container[i] = new Image ();
container[i].onload=Wasda;
container[i].onerror=Nixda;
container[i].src = catory + "-" + Saison + "-" + [j] + ".jpg";}
function Wasda()
{
y = ++y;
document.all.tags("div")[y].innerHTML = "<img src=...'>";Das ist IE 4.x syntax, du solltest dich mal mit neueren Browsern beschäftigen.
wie gesagt container[s] ist this.srcy = ++y;
var Pix = container[s];var Pix = this.src;
document.all.tags("div")[y].innerText = DisplayMain;
all.tag() ist IE 4.x
Nixda() ist eigenlich auch nicht mehr nötig. Da in wasDa() ja schon mitgezählt werden kann, wieviele Dateien erfolgreich angezeigt wurden.
Struppi.
Danke erstmal für die Hilfe.
Bin nicht der 24/7 Programmierer und habe auch nur eine alte JavaScript Fibel zur Hand!
Gruss
Sven
Hallo Sven,
Den Zähler auf auf 75 zu begrenzen, wäre fein, aber leider kommt der overflow Error schon bei einem Stand von ca. 30!!! Würde aber gerne den gesamten Array mit den 75 Bildern durchsuchen.
Ich versuche mich mal im Wahrsagen: Du rufst deine Funktion rekursiv auf. Der overflow Error kommt nicht nach 30 Bildern sondern nach ca. 2250 Bildern (75 * 30)
Aber ohne Codeschnipsel ... ? Vielleicht täuscht sich meine Kristallkugel ja auch ;-)
ffbx
Maxx