WaBis

walter.bislins.ch

xTextControl: Implementation

Der IE verfügt zwar über Funktionen zum Abfragen und Ersetzen von selektiertem Text und man kann Selektionen kopieren und verändern, aber es gibt keine Funktion, mit der man die Position der Selektion bzw. des Cursors abfragen könnte.

Es gibt eine Funktion inRange, mit der sich abfragen lässt, ob ein Range in einem anderen enthalten ist. Wenn man nun einen Testrange erstellt, der zunächst das ganze Eingabefeld umfasst, und den Start und das Ende schrittweise der aktuellen Selektion annähert und dabei die Positionen mitzählt, bis inRange false zurück gibt, hat man die Start- und Endposition der aktuellen Selektion genau ermittelt.

Andere Programmierer haben versucht, diese schrittweise Annäherung effizienter zu gestalten, indem sie den Anfang des Testranges gleich der Startposition der Selektion gesetzt haben und dann die Länge des so selektierten Textes abgefragt haben. Wenn man diese Länge von der Länge des ganzen Textes abzieht, hätte man die Startposition der Selektion. Analog könnte man so auch die Endposition ermitteln. Leider funktioniert das nicht, weil der IE beim Abfragen von selektiertem Text alle Zeilenende am Schluss der Selektion abschneidet. Man kann also nicht den ganzen selektierten Text abfragen, womit diese Methode nicht zuverlässig in jedem Fall funktioniert.

Dieses Abschneiden von Zeilenenden bringt es auch mit sich, dass die IE Funktion zum Abfragen der Selektion nicht brauchbar ist. Für das Programmieren von Editierfunktion für Eingabefelder muss man in jedem Fall 100% genau die Selektion ermitteln können. Da darf nichts abgeschnitten sein! Daher muss diese Funktionalität beim IE auch durch eigene Funktionen ersetzt werden.

Ein weiteres Problem ergibt sich aus der Tatsache, dass beim Afragen des Textes eines Eingabefeldes der IE jedes Zeilenende als Zeichenpaar '\r\n' zurück gibt. Bei der Selektion zählt er hingegen jedes Zeilenende nur als EIN Zeichen! Es ist daher nötig, den abgefragten Text zuerst zu normieren, d.h. alle '\r\n' durch ein Zeichen, nämlich '\n', zu ersetzen. Dann stimmen Selektion und Textposition überein. Andere Browser verwenden sowieso nur das '\n' Zeichen für Zeilenende.

Um das schrittweise Annähern effizienter zu machen, verwende ich eine binäre Suche. Damit ist der Suchaufwand nur noch log2(n) mit n = Textlänge. Für einen Text der Länge 256 Zeichen braucht es also maximal 8 Schritte, für 1024 Zeichen 10 Schritte usw.

Problem mit Einzeiligen Textfeldern im IE

Im IE funktioniert das Selektieren von Text eines Input-Textfeldes mit der Funktion range.moveToElementText(inputField) nicht; es wird das Exception ungültiges Argument gesetzt. Ich konnte nicht herausfinden weshalb das so ist. Alle Beispiele, die ich gefunden habe (auch auf der MS Website) funktionierten nicht mit einfachen Textfeldern!

Ich konnte keine Lösung finden, die dieses Problem umgeht. Daher funktioniert xTextControl vorläufig nur mit Textarea auf allen modernen Browsern.

Ich habe keine Möglichkeit gefunden, wie man mit Selections Text innerhalb eines einfachen Textfeldes setzen kann. Wenn überhaupt wird immer das ganze Textfeld markiert, statt nur dessen Inhalt!?

Wer findet im folgenden Beispiel den Fehler?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head>

<script type="text/javascript">
function test() {
  var inp = document.getElementById('i');
  var range = document.selection.createRange();
  //var range = document.body.createTextRange();
  range.moveToElementText( inp );  // <- warum funktioniert das nicht????
  range.select();
  alert( range.text );
}
</script>

</head>@$b0@@
</html>

Weitere Infos zur Seite
Erzeugt Freitag, 18. April 2008
von wabis
Zum Seitenanfang
Geändert Samstag, 17. Januar 2015
von wabis