Balthi: [Javascript]Auswahl in einem Textfeld ermitteln und ersetzen

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

  1. 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

    --
    Nichts ist schwerer einzureißen als die Mauer in den Köpfen.
    1. 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?

      1. 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

        --
        Nichts ist schwerer einzureißen als die Mauer in den Köpfen.
        1. 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

          1. 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

            --
            Nichts ist schwerer einzureißen als die Mauer in den Köpfen.
            1. Hallo Siechfried!

              nun gut, dann kann man da wohl nichts ändern ;)
              danke für deine Hilfe, hat mich sehr weiter gebracht!

              Grüße Balthi