Nihtan: IE:TextRange.setEndPoint('SToS'):Nichts, obw. compareEndPoints=1

hi,
ich versuche gerade in editierbaren Elementen, 1. die aktuelle Markierung im Internet Explorer (document.selection) - mit der man, glaub ich, auch die Zeigerposition (<blink>|</blink>) auslesen kann (halt längenlose Markierung) - auszulesen, 2. den Inhalt zu verändern und 3. danach den Zeiger wieder auf die vorige Position zu setzten.
Dafür habe ich TextRange.setEndPoint('StartToStart', alteRange) gewählt, da ich dachte, dies würde ganz einfach werden. Dem war aber nicht so:
Ich erhielt keine Fehlermeldung und trotzdem wurde der Zeiger, wie sonst auch im IE, nach 3. ans Ende des Inhalts zurückgesetzt. Deshalb wollte ich testen, ob die beiden Ranges nicht doch auf der gleichen stelle stehen: Doch compareEndPoints gibt eh 1 zurück, aber geändert wird wie schon gesagt trotzdem nichts.

Der ungefähre Aufbau:

  
    //1.  
    if(typeof window.getSelection != 'undefined')  
      [...]  
    else  
      if(typeof document.selection != 'undefined')  
        var Select = [...].selection.createRange().duplicate(); // Ist hier dublicate() übrigens überhaupt notwendig?  
  
    [2. Bearbeitung]  
  
    //3.  
    if(typeof window.getSelection != 'undefined')  
      [...]  
    else  
      if(typeof document.selection != 'undefined') {  
        alert([...].selection.createRange().compareEndPoints('StartToStart',Select)); // alert() returns 1  
        [...].selection.createRange().setEndPoint('StartToStart',Select);  
      }  

