Archivlink: javarea.de Forum > JavaScript > Cross-Browser-Registrierung
Vollständigen Link anzeigen: javarea.de Forum > JavaScript > Cross-Browser-Registrierung

Pages: [1]

geschrieben von Menore am 17.07.2009 - 23:55
N'Abend

Just mit der Lösung meiner vorherigen Probleme ergab sich ein neues,
eigentlich ist dass wonach ich gleich fragen werde nur ein Kratzen an der Oberfläche, da die Wurzel des Problems woanders liegt, aber an wird ja wohl leider nicht den IE beseitigen können.

Ein Ereignis direkt bei Seitenstart losgehe zu lassen macht man gewöhnlich mit einer alles umschließenden...

HTML-Quelltext
1: 
2: 
3: 
window.onload=funktion () {
     /*funktionen*/
}


... diese Vorgehensweise ist zwar soweit ich weiß Gang und Gebe, aber wenn man nur eine JavaScript Datei für mehrere Seiten definieren will und nicht alle Elemente auf jeder Seite vorkommen, dann hat man ein Problem, genauer gesagt der Script steigt aus.
wie umgeht man dies nun? Relativ einfach mit dem Event Listener des DOM's.
Man schreibt einfach...

HTML-Quelltext
1: 
2: 
3: 
window.addEventListener("load", hideme, false);
window.addEventListener("load", pinup, false);
window.addEventListener("load", bgColorChangeInit, false);


...vor die Betreffenden Scripts in seine Javascript-Datei und...
Voilà! und schon haben wir beliebig viele unabhängige window.onload Elemente.

Wer mehr dazu wissen will:
http://www.mediaevent.de/javascript....tener.html

So, viel erklärt, abr wo ist nun mein Problem?
Ganz einfach:

Der IE macht oben genanntes übrigens mit:

HTML-Quelltext
1: 
2: 
3: 
window.attachEvent("onload", hideme);
window.attachEvent("onload", pinup);
window.attachEvent("onload", bgColorChangeInit);


Der Befehl ist anders, es wird auf das "on" bei onload bestanden und der Boolean-Wert für useCapture entfällt (der IE kennt nur das bubbeling).
an dieser Stelle herzliches Dank an Microsoft, dass sich der IE nicht an die W3C Standards hält.
Ok, zur Ehrenrettung sei gesagt, Microsoft implementierte dieses Feature in einem sehr frühem Stadium, mittlerweile ist es aber anders und hätte damit schon längst angepasst werden müssen.

Wenn die Varianten mit attachEvent vor denen mit addEventListener stehen, dann gibt der IE eine Fehlermeldung führt die Scripts aber aus.
Ist es andersherum führt der FF die Scripte aus und ignoriert die attachEvent angaben.
Und Chrome bekommt egal wie rum das steht eine Krise und ignoriert ALLE Scripts...
Auf der oben verlinkten Seite steht eine Lösung für dieses Problem, aber die tuts bei mir irgendwie nicht.

Hätte ich mehr Ahnung von JS würd ich den Fehler wahrscheinlich selbst finden, aber momentan häng ich mich noch an kleinen Syntax Fehlern Stundenlang auf...
Sprich meine arg begrenzten Kenntnisse reichen gerade mal um funktionierenden Code einzubinden und leicht zu modifizieren...

Aber gerade steh ich wiedermal vor einem Buch mit 7-Siegeln...

Bitte, Helft mir, ich werd hier sonst noch bekloppt...

geschrieben von Danny am 18.07.2009 - 13:31
Hallo Menore,

da ich mich mit Javascript auch nur bedingt auskenne, kann ich dir zur eigentlichen Problemlösung nicht helfen.

Ich verwende für meine Projekte gerne fertige Javascript Frameworks, die einem u.a. Event Handling, DOM und ähnliches um weiten vereinfachen.

