Andy Nail: Doppelclick soll den gewünschten Text auswählen

Hallo zusammen,

wenn ich einen Link anklicke werden Daten eingeblendet, bei denen ich gerne mal mit einem Dopelclick einen Eintrag markieren würde. Dies funktioniert auch in jedem Browser, doch sieht es im Firefox nur so auus, denn derr nimmmmmmmmmmmmmmmmmmmmmmmtt immer von vvvorne ein Leerzeichen noch miitt hinzu. Und da es sich bei den Daten immer um Logindaten handelt werden diese dann damit ungültig. Und zZ mache ich das so:

	var Leiste = top.document.getElementById("Daten")
	var Inhalt = Link.getAttribute("Daten")
	txt = new RegExp("\n","g")
	Inhalt = Inhalt.replace(/ /g, " ")
	Inhalt = Inhalt.replace(/\n/g, "<br>")
	txt = Inhalt.replace(txt, "<br>")
	$(Leiste.innerHTML = txt).ready()

Also wie könnte icch es noch machen? Mag ja sein dass da was im Code nicht ganz richtig ist, aber wie gesagt außer im Firefox funktionierts ja.

Und ich möchte mich auf jeden Fall schon mal bei Euch bedanken und freue mich auf Eure Auskünfte.

Also Danke Gruß Andreas

  1. Hallo Andy,

    im Chrome wird immer das Leerzeichen dahinter mitgenommen. Scheint ein wichtiges "Feature" zu sein.

    Dein Code ist allerdings sehr umständlich und vor allem erkenne ich nicht, weshalb er das tun sollte, was Du behauptest. Du ersetzt Leerstellen durch &#32; und Zeilenumbrüche durch <br>. Dann ersetzt Du die Zeilenumbrüche nochmal, nur jetzt mit einer Regex-Variablen statt einem Regex-Literal. ENTFERNT wird eine Leerstelle oder ein Zeilenumbruch dadurch nicht.

    Den hier verstehe ich überhaupt nicht mehr:

    $(Leiste.innerHTML = txt).ready()
    

    Diese Zeile tut mehrere Dinge:

    • sie weist txt an Leiste.innerHTML zu
    • sie übergibt den zugewiesenen Text an jQuery (wenn denn $ bei Dir jQuery ist). Dieser Text ist aber der Wert des Daten-Attributs vom Element, das Du per Link ansprichst (vermutlich also die erwähnten Logindaten - also weder ein Selektor, noch HTML, noch eine Callback-Funktion. Im Ergebnis dürfte ein leeres wrapped set entstehen (oder vielleicht ein merkwürdiges HTML Fragment).
    • auf diesem unklaren Rückgabewert rufst Du dann die ready-Funktion von jQuery auf - die aber überhaupt nichts mit dem wrapped set macht, sondern einen Callback aufruft, sobald das DOM fertig geladen ist. Diesen Callback übergibst Du aber nicht einmal, insofern passiert da überhaupt nichts - bzw. du rufst die Funktion prinzipiell falsch auf und hast Glück, dass jQuery das schweigend ignoriert statt eine Exception zu werfen.

    Eigentlich brauchst Du in dieser Zeile nur die Zuweisung, der Rest dient bestenfalls nur zur Verwirrung der Russen.

    Leiste.innerHTML = txt;
    

    Wenn Du Leerzeichen ENTFERNEN willst, schlage ich Dir die trim() Methode vor, die von Strings mitgebracht wird und von den Browsern hinreichend unterstützt wird. Damit wird es ein Einzeiler, wenn Du Dich auf die Existenz des Elementes mit id='Daten' und des Daten-Attributs auf dem Link-Element verlässt. Eigentlich müsste man das testen.

    top.document.getElementById("Daten").innerHtml = Link.getAttribute("Daten").trim();
    
    var elDaten = top.document.getElementById("Daten"),
        attrDaten = Link.getAttribute("Daten");
    if (elDaten !== null && attrDaten !== null) {
       elDaten.innerHtml = attrDaten.trim();
    }
    

    Statt var kannst Du auch let verwenden, wenn Du hinreichend neues JavaScript voraussetzen kannst.

    Rolf

    --
    sumpsi - posui - clusi
    1. OK Vielen Dank Rolf,

      ich habe jetzt das jqery

      ich habe jetzt das Jquery rausgenommenmaber auf das Attribut kann ich nicht so einfach zugreifen, da darin mehr enthalten ist. Es sind mehrere Leerzeichen und ein Zeilenumbruch, so dass ich da nur so mit hinkommen wollte. Und das trim() konnte so dann auch nicht funktionieren.

      Und also ist das etwa normal dass die Browser mehr ausgeben als sie markieren, sprich jeweils ein Leerzeichen dazu?

      Oder wie komme ich weiter? Wofür ich mich auch gleich bedanken möchte.

      Also danke Gruß Andreas

      1. Hallo Andy,

        dass das Leerzeichen dazu markiert wird, ist offenbar normal. Wenn man irgendwo Text editiert, ist das sogar hilfreich, weil man dann einfach ein Wort verschieben kann ohne Leerzeichen anpassen zu müssen.

        FF markiert übrigens bei mir genau wie Chrome die Leerstelle HINTER dem Wort, nicht vor dem Wort.

        Du müsstest mir aber noch erklären, was dein gezeigter Code mit Doppelklick und Cut+Paste zu tun hat. Irgendwie bring ich das nicht übereinander. Dein Code verarbeitet den Inhalt eines Attributs namens "Daten", kein ausgewähltes Wort.

        Um ausgewählten Text - mit entferntem Rand-Whitespace - zu verarbeiten, nimmt man ab IE9

        var a = document.getSelection().toString().trim();
        

        Nachdem ich deine Antwort an Gunnar gesehen habe: wenn man die Umbrüche erhalten will, weist man an textContent zu, nicht an innerHTML. Dann benötigst Du die ganze Ersetzerei nicht.

        Rolf

        --
        sumpsi - posui - clusi
        1. Jo OK Du,

          in einem Eeigenschaften Formular kann man in einem großen Textfeld Daten eintragen das alles nahe der Maus in einem Div eingeblendet werden soll, sobald man den Link anklickt. Und dynamisch erstellt wird ein Link per php und das Attribut auslesen funktioniert eigentlich so einwandfrei.

          Doch dann wird Text eingeblendet und ich wollte einen Doppelclick auf einen Inhalt machen und diesen Teil der Daten rauskopieren. Doch habe ich es dann stets mit den Leerzeichen in der Paste zu tun, obwohl es so dass nur der Text markieert ist.

          Also auf jeden Fall schonmal Danke Gruß Andreas

    2. @@Rolf B

      Statt var kannst Du auch let verwenden, wenn Du hinreichend neues JavaScript voraussetzen kannst.

      Hier ist wohl const angebracht, nicht let.

      LLAP 🖖

      --
      “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
      1. OK Danke,

        doch wie bekomme ich bitte in den Bereich der den Link-Attribut ausgeben soll Leerzeiichen und Zeilenumbruuch rein?

        Also auf jeden Fall schonmal Vielen Dank

        und Gruß Andreas