JavaScript: Browserabhängiges Problem...

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

hazumu-kun

Betreff: JavaScript: Browserabhängiges Problem...

BeitragMi, Dez 22, 2010 0:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab heute mal ganz naiv ein Script runtergeschrieben um ein Menü interaktiv zu gestalten, leider funktioniert das jetzt nur in Opera.
Jeder andere Browser scheitert beim Aufrufen der "expand()" Funktion. Das Bild wird zwar geändert, aber dann hört die Funktion anscheinend schon auf.

Hat jemand eine Idee was ich falsch mache?

Code: [AUSKLAPPEN]

function expand(nodename) {
   document.getElementById(nodename+"_link").onclick="collapse('"+nodename+"')";
   document.getElementById(nodename+"_icon").src="images/collapse.png";
   document.getElementById(nodename+"_icon").onclick="collapse('"+nodename+"')";
   document.getElementById(nodename+"_menu").style="visibility: visible;";
   setCookie ("menu_expanded_"+nodename,1);
}

function collapse(nodename) {
   document.getElementById(nodename+"_link").onclick="expand('"+nodename+"')";
   document.getElementById(nodename+"_icon").src="images/expand.png";
   document.getElementById(nodename+"_icon").onclick="expand('"+nodename+"')";
   document.getElementById(nodename+"_menu").style="visibility: hidden; height: 0;";
   setCookie ("menu_expanded_"+nodename,0);
}

function setCookie (c_name,value,expiredays) {
   var exdate=new Date();
   exdate.setDate(exdate.getDate()+expiredays);
   document.cookie= c_name+"="+escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toUTCString());
}

function getCookie (c_name) {
   if (document.cookie.length>0) {
      c_start= document.cookie.indexOf(c_name + "=");
      if (c_start!=-1) {
         c_start= c_start + c_name.length+1;
         c_end= document.cookie.indexOf(";",c_start);
         if (c_end==-1) c_end= document.cookie.length;
         return unescape(document.cookie.substring(c_start,c_end));
      }
   }
   return "";
}

function init() {
   var nodes= new Array();
   nodes[0]= "Produkte";
   nodes[1]= "Downloads";
   nodes[2]= "Videos";
   for (i in nodes) {
      var ck= getCookie ("menu_expanded_"+nodes[i]);
      if (ck==1) expand(nodes[i]);
   }
}


EDIT:
Zum Thema Google: Ich weiß noch nichtmal wonach ich suche... Hab mich erst seit gestern ein wenig in Javascript eingearbeitet.

Xaymar

ehemals "Cgamer"

BeitragMi, Dez 22, 2010 0:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
function setCookie (c_name,value,expiredays)

Code: [AUSKLAPPEN]
setCookie ("menu_expanded_"+nodename,1);

Wait a second... bemerkt? da fehlt ein Parameter.

Für Firefox gibt es btw FireBug. Die Fehlerkonsole hats da auch.
Warbseite

hazumu-kun

BeitragMi, Dez 22, 2010 9:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaub daran liegt es nicht, da ein ausgelassener Parameter sich anscheinend als "null" verhält, dafür ist sogar ne Prüfung IN der Funktion, deswegen hatte ich das mit Absicht so programmiert.
Auch wenn ich ein ",null" dabeischreibe funktioniert es in Firefox immernoch nicht.

Mit Firebug kann ich nicht viel anfangen, der zeigt mir keine Fehler beim Ausführen an.

Wer mir vllt besser helfen kann wenn er das Script in (Nicht-)Aktion sieht:
http://vikenemesh.bplaced.net

Rechts im Menü, jeder Eintrag hinter dem ein "+"-Icon ist ist ausklappbar.
Wie man sieht wird das Bild geändert, aber danach passiert nichts weiter, weil folgende Zeile anscheinend nicht mehr ausgeführt wird.

Code: [AUSKLAPPEN]
   document.getElementById(nodename+"_icon").onclick="collapse('"+nodename+"')";

mpmxyz

BeitragMi, Dez 22, 2010 13:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Firefox zeigt mir diesen Fehler in der Fehlerkonsole:
Code: [AUSKLAPPEN]
Fehler: setting a property that has only a getter
Quelldatei: http://vikenemesh.bplaced.net/cms/menu.js
Zeile: 6

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Xaymar

ehemals "Cgamer"