ThxBa Nihtan

  1. Hallo,

    Nicht, dass ich es 100% verstehen würde, aber ich benutze folgenden aufgeschnappten (und von mir zu Methoden transformierten) Code für editierbare DOM-Elemente:

      
    this.getSelectionStart = function() {  
        if (this.createTextRange) {  
            var rg = document.selection.createRange().duplicate();  
            rg.moveEnd('character', this.value.length);  
            if (!rg.text) return this.value.length;  
            return this.value.lastIndexOf(rg.text);  
        } else {return this.selectionStart;}  
    };  
      
    this.getSelectionEnd = function() {  
        if (this.createTextRange) {  
            var rg = document.selection.createRange().duplicate();  
            rg.moveStart('character', -this.value.length);  
            return rg.text.length;  
        } else {return this.selectionEnd;}  
    };  
    
    

    Damit bekommt das Element die Methoden getSelectionStart und getSelectionEnd, die die Anfangs- und Endposition der Markierung liefern. Vielleicht kannst du damit etwas anfangen. Ob der Code IE-tauglich ist, weiß ich nicht sicher, nehme es aber an.

    Ich würde übrigens meine Variable nicht gerade Select nennen. Wie du am Syntaxhighlighting unschwer erkennst, ist Select bereits belegt. So gibt es z.B. die Methode select() für edtierbare Elemente.

    Gruß, Don P

    1. hi,

      [...] ich benutze folgenden aufgeschnappten (und von mir zu Methoden transformierten) Code für editierbare DOM-Elemente[...]

      Nein, dies war eigentlich nicht das, was ist wollte: Ich will nicht die Position auslesen, sondern etwas anderes:

      Nach jedem Tastendruck justiere ich die Eingaben nach. Doch nach jeder Justierung wird der Zeiger ans Ende des Editorelements gesetzt. Ich will aber, dass der Zeiger an der gleichen Position beleibt, wo er vor der Justierung war.
      Dazu habe ich mir folgede Variante überlegt:
        1. Auselesen der Selection bzw. der Zeigerposition durch document.selection
        2. Nachjustieren
        3. Durch setEndPoint wieder zur Position springen, wo auch schon zuvor der Zeiger war.
      Allerdings bleibt der Zeiger nach der Justierung trotz 3) am Ende.

      Damit bekommt das Element die Methoden getSelectionStart und getSelectionEnd, die die Anfangs- und Endposition der Markierung liefern. Vielleicht kannst du damit etwas anfangen. Ob der Code IE-tauglich ist, weiß ich nicht sicher, nehme es aber an.

      Mit document.selection wäre er meines Wissens NUR für den IE geschaffen, da Firefox mit window.getSelection() arbeitet.

      Ich würde übrigens meine Variable nicht gerade Select nennen. Wie du am Syntaxhighlighting unschwer erkennst, ist Select bereits belegt. So gibt es z.B. die Methode select() für edtierbare Elemente.

      Vielen Dank für den Hinweis, werde ich mir zu Herzen nehmen.

      lg Nihtan

      1. Hallo,

        Ich will nicht die Position auslesen, sondern etwas anderes: [...]
        Ich will aber, dass der Zeiger an der gleichen Position beleibt, wo er vor der Justierung war.

        Das *ist* doch gerade die Position. Die Anfangsposition der Selektion onkeydown z.B. *ist* die Position, wo der Cursor vorher war. Aber ok, diese Position zu ermitteln ist anscheinend nicht dein Problem. Dann muss ich leider passen. Kenne diese Funktionen (noch) nicht so genau.

        Was verstehst du eigentlich unter "justieren"? Schreibst du zusätzliche Zeichen rein oder sowas? Und warum sollte sich dadurch die Cursorposition ändern?

        Gruß, Don P

        1. hi,

          Dann muss ich leider passen. Kenne diese Funktionen (noch) nicht so genau.

          Um das geht es mir gar nicht. Ich habe ja bereits einen Lösungsweg gefunden: TextRange.setEndPoint wäre die Methode meiner Wahl; nur funktioniert das Ganze nicht wie geplant, um nicht zu sagen gar nicht: Der Zeiger beleibt nämlich trotzdem am Ende, obwohl mir die Methode compareEndPoints sagt, dass der Zeiger nicht auf der gleichen Position steht und somit versetzt werden sollte.

          Also, meine Frage steht noch:
          1. Warum greift setEndPoint() nicht, obwohl dies laut compareEndPoints() nicht sein dürfte?
          [2. Brauche ich eigentlich dublicate(), wenn ich eine Range in ihrem jetzigen Status speichern will oder würde auch das normale Rangeobjekt genügen]

          Was verstehst du eigentlich unter "justieren"? Schreibst du zusätzliche Zeichen rein oder sowas? Und warum sollte sich dadurch die Cursorposition ändern?

          Ich ersetzte möglicher Weise dazugekommene \Ns durch Absatztags. Die Position verändert sich eigentlich nicht, nur setzen Browser nach einer Änderung des Inhalts durch das Script den Zeiger immer - je nach Browser - ans Ende oder an den Inhaltsanfang zurück/vor - und ich will dies unterbinden.

          lg Nihtan

          PS: Bringt mir eine süße Lösung, sonst gibt's Saures :-) ;-)

          1. Hallo Ween,

            Also, meine Frage steht noch:

            1. Warum greift setEndPoint() nicht, obwohl dies laut compareEndPoints() nicht sein dürfte?
              [2. Brauche ich eigentlich dublicate(), wenn ich eine Range in ihrem jetzigen Status speichern will oder würde auch das normale Rangeobjekt genügen]

            zu 1) Weiß der Geier
            zu 2) Weiß der Henker (probier's doch einfach aus)

            Die Position verändert sich eigentlich nicht, nur setzen Browser nach einer Änderung des Inhalts durch das Script den Zeiger immer - je nach Browser - ans Ende oder an den Inhaltsanfang zurück/vor - und ich will dies unterbinden.

            "Eigentlich" nicht, aber dann doch?
            Vergiss einfach den blöden Zeiger und setze den Cursor dahin, wohin du ihn haben willst.
            Vielleicht so, wie es im Atikel Text an Cursorposition einfügen gemacht wird.

            Hoffentlich ist das süß genug...

            Gruß, Don P

            1. Hallo Ween,

              Hallo Ween+1,

              Die Position verändert sich eigentlich nicht, nur setzen Browser nach einer Änderung des Inhalts durch das Script den Zeiger immer [...]
              "Eigentlich" nicht, aber dann doch?

              Ich hätte dies wahrscheinlich besser Formulieren sollen: Der Zeiger müsste gar nicht ans Ende springen (wär mir sogar Recht), da es ja nur intern ist, ob das ein Absatz oder ein \n ist. Trotzdem hat der Browser eben diese nervtötende Automatik.

              Vergiss einfach den blöden Zeiger und setze den Cursor dahin, wohin du ihn haben willst.

              Das versuche ich ja.

              Vielleicht so, wie es im Atikel Text an Cursorposition einfügen gemacht wird.

              Diesen Artikel kannte ich bereits. Hier wird zwar einen Möglichkeit vorgestellt, den Zeiger zu versetzen, allerdings wird dieser relativ verschoben.
              Ich will aber nicht relativ verschieben, eigentlich überhaupt ohne Zahlenangaben: Ich will die Zeigerposition, wie sie früher war und jetzt im Range Select (ich weiß, werde ich im weiteren Verlauf ändern) gespeichert ist, auf den aktuellen Status übertragen. Das heißt: Ich will, dass der Zeiger so wird, wie es früher war (früher war alles besser :heul:).
              Und ich habe ja eh bereits eine Idee gehabt (natürlich sind mir auch andere Ansätze recht): setEndPoint. Nur hab ich keine Ahnung, warum hier nichts passiert!

              Hoffentlich ist das süß genug...

              ;-)

              lg Nihtan

              1. Hallo,

                Das heißt: Ich will, dass der Zeiger so wird, wie es früher war (früher war alles besser :heul:).

                Stimmt, früher war alles besser, sogar die Zukunft ;)

                Und ich habe ja eh bereits eine Idee gehabt (natürlich sind mir auch andere Ansätze recht): setEndPoint. Nur hab ich keine Ahnung, warum hier nichts passiert!

                Das kann ich dir sagen: Weil man beim IE nie weiß, warum etwas passiert, oder warum etwas nicht passiert. So ist er nunmal...

                Deine gute Idee mit setEndPoint ist eben für den nicht gut genug. Das Problem hatten andere schon früher. Da war es komischerweise auch nicht besser.

                Gruß, Don P

    2. Hi,

      Ich würde übrigens meine Variable nicht gerade Select nennen. Wie du am Syntaxhighlighting unschwer erkennst, ist Select bereits belegt.

      Von wem, mit was?

      So gibt es z.B. die Methode select() für edtierbare Elemente.

      Ja und?

      MfG ChrisB

      --
      “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
      1. Hallo,

        Ich würde übrigens meine Variable nicht gerade Select nennen. Wie du am Syntaxhighlighting unschwer erkennst, ist Select bereits belegt.

        Von wem, mit was?

        Weiß ich doch nicht, das ist es ja gerade. Sag du's mir!
        Vielleicht der Prototyp der select()-Methode oder sowas?
        Oder auch gar nichts? Im Zweifel lieber keine Bezeichner verwenden, die auch nur den Anschein erwecken, schon vergeben zu sein. Das ist es was ich meine, nicht mehr und nicht weniger.

        So gibt es z.B. die Methode select() für edtierbare Elemente.

        Ja und?

        Nichts und. Siehe oben.

        Gruß, Don P

        1. Ich würde übrigens meine Variable nicht gerade Select nennen. Wie du am Syntaxhighlighting unschwer erkennst, ist Select bereits belegt.

          Von wem, mit was?

          Weiß ich doch nicht, das ist es ja gerade. Sag du's mir!

          Welchen Syntaxhighlighter verwendest du? In Notepad++ ist select nicht markiert.

          Vielleicht der Prototyp der select()-Methode oder sowas?

          Dann wäre es ja egal.

          Oder auch gar nichts? Im Zweifel lieber keine Bezeichner verwenden, die auch nur den Anschein erwecken, schon vergeben zu sein. Das ist es was ich meine, nicht mehr und nicht weniger.

          In JS gibt es keinen Befehl select und mit der Argumentation könntest du viele englische Begriffe ausschliessen und machst es dir unnötig schwer.

          So gibt es z.B. die Methode select() für edtierbare Elemente.

          Ja und?

          Nichts und. Siehe oben.

          Naja, wenn es eine Methode eines Objektes ist, kannst du den Begriff ohne Probleme verwenden. Es ist auch durchaus üblich für Methoden, die ähnliches machen den gleichen Namen zu verwenden.

          Struppi.