IE focus() problem bei onblur, wenn tabindex gesetzt ist.
Alexander Bruch
- javascript
Hallo zusammen,
ich habe hier ein recht verzwicktes Problem, bei dem ich mich zur Zeit im Kreis drehe und hoffe daher auf eure Unterstützung. vielleicht wurde dieses Problem hier schon behandelt, aber ich habe diesbezüglich nichts gefunden.
Ich habe eine HTML-Seite vorbereitet, welches das Problem verdeutlicht:
<HTML><HEAD>
<SCRIPT id=ClientJavaScript type=text/javascript>
function onblur_id1()
{
info('onblur_id1');
var elem1=document.getElementById("id3");
elem1.focus()
}
function onblur_id2()
{
info('onblur_id2');
var elem2=document.getElementById("id4");
elem2.focus()
}
function info(msg){
eleminfo=document.getElementById('idinfo');
eleminfo.value=eleminfo.value + msg + '\n';
}
</SCRIPT>
</HEAD>
<BODY>
Feld (F1) <input id=id1 name=F1 tabIndex=1 maxlength="5" onblur=onblur_id1(); value=""><br>
Feld (F2) <input id=id2 name=F2 tabIndex=2 maxlength="5" onblur=onblur_id2(); value=""><br>
Feld (F3) <input id=id3 name=F3 tabIndex=3 maxlength="5" onblur=onblur_id3(); value=""><br>
Feld (F4) <input id=id4 name=F4 tabIndex=4 maxlength="5" value=""><br>
<textarea rows=10 cols=50 name=info id=idinfo></textarea>
</BODY></HTML>
Die Sprünge sind in diesem Zusammenhang und im folgenden Skript zwar sinnlos, sollen aber auch nur ein Fallbeispiel des deutlich umfangreicheren Skriptes darstellen, bei dem diese Sprungreihenfolge in Abhängigkeit der eingegebenen Werte durchaus vorkommen kann.
Mein Problem ist nun das folgende:
Wenn ich das erste Feld verlasse springt wie erwartet die onblur an. Allerdings springt auch die onblur Funktion des zweiten Feldes an (wahrscheinlich wegen dem tabindex)
Da dieses zweite Feld im onblur wiederum den Fokus auf das 4 Feld setzt, landet der Fokus nicht wie gewünscht in Feld 3.
Im Hintergrund verwende ich ein Webbrowsercontrol mit einer objectForScripting Klasse. Dort fange ich auch Tastendrücke ab und gebe ein false zurück, falls die Taste ignoriert wrden soll oder ein true falls nicht. Die TAB-Taste muss ich aber zulassen, da sonst die onblur Funktion nicht ausgeführt wird.
was ich also bräuchte wäre eine Möglichkeit in der onblur Funktion dafür zu sorgen, dass die "TAB-Funktion" des IE bei Bedarf unterbrochen werden kann. Entweder vom Javascript aus oder per C# - mit Zugriff über mshtml auf den DOM-Baum...
Ich kann auch nicht beim fokusterhalt im Element den Tabindex auf -1 setzen, da nicht generell feststeht, ob in der onblur funktion ein Sprung stattfinden soll oder nicht. In einigen fällen soll kein Sprung stattfinden und dann das nächste Feld regulär über die TAB-Funktion angesprungen werden.
Schon mal danke für eure Hilfe
Gruß
Alex
Ich habe eine HTML-Seite vorbereitet, welches das Problem verdeutlicht:
Das ist auf jeden Fall schonmal gut. Aber ich verstehe nicht was du erwartest.
Im FF lassen sich das 2. und 4. Feld nicht anklicken. Der Focus springt immer von 1 nach 3 und zurück.
Bei mir im IE 7 kann ich mit TAB überhaupt nicht die Felder wechseln, nur mit Shift-Tab (und dann wieder mit TAB).
Feld (F1) <input id=id1 name=F1 tabIndex=1 maxlength="5" onblur=onblur_id1(); value=""><br>
Dein HTML ist stark verbesserungswürdig.
- ich verwende IE7. Im FF funktioniert alles wie erwartet.
- beim Verlassen des ersten Feldes mit TAB soll der Fokus auf das dritte Feld gesetzt werden.
- Das zweite Feld soll beim Fokuserhalt (onfocus) auf das 4 Feld springen.
Das passiert bei mir in keinem Browser.
Wenn ich das erste Feld verlasse springt wie erwartet die onblur an. Allerdings springt auch die onblur Funktion des zweiten Feldes an (wahrscheinlich wegen dem tabindex)
Das widerrum kann ich im IE nachvollziehen.
was ich also bräuchte wäre eine Möglichkeit in der onblur Funktion dafür zu sorgen, dass die "TAB-Funktion" des IE bei Bedarf unterbrochen werden kann. Entweder vom Javascript aus oder per C# - mit Zugriff über mshtml auf den DOM-Baum...
Ich weiß ja nicht wann diese Bedingung eintritt, aber Vielleicht kann dir eine onfocus Funktion helfen. Im IE ist es so wie beschreibst und du hast eine Schleife immer zurück auf das 1. Feld.
Aber im grossen ganzen hört sich das eher so an, als ob du vielleicht die Logik hinter dem ganzen ändern solltest. Da du offensichtlich zwei sich gegenseitig widersprechende Bedingungen hast.
Struppi.
Ich habe eine HTML-Seite vorbereitet, welches das Problem verdeutlicht:
Das ist auf jeden Fall schonmal gut. Aber ich verstehe nicht was du erwartest.
Ein HTML fragment, das das Problem im IE7 verdeutlichen soll.
Im FF lassen sich das 2. und 4. Feld nicht anklicken. Der Focus springt immer von 1 nach 3 und zurück.
FF soll auch nicht genutzt werden. Dennoch, bei mir gehts mit FF. Vielelicht haben wir verschiedene Versionen / Einstellungen ?
Bei mir im IE 7 kann ich mit TAB überhaupt nicht die Felder wechseln, nur mit Shift-Tab (und dann wieder mit TAB).
Das ist seltsam. Wenn ich im Feld1 bin und drücke TAB, dann lande ich in Feld4. das verdeutlicht, dass die onblur funktion von feld2 aufgerufen wurde. Was nochmal durch die Eintragung in der TextArea verdeutlicht wird.
Feld (F1) <input id=id1 name=F1 tabIndex=1 maxlength="5" onblur=onblur_id1(); value=""><br>
Dein HTML ist stark verbesserungswürdig.
Ja leider ist das nicht mein HTML. Schau dir mal den HTML-Code an, der vom IE7 erzeugt wird, wenn du das mshtml Webbrowsercontrol, speziell das HTMLDocument in den Designmodus versetzt und ein Element einfügst. Dann wird so nen Code erzeugt. Aber er soll ja auch ausschliesslich vom IE7 wieder gelesen werden.
- ich verwende IE7. Im FF funktioniert alles wie erwartet.
- beim Verlassen des ersten Feldes mit TAB soll der Fokus auf das dritte Feld gesetzt werden.
- Das zweite Feld soll beim Fokuserhalt (onfocus) auf das 4 Feld springen.
Das passiert bei mir in keinem Browser.
Tschuldigung. Habe ich verwechselt. Das zweite Feld soll beim verlassen (onblur) auf Feld 4 Springen.
Wenn ich das erste Feld verlasse springt wie erwartet die onblur an. Allerdings springt auch die onblur Funktion des zweiten Feldes an (wahrscheinlich wegen dem tabindex)
Das widerrum kann ich im IE nachvollziehen.
DAS IST AUCH DAS HaAUPTPROBLEM, DAS ICH VERDEUTLICHEN WOLLTE.
Die anderen Felder dienen nur, damit das ganze auch nachvollziehbar ist. Aber vielleicht trägt das auch eher zur Verwirrung bei???
was ich also bräuchte wäre eine Möglichkeit in der onblur Funktion dafür zu sorgen, dass die "TAB-Funktion" des IE bei Bedarf unterbrochen werden kann. Entweder vom Javascript aus oder per C# - mit Zugriff über mshtml auf den DOM-Baum...
Ich weiß ja nicht wann diese Bedingung eintritt, aber Vielleicht kann dir eine onfocus Funktion helfen. Im IE ist es so wie beschreibst und du hast eine Schleife immer zurück auf das 1. Feld.
Aber im grossen ganzen hört sich das eher so an, als ob du vielleicht die Logik hinter dem ganzen ändern solltest. Da du offensichtlich zwei sich gegenseitig widersprechende Bedingungen hast.
Leider geht das nicht anders. Wie gesagt es handelt sich hier nur um den Auszug eines deutlich komplexeren Systems dessen Logik vereinfacht ausgedrückt in etwa wie folgt sein soll:
Jedes Feld kann über eine PRE- und eine POST- Logik verfügen. Die PRE Logik wird beim betreten des Feldes ausgeführt, die Postlogik wird beim verlassen des Feldes ausgeführt.
Das ist vereinfacht die Logik dahinter.
Was aber nun passieren kann ist folgendes:
In der Post-Logik eines Felds(onblur) soll der Fokus auf ein anderes Feld gesetzt werden. (z.B. weil ein bestimmter Wert eingegeben wurde)
Diese POST-Logik (onblur) wird ja nun ausgeführt wenn ich TAB drücke.
Was aber jetzt auf keinen Fall passieren darf, ist dass trotz manuellem wechsel des Fokuses (elem.focus()) die PRE-Logik des laut Tabindex logischen nachfolgenend Feldes ausgeführt wird.
Und genau das passiert im IE.
Wenn ich Feld1 verlasse und die onblur Funktion in Kraft tritt und den Fokus auf Feld3 setzt, darf keinenfalls die onfocus und onblur von Feld zwei ausgeführt werden, nur weil es laut tanbindex als nächstes dran wäre.
Struppi.
Ich hoffe wir sind jetzt auf einem Nenner. Habee mich da in der ersten Beschreibung vielleicht etwas missverständlich ausgedrückt.
Trotzdem schonmal Danke für deine Antwort
Gruß
Alex