Warum behandelt IE11 Node.normalize () falsch für das Minuszeichen?

8

Ich habe ein Problem festgestellt, bei dem sich DOM-Textknoten mit bestimmten Zeichen merkwürdig im IE verhalten, wenn die Funktion Node.normalize () zum Verketten benachbarter Textknoten verwendet wird.

Ich habe ein Codepen-Beispiel erstellt, mit dem Sie den Fehler in IE11 reproduzieren können: Ссылка

Ausgabe in IE11: '- Beispiel'

Ausgabe in Chrome und früheren Versionen von IE: 'Test - Beispiel'

Wie Sie sehen können, schneidet dies alles ab, was vor dem Minus-Symbol liegt, das anscheinend als begrenzendes Zeichen behandelt wird, offensichtlich aufgrund eines Fehlers in der nativen Implementierung von normalize () in Internet Explorer 11 (aber nicht IE10 oder IE8). oder sogar IE6).

Kann jemand erklären, warum das passiert, und kennt jemand andere Folgen von Zeichen, die dieses Problem verursachen?

Bearbeiten - Ich habe einen Codepen geschrieben, der Abschnitte von Unicode-Zeichen testet, um Zeichen zu identifizieren, die dieses Verhalten verursachen. Es scheint viel mehr Charaktere zu beeinflussen, als ich ursprünglich realisiert habe:

Ссылка Dies testet Unicode-Zeichen von 32-1000 und druckt diejenigen, die den Test nicht bestehen (truncate Daten, wenn Knoten normalisiert sind) Sie können es ändern, um andere Bereiche von Zeichen zu testen, aber vorsichtig sein, den Bereich zu viel in IE zu erhöhen oder es wird einfrieren.

Ich habe einen IE-Fehlerbericht erstellt, und Microsoft meldet, dass ich ihn basierend auf dem von mir bereitgestellten Codebeispiel reproduzieren kann. Stimmen Sie darüber ab, wenn dieses Problem auch auftritt: Ссылка

    
JessieArr 11.03.2014, 21:55
quelle

5 Antworten

6

Die anderen Antworten hier sind etwas ausführlich und unvollständig - sie gehen nicht den gesamten DOM-Unterbaum durch. Hier ist eine umfassendere Lösung:

%Vor%     
Joseph 29.08.2014, 14:19
quelle
1

Ich habe einen Workaround erstellt, indem ich einfach die normalize-Methode in JS neu implementiert habe, aber viele Stunden damit zu kämpfen hatte. Daher dachte ich, ich würde einen SO-Post machen, um anderen Leuten zu helfen und hoffentlich mehr Informationen zu bekommen über diesen Fehler, der den größten Teil meines Tages verschwendet hat, haha.

Hier ist ein Codepen mit meinem Workaround, der in allen Browsern funktioniert: Ссылка

Meine Problemumgehung beruhte auf einem nützlichen Normalisierungscode, den ich hier gefunden habe: Ссылка , wurde aber auf diesen speziellen IE11-Fehler zugeschnitten eher als die von diesem Beitrag diskutiert:

Hier ist die Problemumgehung, die in allen Browsern funktioniert, die ich getestet habe, einschließlich IE11

%Vor%     
JessieArr 11.03.2014 21:59
quelle
0

Der Normalisierungscode sieht ein bisschen verschlungen aus, das Folgende ist ein bisschen einfacher. Es durchquert die Geschwister des zu normalisierenden Knotens und sammelt die Textknoten, bis es auf ein Element trifft. Dann ruft es sich selbst auf und sammelt die Textknoten dieses Elements und so weiter.

Ich denke, dass das Trennen der zwei Funktionen für saubereren (und viel weniger) Code sorgt.

%Vor%     
RobG 12.03.2014 00:13
quelle
0
%Vor%     
jslouvre 03.01.2015 12:25
quelle
0

Nicht die genaue Antwort, aber in meinem Fall geholfen.

%Vor%     
Dorad 05.06.2014 14:29
quelle