2017-07-15 2 views
1

Ich muss das letzte Wort erfassen den Benutzer eingegeben in der div/Textarea. Es ist kein Problem, wenn das Wort das letzte Wort ist. Was aber, wenn der Benutzer das Wort in der Mitte des Absatzes eingibt?Capture das letzte eingegebene Wort, aus der Mitte des Textes

Für jetzt habe ich diesen Code:

<div contenteditable="true">Add text here</div> 
<script> 
    $("div").on("keyup", function(e){ 
     if (e.keyCode === 0 || e.keyCode === 32) { 
     var words = $(this).text().trim().split(' '), 
      lastWord = words[words.length - 1]; 
     console.log(lastWord); 
     } 
    }); 
</script> 

Es dauert das letzte Wort des Textes nach Hit Platzbenutzer.

+1

funktioniert wie erwartet, was ist das Problem? –

+0

Wahrscheinlich müssen Sie den ursprünglichen Inhalt speichern und eine Form eines Vergleichs mit dem neuen Inhalt erstellen. – mkaatman

+1

@ Mr.Alien er will nicht das letzte Wort in der div. Er möchte das letzte vom Benutzer hinzugefügte Wort unabhängig davon, wo es hinzugefügt wurde. – mkaatman

Antwort

5

Verwenden Sie den Teil des Textes an die Cursorposition auf, die Sie mit der window.getSelection Funktion bekommen:

$("div").on("keyup", function(e){ 
 
    if (e.keyCode === 0 || e.keyCode === 32) { 
 
    var selection = getSelection(); 
 
    var line = selection.getRangeAt(0).endContainer.nodeValue; 
 
    var cursor = selection.focusOffset; 
 
    var words = line.substring(0, cursor).trim().split(' '); 
 
    var lastWord = words[words.length - 1]; 
 
    console.log(lastWord); 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div contenteditable="true"> 
 
    Add text here 
 
    <br/> 
 
    Or do it in this line 
 
</div>

+0

Wenn der Benutzer die Eingabe fehlschlägt, d. H. Ich drücke die Leerzeichen mehrmals vor und nach jedem Wort, so dass dies bei diesem Speicherplatzereignis nicht funktioniert. wahrscheinlich müssen wir jeden Tastenanschlag erfassen. –

+0

Danke. Aber es gibt ein Problem, wenn Benutzer Enter verwendet. Versuchen Sie, Enter zu drücken und weiter zu schreiben. – VGranin

+1

Ich erweiterte die Lösung für mehrzeilige Texte. Ich hoffe es hilft. –

1

Speichern Sie jedes Wort im Array beim Tastendruckereignis, damit Sie die Reihenfolge der vom Benutzer eingegebenen Wörter erfassen können. Nimm das letzte Wort nach dem Teilen mit Leerzeichen.

Für z.B. Wenn Benutzer hat getippt:

„Dies ist die Testinformationen“, dann tippt er „aktualisiert“ Wort vor „Information“ Wort so die Aussage wie „Das ist Test aktualisierte Informationen“:

So in oben Array, Reihenfolge der Wörter wäre:

"Dies ist die Testinformation aktualisiert", können wir dann Array teilen und nach dem Aufteilen erhalten wir "aktualisiert" als das letzte Wort, das wir wollen.

+0

Das setzt voraus, dass der Benutzer den Cursor an den Anfang des Wortes "information" verschiebt und "aktualisiert" eingibt, Treffer . Ich neige dazu, auf das Ende des vorherigen Wortes zu klicken, ein weiteres Leerzeichen hinzuzufügen und das Wort einzugeben. Kein einfaches Problem. Wahrscheinlich müssen Tastenanschläge zu verfolgen, klicken Sie auf Handler, Pfeiltasten-Handler ... ugh, das ist ein schreckliches Problem. – frattaro

0

Sie müssen die Caret-Position abrufen und von ihr zurückkehren, um das ganze Wort wiederherzustellen. Sie können es hier testen:

$("div").on("keyup", function(e){ 
    if (e.keyCode === 13 || e.keyCode === 32) { 
    var text = $(this).text();    
    var range = window.getSelection().getRangeAt(0); 
    var preCaretRange = range.cloneRange(); 
    preCaretRange.selectNodeContents(e.target); 
    preCaretRange.setEnd(range.endContainer, range.endOffset); 
    caretOffset = preCaretRange.toString().length; 

    var word = ""; 
    var iterator = caretOffset-1; 
    var blanks = String.fromCharCode(160) + " \n"; 
    // Skip blanks from right to left 
    while (iterator >= 0 && blanks.indexOf(text[iterator]) > -1) { 
     iterator--; 
    } 

    while (iterator >= 0 && blanks.indexOf(text[iterator]) == -1) { 
    console.log(text[iterator].charCodeAt(0)); 
     word = text[iterator] + word; 
     iterator -= 1; 
    } 
    console.log(word.trim()); 
    } 
}); 

https://jsfiddle.net/7Lgpvgwc/1/

ich die Position der Einfügemarke von here haben.

Bearbeiten: Es sieht aus wie contentEditable Newline verwendet nbsp (non-breaking Leerzeichen) anstelle von Zeilenumbrüche.

+0

Chrome ist mit Ihrem Code fest ... – VGranin

+0

Es ist jetzt bearbeitet. Content-editierbare div-Zeilenumbrüche sind nicht-brechende Leerzeichen, was ich nie bemerkt habe. – lilezek

Verwandte Themen