Objektreferenz Event-Handler will einfach nicht
Iridium
- javascript
Abend alle zusammen!
Ich sitze seit ein paar Stunden an einen kleinem Script, welches ich für einen Kunden schreibe, aber irgendwie treffe ich auf eine Wand.
Script an sich funktioniert eigentlich, zumindest unter Chrome, Opera und Safari, alleine der Firefox und der Explorer machen mir Schwierigkeiten.
Zum Script:
In einem Container befinden sich Daten, welche in ihrer Struktur breiter sind als der Container. (Strecken Horizontal drüber.)
Über zwei Bereiche an dem linken und rechten Rand soll gescrollt werden (hierfür habe ich zwei weitere Container mit fester breite über den Hauptcontainer drübergelegt und starte über onmouseover das Script)
Dabei wird auch noch die relative Position der Maus ermittelt, sodass die Geschwindigkeit des Scrollens über den Abstand zum Rand geregelt werden kann.
So, dazu nur, damit ihr einen Überblick habt wozu das Script überhaupt dienen soll.
Der Code an sich funktioniert ja auch so (darüber ob der nun schön ist, kann man ja streiten ;-) )
Problem ist nur, dass unter Firefox und Explorer das Event zum Verrecken nicht übertragen werden möchte. (Gibt mir auch in der Fehlerkonsole immer wieder an, dass "e" nicht definiert sei.)
Genaue Fehlermeldungen:
Firefox: "e is undefined"
Explorer: "o.offsetWidth ist Null oder kein Objekt"
Hier rüber rufe ich die Funktionen auf:
document.getElementById('left').onmouseover=scrollleft;
document.getElementById('right').onmouseover=scrollright;
document.getElementById('left').onmouseout=stopscroll;
document.getElementById('right').onmouseout=stopscroll;
und so sieht das Script aus:
steps=5;
function scrollright(e) {
if(!e)e=window.event;
o=e.target||e.srco; //hier die Stelle mit dem Firefox
v=o.offsetWidth/steps; //hier die Stelle mit dem Explorer
o.onmousemove=right;
x=e.clientX;
scrollen = setInterval("document.getElementById('scrolldiv').scrollLeft+="+Math.ceil((x-o.offsetLeft-(o.offsetWidth+v))/v),1);
}
function scrollleft(e) {
if(!e)e=window.event;
o=e.target||e.srco; //hier die Stelle mit dem Firefox
v=o.offsetWidth/steps; //hier die Stelle mit dem Explorer
o.onmousemove=left;
x=e.clientX;
scrollen = setInterval("document.getElementById('scrolldiv').scrollLeft+="+Math.ceil((x-o.offsetLeft+1)/v),1);
}
function right(e){
x=e.clientX;
clearInterval(scrollen);
scrollright();
}
function left(e){
x=e.clientX;
clearInterval(scrollen);
scrollleft();
}
function stopscroll(e) {
clearInterval(scrollen);
o.style.background="none";
o.onmousemove=null;
}
Was ich nur nicht ganz verstehe ist, dass ich in einem anderen Script auf genau die selbe Art und Weise die Funktionen aufrufe, der Firefox die dort auch richtig annimmt, hier in diesem Falle jedoch nicht.
(Der Explorer hat es in dem anderen Script mal getan, jetzt jedoch will es auch nicht mehr.)
Naja, ich hoffe mal, dass mir da einen den entscheidenden Tipp geben kann zu dem Problem mit der Objektreferenz.
Ich hab da echt irgendwie ein Brett vorm Schädel.
Danke schon einmal im Vorraus!!
Hallo Iridium,
o=e.target||e.srco; //hier die Stelle mit dem Firefox
^
kann es sein, dass du src meinst?
Gruß, Jürgen
o=e.target||e.srco; //hier die Stelle mit dem Firefox
^
kann es sein, dass du src meinst?
Hi Jürgen,
danke für den Hinweis.
Hab es mir nochmal angeschaut und auch korrigiert, aber Firefox erkennt das Event immer noch nicht.
Hm, hab auch bei meinen anderen Scripten geschaut, und das "o" hat sich da auch eingeschlichen, ohne dass der Firefox ein Problem damit hätte.
Hab direkt geschaltet und gedacht, dass deswegen der Explorer Mucken machen könnte, dem ist das aber auch egal. Komisch. (Sofern weiß ich jetzt auch gar nicht, ob das ein Fehler ist oder nicht.)
http://abtesk.tristimulus.de/flubber.html (mit mauszeiger nehmen und verschieben)
hier das script: http://abtesk.tristimulus.de/slide.js
An der Stelle funktioniert es immer noch.
Also kann es eigentlich nicht daran liegen.
Es ist echt zum Mäuse melken, da es im einen Script funktioniert, in diesem hier jedoch nicht.
Mfg
Iridium
Hab es mir nochmal angeschaut und auch korrigiert, aber Firefox erkennt das Event immer noch nicht.
funktioniert ohne Probleme bei mir.
Struppi.
Mit e.srco oder e.src oder egal?
Hat mein Firefox nur kein Bock oder wie?
Das macht mich jetzt echt fertig.
Ich kann mir da auch keinen Reim drauf machen, bei dem einen funktioniert es, bei dem anderen nicht. Hier bei mir zumindest, hm.
Was das soll! Verdammte Browser.
Mfg
Iridium
Hallo Iridium,
die Version mit e.srco funktioniert im FF, aber nicht im IE. Also bring das in Ordnung.
o=e.target||e.srco;
unterscheidet zwischen IE und FF. Der FF nimmt e.target, der IE kennt das nicht und nimmt das undefinierte e.srco statt e.src.
Gruß, Jürgen
Was habt ihr denn für Versionen, wobei ich nicht glauben kann, dass es daran liegt.
Ich hab noch mit zwei Freunden gegengeprüft, und es auch an einem anderen Rechner probiert.
Egal ob ich e.src oder e.srco setze, oder sonst was.
Es will einfach nicht funktionieren. Weder bei meinen Freunden, noch am anderen Rechner.
Und die haben wohlgemerkt alle unterschiedliche Versionen von Firefox und Explorer.
Also bin ich quasi alles durch.
Jetzt unabhängig davon, ob der Explorer nicht e.srco sondern e.src braucht, habs korrigiert natürlich, um auf der sicheren Seite zu sein.
Aber hier bei mir funktioniert es nicht, und ich muss nochmal betonen, dass die anderen Scripte selbem Aufbau im Firefox funktionieren.
Da kann ich mir keinen Reim drauf machen.
Naja, aber anscheinend ist es kein Problem mit dem Script (abgesehen von der srco-src Sache natürlich) wenn es bei euch doch funktioniert.
Sofern ihr aber ne Idee habt, was mit den Browsern nicht stimmen könnte, nehme ich das gerne an. ;-)
Ansonsten bedanke ich mich herzlichst für eure Hilfe!!
Mfg
Iridium
Was habt ihr denn für Versionen, wobei ich nicht glauben kann, dass es daran liegt.
Im Fx 3.5.5 und Op 10 funktioniert die Seite - im IE 6 dagegen nicht, weil du nach wie vor den Fehler im Skript hast. Dann ist die Seite im Quirksmode, was auch nicht zu empfehlen ist, es wäre besser du änderst das.
Struppi.
»»im IE 6 dagegen nicht, weil du nach wie vor den Fehler im Skript hast.
Nein ist er nicht, ich habe den Fehler schon längst korrigiert.
»»Dann ist die Seite im Quirksmode, was auch nicht zu empfehlen ist, es wäre besser du änderst das.
Tut der Quirksmode was zur Sache? Eigentlich nicht. Das ändert nichts am Javascript, und der Quirksmode reicht aus, um Scripte zu testen, oder etwa nicht? Ist jetzt ernst gemeint die Frage, ich weiß nicht, ob der was an der Javascriptinterpretation ändert.
Ich weiß, dass das Script funktioniert im Firefox und Opera.
Viel mehr ist auch hier das Problem. Obwohl da keins sein dürfte, da das Event wie in dem funktionierenden Script übergeben wird.
Das ist ja hier die Problematik an der Sache.
Mfg
Iridium
Hi,
Tut der Quirksmode was zur Sache? Eigentlich nicht.
Doch, sehr wohl.
Das ändert nichts am Javascript, und der Quirksmode reicht aus, um Scripte zu testen, oder etwa nicht? Ist jetzt ernst gemeint die Frage, ich weiß nicht, ob der was an der Javascriptinterpretation ändert.
Die Fehlertoleranz ist höher - insb. in Bezug auf das Zusammenspiel mit CSS.
Du kannst über das style-Objekt einem Element einen rein nummerischen Wert für eine Eigenschaft zuweisen, die aber laut Spezifikation einen Wert mit einer Einheit verlangt. Im IE funktioniert das soweit ich weiss im Quirksmode immer, unabhängig von der Eigenschaft.
Wenn du dann später dein Script in eine Seite im Standard Compliant Mode einbaust, wirst du dich vermutlich erst mal wundern, warum dein Script dann nicht mehr das gewünschte tut.
Ich weiß, dass das Script funktioniert im Firefox und Opera.
Viel mehr ist auch hier das Problem.
Da bekomme ich auch im Firefox (3.5.5) Fehlermeldungen in der Zeile, wo du in der Funktion scrollright das target des Events zu ermitteln versuchst -
e is undefined
http://www.tristimulus.de/abtesk/test.html
Line 61
Obwohl da keins sein dürfte, da das Event wie in dem funktionierenden Script übergeben wird.
Du betrachtest hier offenbar nur die Stelle, wo scrollright über den Eventhandler aufgerufen wird - und vergisst dabei diese Stelle hier:
function right(e){
x=e.clientX;
clearInterval(scrollen);
scrollright();
}
In right rufst du am Ende scrollright auf - aber ohne das Event-Objekt als Parameter zu übergeben.
Damit ist zu Beginn dieser Funktion dann nicht nur im IE e undefiniert, sondern auch im Firefox. Im IE klappt es, stattdessen mit der Zeile
if(!e)e=window.event;
dafür zu sorgen, dass e in den nachfolgenden Zeilen definiert ist und einen Wert hat - aber im Firefox wird nur undefined zugewiesen, weil der window.event nicht kennt. Damit ist e dann zwar deklariert, hat aber im folgenden immer noch kein Wert, der seinerseits Eigenschaften besäße, auf die zugegriffen werden könnte - was dein Script aber trotzdem versucht.
MfG ChrisB
Du betrachtest hier offenbar nur die Stelle, wo scrollright über den Eventhandler aufgerufen wird - und vergisst dabei diese Stelle hier:
function right(e){
x=e.clientX;
clearInterval(scrollen);
scrollright();
}
Jou, die hab ich komplett misachtet. Habs Objekt jetzt mit übertragen, funktioniert.
Jetzt im Nachhinein ist es natürlich offensichtlich, dass es da anscheinend fehlt, bin aber vorher davon ausgegangen, dass es automatisch übertragen würde. Blöder Fehler von mir.
Danke. Werde demnächst drauf achten auch wirklich alle Objektreferenzen zu übertragen.
Zu dem Quirksmode. Hab darüber gelesen, dass mittlerweile alle Standardbrowser den unterstützen, von daher meine Verwunderung.
Aber natürlich ist es besser dem W3C-Standard zu folgen.
Mfg
Iridium
Hi,
Zu dem Quirksmode. Hab darüber gelesen, dass mittlerweile alle Standardbrowser den unterstützen, von daher meine Verwunderung.
Da hast du entweder etwas falsch verstanden, oder es war falsch beschrieben - „unterstützen” ist nicht der passende Begriff, „aufweisen” trifft es vielleicht besser.
Ursprünglich war der Quirks Mode eine Erfindung von MicroSoft, um Abwärtskompabilität zu sichern, ohne das zahlreiche bestehende Webseiten angepasst werden müssten.
Andere Browser haben das Konzept mittlerweile (zum Teil nur teilweise) übernommen, und imitieren im Quirks Mode auch Fehler ihrer Vorgängerversionen.
Das mag zwar erst mal gut erscheinen, wenn man eine bestehende Seite beim Erscheinen einer neuen Browserversion nicht anpassen muss. Aber es bringt langfristig mehr Probleme mit sich, als es löst.
In die „andere Richtung” zu arbeiten, bietet sich in der Praxis eher an. Man erstellt eine (neue) Seite erst mal konform zu den aktuell(st)en Standards, und erzielt in aktuellen Browsern damit auch passende Ergebnisse. Dann schaut man sich an, was ältere Browserversionen dabei ggf. falsch darstellen/interpretieren - und behebt diese Mängel dann mit CSS-Hacks/Conditional Comments* bzw. vergleichbaren Methoden gezielt.
MfG ChrisB
* ich erwähne beide, möchte damit aber nicht den Glaubenskrieg diesbezüglich wieder anheizen :-)
Liebe(r) Iridium,
o=e.target||e.srco; //hier die Stelle mit dem Firefox
der IE kennt kein e.srco (wie bereits angemerkt wurde). Bei quirksmode.org steht, was er stattdessen kennt.
Liebe Grüße,
Felix Riesterer.
Danke für den Tipp!!
Der Explorer macht keine Mucken mehr.
Danke danke!
Mfg
Iridium