2017-03-23 2 views
3

Ich verwende toLowerCase(), um einen Inhalt editierbare div in Kleinbuchstaben zu konvertieren. Aber es kehrt auch den Text um! Kann mir bitte jemand sagen, warum das passiert?Warum wird toLowerCase() Text umgekehrt - warum?

$(document).ready(function() { 
 
    $('#user').bind('keyup', function() { 
 
    $(this).text($(this).text().toLowerCase()); 
 
    }); 
 
});
#user { 
 
    background: #f1f1f1; 
 
    padding: 1em; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="user" contenteditable="true"></div>

Fiddle:https://jsfiddle.net/professorsamoff/8zyvc202/3/

Danke, Tim

+2

Weil jedes Mal wenn Sie eine Taste drücken Sie den Inhalt und die Cursor neu schreiben wird gefasste 0 – Shinigami

+1

Mögliche doppelte Positionierung von: http://stackoverflow.com/questions/14508707/updating- An-Eingänge-Wert-ohne-Verlierer-Cursor-Position – Ultimater

+0

Ah! Aha. Daran habe ich nicht gedacht. Vielen Dank! –

Antwort

-1

Dies ist eine sehr interessante. toLowerCase() kehrt den Text nicht um (Sie können dies überprüfen, indem Sie die Funktion entfernen, und Sie werden sehen, dass der Text immer noch umgekehrt wird). Was wirklich passiert ist, dass sich die Cursorposition nach dem Platzieren des neuen Textes an den Anfang bewegt.

Wie in anderen Antworten erwähnt, wäre ein einfacher Weg, dies zu tun, es über CSS zu tun. Aber wenn Sie es nur mit Javascript tun müssen, sehen Sie sich diese Lösung an. Wir verschieben die Cursorposition manuell nach dem Einfügen des neuen Textes an das Ende.

Die Implementierung der Funktion placeCaretAtEnd wurde von this answer inspiriert.

$(document).ready(function() { 
 
    $('#user').bind('keyup', function() { 
 
    $(this).text($(this).text().toLowerCase()); 
 
    placeCaretAtEnd(this); 
 
    }); 
 
}); 
 

 
function placeCaretAtEnd(el) { 
 
    el.focus(); 
 
    if (typeof window.getSelection != "undefined" 
 
      && typeof document.createRange != "undefined") { 
 
     var range = document.createRange(); 
 
     range.selectNodeContents(el); 
 
     range.collapse(false); 
 
     var sel = window.getSelection(); 
 
     sel.removeAllRanges(); 
 
     sel.addRange(range); 
 
    } else if (typeof document.body.createTextRange != "undefined") { 
 
     var textRange = document.body.createTextRange(); 
 
     textRange.moveToElementText(el); 
 
     textRange.collapse(false); 
 
     textRange.select(); 
 
    } 
 
}
#user { 
 
    background: #f1f1f1; 
 
    padding: 1em; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="user" contenteditable="true"></div>

+0

Ich bin mir nicht sicher, warum Sie darüber abgestimmt haben - es ist in der Tat die Antwort für mich. Vielen Dank! –

+2

Bei diesem Ansatz können Sie nicht mit dem Pfeil nach links bearbeiten, was Sie eingegeben haben. Wenn Sie in die Mitte klicken und mit der Eingabe beginnen, wird Ihr Caret an das Ende gesendet, nicht an die Stelle zuvor. Die CSS-Lösung von Dana ist am zugänglichsten. Aber wenn Sie diesen Übergangseffekt wirklich wollen, sollten Sie wirklich nach dem Schlüsselcode suchen und die Caret-Position verfolgen. Wenn ich Ihren Fall richtig verstehe, wenn es für ein Spiel ist, wenn Sie die Informationen in Kleinbuchstaben für etwas benötigen, das die Informationen verwendet, senden Sie einfach eine Kopie des Textes an den Rückruf mit Kleinbuchstaben() angewendet, anstatt direkt auf der Eingabe. – Ultimater

+0

Ah, richtig ... Das ist ein Problem. Natürlich könnte eine einfache Bedingung dafür sorgen, obwohl sie für die Textauswahl nicht mit Cmd/Strg + A umgehen würde. Und, ja, ich mag die "Senden in Kleinbuchstaben" -Option - dieses Problem war nur nervt mich schrecklich. –

8

Es hat mit der Schrulligkeit von Browsern zu tun ... Wenn der Text festgelegt wird, die Der Cursor bewegt sich an den Anfang des bearbeitbaren Bereichs.

Eine weniger schrullige Lösung könnte die Konvertierung in Kleinbuchstaben mit CSS sein, während der Benutzer tippt. Wenn Sie dann noch weiter gehen möchten, führen Sie die eigentliche Konvertierung in JavaScript unter blur durch.

$(document).ready(function() { 
 
    $('#user').blur(function() { 
 
    console.log('Converting from '+$(this).text()+' to '+$(this).text().toLowerCase()); 
 
    $(this).text($(this).text().toLowerCase()); 
 
    }); 
 
});
#user { 
 
    background: #f1f1f1; 
 
    padding: 1em; 
 
    text-transform:lowercase; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="user" contenteditable="true"></div>

+0

In meinen Tests konvertiert die Funktion blur() den Text nicht, obwohl ... Ich verstehe den Job von blur(), aber es scheint nicht zu funktionieren dieser Fall…? –

+0

Welcher Browser schlägt fehl? Ich habe einen schnellen Test mit Edge, Chrome und Firefox gemacht. – dana

+0

Alle Browser. Beachten Sie, dass dieser Test immer "erscheint", um mit dem vorhandenen CSS zu arbeiten. –

2

Kann CSS erreicht werden mit

#user { 
 
    background: #f1f1f1; 
 
    padding: 1em; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="user" contenteditable="true" style="text-transform: lowercase"></div>

+0

Der Text selbst muss konvertiert werden, nicht nur gestylt. Trotzdem danke. –

-1
Please try the following: 

$(document).ready(function() { 
    $('#user').bind('keyup', function() { 
     $(this).val($(this).val().toLowerCase()); 
    }); 
}); 
+0

Sorry, aber val() funktioniert nicht auf einem Inhalt editierbaren div, nur Eingabefelder. –

Verwandte Themen