Browserübergr.: Von/Bis Position innerhalb Textarea markieren
Munshta
- javascript
hi,
ich programmiere gerade eine "Suchen/Ersetzten"-Funktion. Diese generiert einen regulären Ausdruck. Es soll auch die Möglichkeit geben, Text nicht automatisch zu ersetzten, sondern einfach nur in der Textarea, in dieser gesucht werden soll, zu markieren. Mit String.search() habe ich zwar die Möglichkeit, die Position zu finden; jedoch habe ich nach meiner gestrigen Google-Durchforstung nur Möglichkeiten gefunden, mit denen man ganze Nodes markieren kann.
Und da ich mich mit JavaScript außerhalb des DOM-Standards überhaupt nicht auskennen, bin ich auch nicht in der Lage, mir selbstständig etwas komplexeres mit Ranges zu basteln.
Also: Kennt jemand 'ne Möglichkeit von Zeichen sowieso bis Zeichen sowieso innerhalb einer Textarea zu markieren. Das ganze müsste natürlich trotz den verschiedenen Markierungsobjekten der Browser browserübergreifend funktionieren.
Thank you, in the front out. ;-)
lg Munshta
Also: Kennt jemand 'ne Möglichkeit von Zeichen sowieso bis Zeichen sowieso innerhalb einer Textarea zu markieren. Das ganze müsste natürlich trotz den verschiedenen Markierungsobjekten der Browser browserübergreifend funktionieren.
Fünf-Minuten-Schnellschuss:
<!DOCTYPE html>
<html><body>
<textarea id="t" cols="60" rows="25">Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, ...</textarea>
<script>
var tA = document.getElementById('t');
textareaSelect(tA, 10, 15);
[code lang=javascript]function textareaSelect (tA, startPos, endPos) {
if (typeof tA.selectionStart != "undefined") {
tA.selectionStart = startPos;
tA.selectionEnd = endPos;
} else if (tA.createTextRange) {
var r = tA.createTextRange();
r.collapse(true);
r.moveStart('character', startPos);
r.moveEnd('character', endPos - startPos);
r.select();
}
}
</script>
</body></html>[/code]
Nicht-IE-Browser kennen selectionStart und selectionEnd, für den IE verwendet man TextRanges.
Probiere mal damit herum, ich nehme an, da ist noch etwas Optimierungsbedarf, aber das Prinzip dürfte klar sein.
Mathias
»» Also: Kennt jemand 'ne Möglichkeit von Zeichen sowieso bis Zeichen sowieso innerhalb einer Textarea zu markieren. Das ganze müsste natürlich trotz den verschiedenen Markierungsobjekten der Browser browserübergreifend funktionieren.
Fünf-Minuten-Schnellschuss:
<!DOCTYPE html>
<html><body>
<textarea id="t" cols="60" rows="25">Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, ...</textarea>
<script>
var tA = document.getElementById('t');
textareaSelect(tA, 10, 15);[code lang=javascript]function textareaSelect (tA, startPos, endPos) {
if (typeof tA.selectionStart != "undefined") {
tA.selectionStart = startPos;
tA.selectionEnd = endPos;
} else if (tA.createTextRange) {
var r = tA.createTextRange();
r.collapse(true);
r.moveStart('character', startPos);
r.moveEnd('character', endPos - startPos);
r.select();
}
}
> </script>
>
> </body></html>[/code]
>
> Nicht-IE-Browser kennen selectionStart und selectionEnd, für den IE verwendet man TextRanges.
>
> Probiere mal damit herum, ich nehme an, da ist noch etwas Optimierungsbedarf, aber das Prinzip dürfte klar sein.
>
> Mathias
Hi,
tut mir leid, dass ich erst heute zum lesen der Antworten gekommen bin. Ich war gestern ganztägig mit einer Betriebsfeier, einem Clubtreffen und der Arbeit beschäftigt.
Ich hab es jetzt dafür gleich ausprobiert: Passt wie angegossen! I'm froh ;-)
Hier noch mein leicht angepasstest Script:
~~~javascript
function markieren(Index, Pruefen) {
var Start = altStart[Index];
if(!Start)
Start = 0;
if(Pruefen != false && !new RegExp(Suchtext,document.getElementById('GrossKlein').checked ? '' : 'i').test(document.getElementsByName('eingabe')[0].value.slice(Start))) {
if(confirm('Leider wurde keine weiteren Treffer zu ihrem Suchtext ("'+orgSuche+'") gefunden.\n\nWollen Sie eine neue Suche beginnen?'))
einblenden('Suchen');
return false;
}
}
var input = document.getElementsByName('eingabe')[0];
var inpInhalt = input.value.slice(Start);
var Ende = new RegExp(Suchtext,document.getElementById('GrossKlein').checked ? '' : 'i');
var Anfang = Start+inpInhalt.search(Ende);
Ende = Ende.exec(inpInhalt)[0].length;
anCounter = Index;
altStart[anCounter+1] = Anfang + Ende;
if(typeof input.selectionStart != "undefined") {
input.selectionStart = Anfang;
input.selectionEnd = nextStart;
}
else
if(input.createTextRange) {
var range = input.createTextRange();
range.collapse(true);
range.moveStart('character', Anfang);
range.moveEnd('character', Ende);
range.select();
}
}
Vielen Dank, Mathias
Munshta