Javascript-Dropdown-Menü funktioniert in Opera nicht
Markus Schnitzler
- browser
Ich habe vor ein paar Tagen in ein XSL-Dokument ein Dropdown-Menü mit Javascript eingefügt. Die Einträge verweisen auf die als "Titel" bezeichneten Daten aus der dazugehörigen XML-Datei. Siehe dazu auch die frühere Diskussion
http://forum.de.selfhtml.org/?t=133654&m=866956&readmode=list
Das Menü sieht folgendermaßen aus:
<script language="JavaScript">
function surfto(form)
{
var myindex = form.dest.selectedIndex;
location = form.dest.options[myindex].value;
}
</script>
<form name="myform">
<select name="dest" size="1">
<xsl:for-each select="Film">
<option value="#{translate(Titel, ' ', '')}"><xsl:value-of select="Titel" /></option>
</xsl:for-each>
</select>
<input type="button" value="Start" onClick="surfto(this.form)" /></form>
<xsl:apply-templates />
Nun habe ich das Menü mit diversen Browsern getestet, um die Kompatibilität meiner Homepage zu gewährleisten. Im IE und in Firefox funktioniert alles problemlos. Opera hingegen stellt das Menü zwar korrekt dar, reagiert aber beim Klick auf den Start-Button nicht. Java und JavaScript habe ich in den Einstellungen des Browsers aktiviert. Was ist da los?
Die Untätigkeit von Opera wundert mich besonders, weil sonst Firefox viel strenger ist und mehr Probleme bereitet.
Hallo,
Das Menü sieht folgendermaßen aus:
<script language="JavaScript">
function surfto(form)
{
var myindex = form.dest.selectedIndex;
location = form.dest.options[myindex].value;
}
</script>
<form name="myform">
<select name="dest" size="1">
<xsl:for-each select="Film">
<option value="#{translate(Titel, ' ', '')}"><xsl:value-of select="Titel" /></option>
</xsl:for-each>
</select>
<input type="button" value="Start" onClick="surfto(this.form)" /></form><xsl:apply-templates />
Wie sieht das erzeugte XHTML aus? Was kommt also im Browser an? Bitte komplett inklusive DOCTYPE und ggf. xml-Declaration. Besser wäre ein online-Beispiel.
Nun habe ich das Menü mit diversen Browsern getestet, um die Kompatibilität meiner Homepage zu gewährleisten. Im IE und in Firefox funktioniert alles problemlos. Opera hingegen stellt das Menü zwar korrekt dar, reagiert aber beim Klick auf den Start-Button nicht. Java und JavaScript habe ich in den Einstellungen des Browsers aktiviert. Was ist da los?
Bei mir fuktioniert so etwas auch im Opera 9.00. Wobei Du natürlich nicht das gesamte location Objekt überschreiben solltest, sondern nur location.href und das SCRIPT-Element mit dem Tag <script type="text/javascript"> einleiten solltest. Aber auch so, wie Du es gemacht hast, funktioniert es bei mir im Opera 9.00.
viele Grüße
Axel
Wie sieht das erzeugte XHTML aus? Was kommt also im Browser an? Bitte komplett inklusive DOCTYPE und ggf. xml-Declaration. Besser wäre ein online-Beispiel.
Eine vorläufige Version gibt es unter
http://www.mschnitzler2000.de/Abspann/abspann.xml
Die dazugehörige XSL-Datei gibt es im gleichen Verzeichnis als abspann.xsl
Aber auch so, wie Du es gemacht hast, funktioniert es bei mir im Opera 9.00.
Was ist denn an deinem Opera anders als an meinem? Ich habe auch die aktuelle Version 9.00 und da funktioniert es leider nicht.
Hallo,
Wie sieht das erzeugte XHTML aus? Was kommt also im Browser an? Bitte komplett inklusive DOCTYPE und ggf. xml-Declaration. Besser wäre ein online-Beispiel.
Eine vorläufige Version gibt es unter
http://www.mschnitzler2000.de/Abspann/abspann.xmlDie dazugehörige XSL-Datei gibt es im gleichen Verzeichnis als abspann.xsl
Hm, Du verläßt Dich auf die XSLT-Parser in den Browsern? Ob das so eine gute Idee ist?
Was ist denn an deinem Opera anders als an meinem? Ich habe auch die aktuelle Version 9.00 und da funktioniert es leider nicht.
Ich habe es mit XHTML probiert, nicht mit XML/XSL.
Offenbar hat Opera nach dem Parsen von XML/XSL Probleme mit dem DOM.
Folgende krude Kombination von Document Object Model Core und Document Object Model HTML funktioniert jedenfalls auch im Opera:
<script type="text/javascript">
function surfto(myForm)
{
alert(myForm); // HTMLFormElement
alert(myForm.name); // myForm
alert(myForm.elements); // HTMLCollection
alert(myForm.elements.length); // 0 ? komisch!
alert(myForm.getElementsByTagName("select")); // NodeList
alert(myForm.getElementsByTagName("select").namedItem("dest")); // HTMLSelectElement
alert(myForm.getElementsByTagName("select").namedItem("dest").selectedIndex); // OK!
alert(myForm.getElementsByTagName("select").namedItem("dest").options); // HTMLOptionsCollection
alert(myForm.getElementsByTagName("select").namedItem("dest").options.length); // OK!
var mySelect = myForm.getElementsByTagName("select").namedItem("dest");
myIndex = mySelect.selectedIndex;
location.href = mySelect.options[myIndex].value;
}
</script>
<form name="myForm" action="#" method="get">
<select name="dest" size="1">
<xsl:for-each select="Film">
<option value="#{translate(Titel, ' ', '')}"><xsl:value-of select="Titel" /></option>
</xsl:for-each>
</select>
<input type="button" value="Start" onclick="surfto(this.form)" />
</form>
Das Komische ist, dass Opera das FORM-Element noch findet. Auch die Collection .elements ist da, allerdings leer. Mit DOM Core findet er dann die NodeList aller SELECT-Elemente und darin auch das mit dem Namen "dest". Dann kann er plötzlich wieder DOM HTML und findet korrekt die HTMLOptionsCollection.
viele Grüße
Axel
Also, deine Lösung beantworte ich mit einem zwiespältigen Jein.
Zunächst mal muss ich sagen, dass mir das Experten-Wissen fehlt, um deinen Anmerkungen über DOM etc. inhaltlich folgen zu können.
Deshalb habe ich den von dir vorgeschlagenen Code einfach mal in mein XSL-Dokument eingefügt und das Ergebnis getestet.
Fazit: Das Menü reagiert nun in allen Browsern, auch in Opera. Allerdings muss ich zwischen dem Klick auf den Start-Button und der entsprechenden Reaktion jedesmal mindestens 5 bis 6 von diesen Fehler-Popups wegklicken, in denen abwechselnd Dinge wie [object] und diverse Zahlen auftauchen. Insgesamt ist deine Lösung also leider auch nicht besser als mein ursprüngliches Format.
Hallo,
Zunächst mal muss ich sagen, dass mir das Experten-Wissen fehlt, um deinen Anmerkungen über DOM etc. inhaltlich folgen zu können.
Dann solltest Du das ändern oder kein DOM verwenden.
Fazit: Das Menü reagiert nun in allen Browsern, auch in Opera.
Das tut es, allerdings nicht gut, weil nicht 100%ig erkärbar.
Allerdings muss ich zwischen dem Klick auf den Start-Button und der entsprechenden Reaktion jedesmal mindestens 5 bis 6 von diesen Fehler-Popups wegklicken, in denen abwechselnd Dinge wie [object] und diverse Zahlen auftauchen.
Bitte informiere Dich, was alert() macht. Eventuell siehst Du dann, was ich mit den alert()-Anweisungen zeigen wollte und warum Du die einfach wieder aus dem Code herausnehmen kannst.
Die Lektüre des JavaScript-Kapitels in SELFHTML ist Dir auch zu empfehlen.
viele Grüße
Axel
Bitte informiere Dich, was alert() macht. Eventuell siehst Du dann, was ich mit den alert()-Anweisungen zeigen wollte und warum Du die einfach wieder aus dem Code herausnehmen kannst.
Ich gebe zu, dass ich nicht erkannt habe, dass alert für die Popups zuständig ist. Ich habe den entsprechenden Abschnitt entfernt, jetzt funktioniert es problemlos.
Was du mir damit zeigen wolltest, weiß ich jedoch überhaupt nicht. Wenn man den entsprechenden Abschnitt ersatzlos streichen kann und es dann sogar besser funktioniert, wieso macht du es dann unnötig kompliziert?
Hallo,
Was du mir damit zeigen wolltest, weiß ich jedoch überhaupt nicht.
Ich wollte zeigen, dass es eben nicht problemlos funktioniert ;-).
Wenn man den entsprechenden Abschnitt ersatzlos streichen kann und es dann sogar besser funktioniert, wieso macht du es dann unnötig kompliziert?
Das nennt sich Fehlersuche ;-). Mit alert() habe ich dafür gesorgt, dass man sieht, was bestimmte Objektaufrufe zurückliefern. Dabei war zu sehen, dass sich Opera undefiniert verhält. Mal kann er Objekte nur mit DOM Core ansprechen, mal kann er plötzlich wieder DOM HTML. Das würde ich als fehlerhaftes Verhalten bezeichnen. Da dies aber nur bei XML/XSL und nicht bei XHTML passiert, ist offensichtlich der im Opera integrierte XSLT-Parser dafür zuständig. Ich würde daraus den Schluss ziehen, dass man sich auf die in den Browsern integrierten XSLT-Parser noch nicht verlassen sollte.
viele Grüße
Axel