[Javascript]Auswahl in einem Textfeld ermitteln und ersetzen
Balthi
- javascript
ich poste hier mal die Einträge aus einem anderen Board, die mich hierher verwiesen haben, weil sie meinten ich fände hier gute hilfe:
#####################
Mein Problem ist folgendes:
Ich möchte in einer textarea, in der z.B. 20 Wörter stehen, von denen ich 2 Wörter markiert habe, und dann auf einen Button klicke, diesen markierten Text durch einen anderen ersetzen.
Es scheitert momentan daran, dass ich nicht weiß, wie ich auf die Auswahl zugreife. Auch SelfHTML und ein bisschen googlen ham mir nicht weitergeholfen. Denn einfach mit document.form.textarea.value oder document.getElementById("textarea").value ist es nicht getan, und die Methode, mit der man sowas ausliest hab ich nirgends gefunden
Ich hoffe ihr könnt mir weiterhelfen!
#################
dann habe ich bei selfhtml ein bisschen tiefer gesucht und die methode getSelection bzw selection entdeckt und mein script etwas geändert, allerdings ohne erfolg
mein nächster post:
################
hmm, es funzt immer noch nicht
zur verständigung: das Formular hat den namen "text", die textarea hat namen und id "text"
hier mein js-script:
code:function input_bold()
{
var txtarea=document.text.text;
if(txtarea.getSelection) {
bold="[ B ]"+txtarea.getSelection+"[ /B ]";
txtarea.getSelection = bold;
} else {
if(txtarea.selection) {
bold="[ B ]"+txtarea.selection.createRange()+"[ /B ]";
txtarea.selection.createRange()=bold;
}
}
}
musste zwischen den b's und den eckigen klammern leerzeichen reinmachen
habs auch schon statt mit document.text.text auch schon mit getElementById("text") versucht, ohne erfolg
falls jetzt einwände kommen von wegen gleicher form- und textarea-name: unbegründet, denn andere scripts können auf die textarea zugreifen (über document.text.text)
######################
anschliessend schickte man mich hierher ;)
hoffe ihr könnt mir helfen!
thx euer balthi
Hallo Balthi.
Ich möchte in einer textarea, in der z.B. 20 Wörter stehen, von denen ich 2 Wörter markiert habe, und dann auf einen Button klicke, diesen markierten Text durch einen anderen ersetzen.
Gut.
function input_bold()
{
var txtarea=document.text.text;
if(txtarea.getSelection) {
bold="[ B ]"+txtarea.getSelection+"[ /B ]";
txtarea.getSelection = bold;
} else {
if(txtarea.selection) {
bold="[ B ]"+txtarea.selection.createRange()+"[ /B ]";
txtarea.selection.createRange()=bold;
}
}
}
Also mal der Reihe nach. Du willst etwas ersetzen, das in einer Textarea eingegeben wurde. Die Umsetzung hängt sehr stark vom verwendeten Browser ab. Im Internet Explorer steht dir dafür das Objekt selection und TextRange zur Verfügung:
http://msdn.microsoft.com/workshop/author/dhtml/reference/objects/obj_textrange.asp
http://msdn.microsoft.com/workshop/author/dhtml/reference/objects/obj_selection.asp
Damit hättest du Teil 1 der Operation. In neueren Geckos steht dir die getSelection-Methode sowie die Eigenschaften selectStart und selectEnd zur Verfügung:
http://de.selfhtml.org/javascript/objekte/document.htm#get_selection
http://devedge.netscape.com/library/xref/2002/client-data/dom-html-element-TEXTAREA.html
Damit hättest du schon mal die zwei großen modernen Browserfamilien abgedeckt. Jetzt musst du nur noch nach Fähigkeiten verzweigen:
function Ersetzen(Anfang, Ende)
{
var insText;
// versuche, eine Referenz auf die Textarea zu erzeugen
// im Beispiel ist dies die erste Textarea im Dokument
try {
input = document.getElementsByTagName("textarea")[0];
}
catch(e) {
// bei Misserfolg Funktion beenden
return;
}
// Kennt der Browser das TextRange-Objekt?
if(input.createTextRange) {
insText = Anfang + document.selection.createRange().text + Ende;
document.selection.createRange().text = insText;
}
// Ist es vielleicht ein Gecko?
else if(input.setSelection) {
var start = input.selectionStart;
var end = input.selectionEnd;
insText = input.value.substring(start,end);
input.value = input.value.substr(0, start) + bTag + insText + eTag + input.value.substr(end);
// falls die Ersetzung gleich markiert sein soll:
// input.setSelectionRange(start, start+insText.length);
}
// für alle anderen gilt Handarbeit
// die Ersetzung wird hinten dran gehangen
// was besseres fällt mir hier leider nicht ein :-(
else {
var txt = prompt("Bitte geben Sie den neuen Text ein:");
insText = Anfang + txt + Ende;
input.value += insText;
}
input.focus();
}
Aufruf des Ganzen: "Ersetzen('Start-Tag', 'End-Tag');". So sollte es vom Prinzip her gehen, falls sich keine Fehler eingeschlichen haben.
Freundschaft!
Siechfred
Hallo Siechfried!
Das hat soweit ganz gut funktioniert, nur nicht im Opera.
Dort greift man auf die Auswahl ja mit document.getSelection() zu, die liefert aber immer nur einen leeren String. Woran könnte das liegen?
Hallo Balthi.
Das hat soweit ganz gut funktioniert, nur nicht im Opera.
Dort greift man auf die Auswahl ja mit document.getSelection() zu, die liefert aber immer nur einen leeren String. Woran könnte das liegen?
Hast du window.getSelection() probiert?
Freundschaft!
Siechfred
Hallo Siechfried!
Hast du window.getSelection() probiert?
Ja, habe ich. habe probiert auf was der opera anspricht:
if(document.getSelection)
bzw
if(window.getSelection)
da hat er nur auf document.getSelection angesprochen.
wenn ich dann z.b. alert(document.getSelection()); ausführe, dann gibt es einen popup mit leerem inhalt.
dies gilt übrigens für jede markierung, nicht nur wenn man etwas im textfeld markiert, sondern auch bei beliebigem anderen Text auf der Seite, der über die funktion ja auch zurückgegeben werden müsste
Gruß Balthi
Hallo Balthi.
dies gilt übrigens für jede markierung, nicht nur wenn man etwas im textfeld markiert, sondern auch bei beliebigem anderen Text auf der Seite, der über die funktion ja auch zurückgegeben werden müsste
Scheint ein Opera-eigenes Verhalten zu sein, da kannst du wohl nichts anderes tun, als Opera mittels Abfrage von window.opera auszuschließen und in den letzten else-Zweig zu schicken. Siehe auch http://www.opera.com/docs/specs/opera6/js/.
Freundschaft!
Siechfred
Hallo Siechfried!
nun gut, dann kann man da wohl nichts ändern ;)
danke für deine Hilfe, hat mich sehr weiter gebracht!
Grüße Balthi