BeitragMi, Dez 22, 2010 15:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei Minefield bekomme ich nur den Fehler das zu wenig Parameter angegeben sind.
Laut mpmxyz's Meldung ist .style nur getter(seltsam, das .style bei FireBug als Get und Set ist). versuche es doch mal mit style.visibility = ... .
Oder du kannst mal versuchen visibility durch display zu ersetzen.
Warbseite

hazumu-kun

BeitragMi, Dez 22, 2010 15:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie schaltet man denn die Fehlerkonsole an?

Und wie muss ich den Code jetzt umschreiben?

Edit:
Ein wenig Googlen hat mich zum Ziel gebracht:
*Klick*

Code: [AUSKLAPPEN]

function expand(nodename) {
   document.getElementById (nodename+"_link").setAttribute ("onclick","collapse('"+nodename+"')");
   document.getElementById (nodename+"_icon").setAttribute ("src","images/collapse.png");
   document.getElementById (nodename+"_icon").setAttribute ("onclick","collapse('"+nodename+"')");
   document.getElementById (nodename+"_menu").setAttribute ("style","visibility: visible;");
   
   setCookie ("menu_expanded_"+nodename,1,null);
}

function collapse(nodename) {
   document.getElementById (nodename+"_link").setAttribute ("onclick","expand('"+nodename+"')");
   document.getElementById (nodename+"_icon").setAttribute ("src","images/expand.png");
   document.getElementById (nodename+"_icon").setAttribute ("onclick","expand('"+nodename+"')");
   document.getElementById (nodename+"_menu").setAttribute ("style","visibility: hidden; height: 0;");
   
   setCookie ("menu_expanded_"+nodename,0,null);
}


Der Code funktioniert jetzt mit sämtlichen weitverbreiteten Browsern.

In sämtlichen Chromium Derivaten müsste es auch funktionieren.
  • Zuletzt bearbeitet von hazumu-kun am Mi, Dez 22, 2010 15:58, insgesamt 2-mal bearbeitet

Xaymar

ehemals "Cgamer"

BeitragMi, Dez 22, 2010 15:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Shift+J oder mit FireBug F12
Lösung 1:
Code: [AUSKLAPPEN]
function expand(nodename) {
   with(document){
   getElementById(nodename+"_link").onclick="collapse('"+nodename+"')";
   getElementById(nodename+"_icon").src="images/collapse.png";
   getElementById(nodename+"_icon").onclick="collapse('"+nodename+"')";
   getElementById(nodename+"_menu").style.visibility="visible";
   }
   setCookie ("menu_expanded_"+nodename,1);
}

function collapse(nodename) {
   with(document){
   getElementById(nodename+"_link").onclick="expand('"+nodename+"')";
   getElementById(nodename+"_icon").src="images/expand.png";
   getElementById(nodename+"_icon").onclick="expand('"+nodename+"')";
   getElementById(nodename+"_menu").style.visibility="hidden";
   }
   setCookie ("menu_expanded_"+nodename,0);
}


Lösung 2:
Code: [AUSKLAPPEN]
function expand(nodename) {
   with(document){
   getElementById(nodename+"_link").onclick="collapse('"+nodename+"')";
   getElementById(nodename+"_icon").src="images/collapse.png";
   getElementById(nodename+"_icon").onclick="collapse('"+nodename+"')";
   getElementById(nodename+"_menu").style.display="block";
   }
   setCookie ("menu_expanded_"+nodename,1);
}

function collapse(nodename) {
   with(document){
   getElementById(nodename+"_link").onclick="expand('"+nodename+"')";
   getElementById(nodename+"_icon").src="images/expand.png";
   getElementById(nodename+"_icon").onclick="expand('"+nodename+"')";
   getElementById(nodename+"_menu").style.display="none";
   }
   setCookie ("menu_expanded_"+nodename,0);
}


Du solltest dir jQuery angucken und lernen auch damit umzugehen. Wird dir einiges an Arbeit ersparen.
Warbseite

hazumu-kun

BeitragMi, Dez 22, 2010 15:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Shift+J bewirkt bei meinem Firefox nichts.

Dass Problem war, dass Firefox irgendwie den direkten Zugriff auf Objekt Eigenschaften verweigert hat, deswegen funktioniert der Code aus meinem Edit mit "setAttribute" jetzt.

Deine Lösung, Xaymar, würde nichts ändern, die Ausführung bricht schon vor dem Ändern des CSS ab.
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group