Javascript problem

PH

Legendäres Mitglied
Hallo

Ich ein Problem mit einem Javascript.
Das jetztige script funktioniert im IE 5.5 IE 6 und IE 7 aber nicht im Firefox.

Es handelt sich um eine Listbox, die ihre Werte automatisch aktualisieren soll, basierend auf einer anderen Listbox.

Struktur:
CODE <form name="Search_hotels">

listbox1 name="s_country"
listbox2 name="s_city"

</form>


der eigentliche code:

QUOTE
<script language="Javascript">
var cats = new Array();

cats["All"] = "";cats["Bangkok#2"] = "2#4";cats["Chiang Mai#5"] = "5#4";cats["Hua Hin#6"] = "6#4";cats["Pattaya#3"] = "3#4";cats["Phuket - Patong#4"] = "4#4";cats["Singapore#1"] = "1#1";

function set_subcat(fform,llb1,llb2,ccats) {
lb1 = window.document.all[llb1];
lb2 = window.document.all[llb2];

index = lb2.selectedIndex;
if ( index<0 ) index = null;
if (lb2.options[index] != null) {
val = lb2.options[index].value;
} else {
val = null;
}

key=lb1.options[lb1.selectedIndex].value.toString().split('#')[0];

for (i=window.document.forms[fform].elements[llb2].options.length; i >=0 ; i--) {
window.document.forms[fform].elements[llb2].options=null;
}
var i = 1 ;
window.document.forms[fform].elements[llb2].options = new Option("","",false,false);
for (iter in ccats) {
tmp = ccats[iter.toString()].split("#")[1];
tmp2 = ccats[iter.toString()].split("#")[0];
if (tmp==key) {
if (tmp2==val) {
window.document.forms[fform].elements[llb2].options = new Option(iter.toString().split("#")[0],ccats[iter.toString()],true,true);
window.document.forms[fform].elements[llb2].options.selected = true;
}
else{
window.document.forms[fform].elements[llb2].options = new Option(iter.toString().split("#")[0],ccats[iter.toString()],false,false);}
i++;
}
}
}

function set_subcat2() {
set_subcat("Search_hotels","s_country","s_city",cats);
}

window.document.Search_hotels.s_country.onchange = set_subcat2;

set_subcat("Search_hotels","s_country","s_city",cats);



obiges funktioniert gut in allen IE Versionen, jedoch *nicht immer* im Firefox.

ich probiere nun das Script für alle Browser anzupassen.
dies impliziert auch, document.all durch etwas anderes zu ersetzen.

Leider funktioniert das Script dann nicht mehr im IE.
Ich habe get ElementByName getElementsByName getElementByNameTag und getElementById ausprobiert.

Wer kann mit helfen, dass das Script mindestens in IE 5.5, IE 6, IE 7 und FF 2 und FF 3 funktioniert?
 
Ich verwende eigentlich fast nur noch

document.forms['Formularname'].elements['RadiobuttonName'][1]

für den Zugriff auf zusammengehörende Radiobuttons und

document.getElementById

für den Zugriff auf ein einzelnes Element.

Das sollte auch im IE klappen.
 
Danke Jürgen!

bin einen Schritt weiter... ich habe document.all erfolgreich durch document.getelementsById ersetzt, und das Script funktioniert weiterhin im IE.

Jedoch immer noch nicht in Firefox.

Dieser beschwert sich über die Fehlerkonsole darüber, dass lb2 null ist.

es muss sich um diese Zeile handeln:
CODE index = lb2.selectedIndex;


Der FF, diese Mimose.
lb2 ist null. Na und? dem IE ist das egal... Mist.


Wo müsste ich noch ansetzen, damit das Script im FF auch funktioniert?
 
QUOTE (PH @ Di 23.12.2008, 22:23)Wo müsste ich noch ansetzen, damit das Script im FF auch funktioniert?

Poste mal den Code davor. Da wird wohl irgendwo ein Fehler drin sein.

Ansonsten so etwas wie


CODE if (!lb2) {return; }


Aber besser ist es, zu kapieren, warum die Variable nicht belegt ist.
 
gelöst... aber irgendwie möchte ich es selbst nicht glauben...

ich hatte noch dasselbe snippet auf einer anderen Seite, und IE sowie FF muckten dort nicht.


Ich habe festgestellt, dass beide Seiten zwar als HTML 4.01 transitional deklariert waren, jedoch beinhaltete die neuere Seite noch eine URL zu den DTD Standards.

Ich habe diese URL in der DTD gelöscht - jetzt funktioniert das Script in beiden browsern.
Ich bin baff. Die FF JS Konsole gibt auch keine Fehler mehr von sich.