Auf der einen Seite schlank und schnell, trotzdem sehr komplex von den Funktionen und erweiterbar ist zum Beispiel jQuery ( http://www.jquery.com ).

Damit köntte man dein onLoad Problem z.B. wie folgt lösen

HTML-Quelltext
1: 
2: 
3: 
4: 
5: 
<script type="text/javascript">
    $(document).ready(function() {
        alert('onload');
    });
</script>


Die Blöcke können auch auf den Seiten verteilt mehrfach vorkommen und werden ausgeführt wenn die Seite vollständig geladen wurde.
Das ganze funktioniert in allen gängigen Browsern.

Natürlich kostet es Zeit für das Laden von dem jQuery Framework, aber gerade bei größeren Projekten erspart man sich sehr viel Code.


Gruß Danny

geschrieben von Menore am 18.07.2009 - 15:29
Ne, das ist Murks, ich hab nur 3, wenn die vierte laufen würde halt 4 Java-Scriptfunktionen in meiner Website. Im Grunde ist die Website auch etwas Blog-artig, aber das macht mir das CMS und Kommentare aller art landen im Forum (find ich sinnvoller als sich mit Trollen á là "FIRST" rumschlagen zu müssen).

Ich suche nur einen Script, der abfragt ob der Browser attachEvent von MSIE oder addEventListener von W3C unterstützt und dementsprechend die Zeilen...

HTML-Quelltext
1: 
2: 
3: 
window.attachEvent("onload", hideme);
window.attachEvent("onload", pinup);
window.attachEvent("onload", bgColorChangeInit);

...oder eben...
HTML-Quelltext
1: 
2: 
3: 
window.addEventListener("load", hideme, false);
window.addEventListener("load", pinup, false);
window.addEventListener("load", bgColorChangeInit, false);


... in den JavaScript schreibt.
Oder die Zeilen halt dementsprechend anpasst oder halt whatever macht.
Jedenfalls hat man mir von allen anderen Methoden ausdrücklich abgeraten.
Ich glaub auch was ich vorhabe geht mit:
HTML-Quelltext
1: 
2: 
3: 
4: 
5: 
6: 
7: 
8: 
9: 
10: 
function addEvent( obj, type, fn )
{
   if (obj.addEventListener) {
      obj.addEventListener( type, fn, false );
   } else if (obj.attachEvent) {
      obj["e"+type+fn] = fn;
      obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
      obj.attachEvent( "on"+type, obj[type+fn] );
   }
}

... oder mit...
HTML-Quelltext
1: 
2: 
3: 
4: 
5: 
6: 
7: 
8: 
9: 
10: 
11: 
12: 
function addEvent(obj, eventType, function, useCaption)
{
  if (obj.addEventListener) {
    obj.addEventListener(evType, function, useCaption);
    return true;
  } else if (obj.attachEvent) {
    var retVal = object.attachEvent("on"+eventType, function);
    return retVal;
  } else {
    return false;
  }
}

(Ersteres ist btw. die Lösung die vom Autor von jQuerry vorgeschlagen wurde)
Allerdings bin ich mir unsicher, was ich mit diesen Funktionen tun muss, damit die auf oben beschriebene Befehle passen.
Auf der Seite die ich verlinkt hatte stehen auch noch einige Erklärungen dazu, aber mir erschließen sich diese Nicht, da ich von JavaScript nur sehr begrenzt Ahnung habe, Jedenfall häng ich mich an derart Lappalien zur Zeit komplett auf.

geschrieben von Micha am 19.07.2009 - 14:24
HI,

ich habe nicht alles gelesen aber mir scheint, Du versuchst das Problem an der falschen Stelle zu lösen.

Zitat
 aber wenn man nur eine JavaScript Datei für mehrere Seiten definieren will und nicht alle Elemente auf jeder Seite vorkommen, dann hat man ein Problem

Welches Problem? JavaScript kennt doch if-Bedingungen. Demnach kannst und musst Du bei der Verwendung von HTML-Elementen auch deren Existenz erstmal prüfen, bevor Du damit versuchst etwas zu machen.

HTML-Quelltext
1: 
2: 
3: 
if (document.getElementById && document.getElementById("foo")) {
  // Browser kennt DOM-Methode und Element existiert, also kann ich damit was machen; sonst nicht
}


Wenn Du das machst, kann auch der onload immer feuern - im Extremfall prüft er die Bediungung und macht dann eben nichts mehr....

Gruß Micha

geschrieben von Menore am 20.07.2009 - 05:47
Zitat von: Micha am 19.07.2009 - 14:24
 
HI,

ich habe nicht alles gelesen aber mir scheint, Du versuchst das Problem an der falschen Stelle zu lösen.


Mein eigentliches Problem ist der IE, für das was ich vorhabe gibt es eine wunderbare Lösung, aber der IE kennt das mal wieder nicht und blockiert mit seinem Müll alle anderen Browser.
Es geht mir in erster Linie um die Übersichtlichkeit, mein ganzer Quelltext ist so geschrieben, dass man jeden beliebigen Block da Problem los rauskopieren und woanders einbauen kann.
Wenn man dazu noch eine gigantische js Funktion auseinanderfrimmeln muss dann gute Nacht.
Jetzt hab ich das ganze per Conditional Comments umgesetzt, die sind zwar auch ekelhaft, kann man wenigstens so schreiben, dass sie noch W3C valid sind.
auch wenn ich der Meinung bin, eigene Ressourcen für verschiedene Browser sind ein Schritt in die falsche Richtung.

Was die Sache mit dem Prüfen angeht, das war jetzt eher ein Fehler am Rande, werds einbauen.

geschrieben von Micha am 20.07.2009 - 15:39
Hi,

Du musst also unterscheiden, ob
HTML-Quelltext
1: 
window.addEventListener("load", hideme, false);


funktioniert oder

HTML-Quelltext
1: 
window.attachEvent("onload", hideme);


sehe ich das richtig?

Dann frag doch, was der Browser genau kennt und handle entsprechend:

HTML-Quelltext
1: 
2: 
3: 
4: 
5: 
6: 
if (window.addEventListener)
	alert( "window.addEventListener ist bekannt.");
else if (window.attachEvent)
	alert( "window.attachEvent ist bekannt.");
else 
	alert( "nichts ist bekannt.");



Gruss Micha


Powered by: JBB v.2.0.4 Copyright ©2000-2006, www.javarea.de.