IE, klicken Sie auf Kind nicht konzentrieren, Elternteil, Elternteil hat tabindex=0
BEARBEITEN:
Siehe meine Antwort unten: https://stackoverflow.com/a/25953721/674863
Demo:
http://jsfiddle.net/fergal_doyle/anXM3/1/
Ich habe ein div-Element mit tabindex=0, und ein Kind div mit einer festen Breite. Wenn ich auf das untergeordnete div ich erwarte, dass der äußere div-Element zu erhalten konzentrieren. Dies funktioniert gut mit Firefox und Chrome, funktioniert nur mit Internet Explorer (7 bis 10), wenn das Kind der div keine Breite angewendet.
Mit einer Breite, auf die das Kind (weiß) div nicht geben Sie den Fokus auf das äußere ein, und wenn die äußeren, die zuvor den Fokus hatte, auf das Kind bewirkt, dass die äußere Unschärfe, das ist ein Schmerz für das, was ich tun will.
HTML:
<div tabindex="0" id="test">
<div>Click</div>
</div>
CSS:
div {
border:1px solid #000;
padding:20px;
background-color:red;
}
div div {
padding:8px;
background-color:#FFF;
cursor:default;
width:200px;
}
JS:
var $div = $("#test"),
$inner = $("#test > div");
$div.on("blur", function (e) {
console.log("blur");
})
.on("focus", function (e) {
console.log("focus")
});
- Auch worst-case-Szenario, können Sie immer definieren Sie einige code für den IE nur, um zu arbeiten, um dieses Verhalten
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ereignisse abfangen und mit JS zu setzen, endete verursacht mehr Probleme.
Habe ich schließlich herausgefunden, dass die Verwendung von "normalen" tags, wie divs oder überspannt und lässt IE sich falsch Verhalten. Aber so etwas wie
var
oder benutzerdefinierte Tags und IE benimmt sich wie ein richtiger browser.Siehe Aktuelles Beispiel: http://jsfiddle.net/fergal_doyle/anXM3/16/
HTML:
CSS:
JS:
Haben Sie versucht, hinzuzufügen :
und zu verhindern, dass der äußere div-blur nach einem Fokus verwenden
e.stopPropagation()
UPDATE: Da die
click
Ereignis wird ausgelöst, nachdem dieblur
ich benutzte dieMousedown
Ereignis, da es feuert vorblur
.PS: vergessen Sie nicht, um Tastatur-Ereignisse behandeln
keydown
wenn Sie wollen, auch zu fangen, verwischt, angefeuert von der Tastatur.http://jsfiddle.net/ouadie/x4nAX/
jsfiddle
können Sie jetzt überprüfen ? Da dieclick
Ereignis wird ausgelöst, nachdem die Unschärfe, die ich verwendet, dieMousedown
Ereignis, da es feuert vorblur
.Klick auf ein element mit tabindex=0 in IE wird das Ergebnis in das element, gewinnen unsichtbare konzentrieren. Die Art und Weise zu gewinnen sichtbaren Fokus programmgesteuert aufrufen focus (), während das element nicht bereits unsichtbar konzentrieren. Da der Fokus geschieht unmittelbar nach dem mousedown, das heißt, wir müssen:
Wenn das Kind inline-oder block mit keine Breite gesetzt, der Effekt ist der gleiche, wie auf direkt auf die Muttergesellschaft. Jedoch, wenn das Kind ist ein inline-block oder ein block mit einer Breite legen, und die Eltern hatten bereits gefasst, dann die Eltern blur() direkt nach dem mousedown-Handler ausgeführt werden. Wir haben drei verschiedene Möglichkeiten, mit anderen Kompromisse.
Ist eine option, um nur zu unterdrücken, die Unschärfe mit preventDefault(); die Tugend dieses Ansatzes ist, dass blur() wird nie ausgelöst wird, und der focus() wird nicht ausgelöst, Redundant, das uns ermöglicht, zu schreiben, einfache Logik in unserem Fokus und Unschärfe-Handler; der Vize von diesem Ansatz ist, dass es deaktiviert Textauswahl:
Wenn wir nicht wollen, deaktivieren Sie die text-Auswahl, eine weitere Möglichkeit ist die Konzentration auf die Eltern des Kindes mouseup; doch ist dieser Weg der Eltern wird unscharf und dann wieder den Fokus, die uns daran hindert, zu wissen, Wann ein Fokus oder Unschärfe "echt" ist vielmehr als nur eine vorübergehende Folge unserer Fokus-Vermehrung Logik:
Die Dritte option hat die Vorzüge der beiden oben genannten Ansätze, aber ist das komplizierteste logisch:
Lassen
root
Ihre#test
divSollten Sie verwenden
event.stopPropagation()
bei jedem Klick inroot
, das sollte man nicht erzwingen, focus-Ereignis.Dieses problem ist eine der großen Menge der Probleme in IE (5-11). Sie können sehen, dass der IE der source-code wurde nicht gereinigt seit 1999. Ich bin lachen, wenn die Leute reden über "IE 11 ist ein moderner browser" oder "IE-11 über Pflege-standards".
Diese Frage ist alt, aber ich kam gerade über diesem problem und folgende Lösung funktioniert im IE11 und ist viel einfacher als alle anderen:
Es ist nicht unterstützt in IE<11 leider aber wenn man bekommen kann Weg mit, dass es ist bei weitem die einfachste.
http://jsfiddle.net/anXM3/22/