Zur Veranschaulichung, hier ist der Snippet, der jetzt in FF und IE funktioniert:
Ich bin sehr verstört durch diese Tatsache und werde diese Nacht schlecht schlafen
laugh.gif


CODE
<script language="Javascript">

var cats = new Array();

<!--Begincats-->
cats["All"] = "";cats["Bangkok#2"] = "2#4";cats["Chiang Mai#5"] = "5#4";cats["Hua Hin#6"] = "6#4";cats["Pattaya#3"] = "3#4";cats["Phuket - Patong#4"] = "4#4";cats["Singapore#1"] = "1#1";
<!--Endcats-->

function set_subcat(fform,llb1,llb2,ccats) {
 lb1 = document.all[llb1];
 lb2 = document.all[llb2];

index = lb2.selectedIndex;
if ( index<0 ) index = null;
 if (lb2.options[index] != null) {
val = lb2.options[index].value;
 } else {
  val = null;
}

key=lb1.options[lb1.selectedIndex].value.toString().split('#')[0];

 for (i=document.forms[fform].elements[llb2].options.length; i >=0; i--) {
  document.forms[fform].elements[llb2].options[i]=null;
  }
 var i = 1;
 document.forms[fform].elements[llb2].options[i] = new Option("","",false,false);
 for (iter in ccats) {
    tmp = ccats[iter.toString()].split("#")[1];
           tmp2 = ccats[iter.toString()].split("#")[0];
       if (tmp==key) {
               if (tmp2==val) {
       document.forms[fform].elements[llb2].options[i] = new Option(iter.toString().split("#")[0],ccats[iter.toString()],true,true);
document.forms[fform].elements[llb2].options[i].selected = true;
}
               else{
       document.forms[fform].elements[llb2].options[i] = new Option(iter.toString().split("#")[0],ccats[iter.toString()],false,false);}
 i++;
       }
 }
}

function set_subcat2 () {
set_subcat("Search_hotels","s_country","s_city",cats);
}

document.Search_hotels.s_country.onchange = set_subcat2;

set_subcat("Search_hotels","s_country","s_city",cats);
</script>

 
QUOTE (PH @ Mi 24.12.2008, 00:08)Ich habe festgestellt, dass beide Seiten zwar als HTML 4.01 transitional deklariert waren, jedoch beinhaltete die neuere Seite noch eine URL zu den DTD Standards.

Ich habe diese URL in der DTD gelöscht - jetzt funktioniert das Script in beiden browsern.
Ich bin baff. Die FF JS Konsole gibt auch keine Fehler mehr von sich.

Mich wundert eher, daß das mit Html 4.01 überhaupt funktioniert.

Ich nutze ausschließlich XHtml.1, so daß der Dokumentbaum immer korrekt ist und es zu jedem geöffneten Element ein korrespondierendes schließendes Element gibt.

Das ist eigentlich für alle JavaScript - DOM - Techniken unverzichtbar.

Vermutlich switcht der Browser beim Entfernen der Url endgültig in den 'maximalen Quirks-Modus' und zeigt deshalb keinen Fehler mehr an, ist toleranter.

Steht die Url noch mit dabei, dann ist er 'etwas kritischer'.

Das ist also eher ein schlechtes Zeichen
laugh.gif
 
QUOTE Ich nutze ausschließlich XHtml.1


Du bist ja auch ein richtiger Profi - das ich Webseiten nur als Nebenerwerb betreibe, habe ich nicht die Zeit, alles richtig zu machen, vor allem wenn meine Seiten aus mehreren zusammengeklebten Scripten/CMS/PHP-Applikationen unterschiedlicher Güte und Alter (Teilweise 6 Jahre) bestehen.
Ich bin schon froh, wenn alles überhaupt nur in beiden Browsern funktioniert.

Ich werde wahrscheinlich mehr Wert auf Coding-Standards legen, wenn ich den Schritt zum Vollzeit-Webtycoon schaffe.

Danke jedenfalls für die Hilfe bei diesem Javascript-Quark.

Nach meiner Erfahrung mit diesen Fehlern werde ich aber den Eindruck nicht los, dass man die Standards manchmal zu strikt gestaltet hat.
z.B. diese Weigerung, lb2 einen Wert zu geben - welchen Sinn hatte das?
Warum wurde das Element nicht gefunden, wo es doch gleich zusammen mit dem ersten Element im Formular war?

Wenn sich Programmierung in eine unintuitive Richtung entwickelt, und Programmierer auf abstrakte Ebenen zwingt, die gar nicht gebraucht werden, bin ich skeptisch.
Das Theater, das mit den table tags veranstaltet wurde ist auch nicht ganz angemessen. Warum Leute zu Div zwingen, wenn man's nicht braucht?
 
Zurück
Oben