Kurzversion:entfernen letzten x Zeichen vor carret Position
Ich habe einen contenteditable div. Ich möchte die letzten x Zeichen vor der Carret-Position entfernen.
Lange Version:
Wenn jemand Typen ein [
im contenteditable div sollte eine Autosuggest Liste angezeigt wird, durch einen Ajax-Aufruf gefüllt. Dies funktioniert bereits. Ich kann den ausgewählten Vorschlag auch an der Carret-Position einfügen und eine ]
hinzufügen. Die Zeichen, die bereits vom Benutzer eingegeben wurden, sollten vor dem Anhängen des Vorschlags gelöscht werden. Die Klammer [
ist nicht nur das "Trigger-Zeichen", sondern auch ein markdown-ähnliches Formatelement.
Beispiel:
Text im div ("|" steht für carret): Lorem ipsum| sit lorem ipsum dolor
Benutzer jetzt Typen [do
Autosuggestion zu starten: Lorem ipsum [do| sit lorem ipsum dolor
dolor
vorgeschlagen und eingesetzt, nachdem carret: Lorem ipsum [do|dolor sit lorem ipsum dolor
Problem: die bereits eingegebenen Zeichen do
sollte vor dem Einsetzen der Vorschlag entfernt werden
Wunschverhalten: Lorem ipsum [dolor] sit lorem ipsum dolor
Versuchte Lösungen:
Insert text at cursor in a content editable div - arbeiten, aber ich die letzten Zeichen nicht entfernen können https://developer.mozilla.org/en-US/docs/Web/API/Selection - versucht, einige Ideen von MDN zu bekommen , aber keine Idee, wie man den Text der Auswahl textNode ändert
Code:
die Zeichenfolge zwischen dem letzten Auszug "[" und carret für Anregungen in DB suchen:
var sel = window.getSelection();
var cords = getCaretCoords();
var searchQuery = extractSearchQuery(sel.anchorNode.data, sel.anchorOffset, "[");
function extractSearchQuery(searchString, caretPos, triggerString) {
//cut everything after carret
searchString = searchString.slice(searchString.lastIndexOf(triggerString) + 1, caretPos);
return searchString;
}
den Vorschlag nach carret einfügen:
function insertTextAtCursor(text) {
var sel, range, html;
if (window.getSelection) {
sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
range = sel.getRangeAt(0);
range.deleteContents();
var newTextNode = document.createTextNode(text);
range.insertNode(newTextNode);
}
} else if (document.selection && document.selection.createRange) {
document.selection.createRange().text = text;
}
}
Willkommen bei SO. Bitte geben Sie Lösungsvorschläge, warum sie nicht funktionierten und die erwarteten Ergebnisse an. Das würde uns wirklich helfen, das Problem mit Ihrem Code herauszufinden. Vielen Dank! –
Für mein Verständnis, wenn jemand 'ips' tippt, und dann die" [", willst du' ipsum' automatisch vorschlagen und dann 'ips [' durch 'ipsum' ersetzen? Wenn ja, weißt du anscheinend schon, dass du nach etwas suchen musst, das mit 'ips' beginnt, also kannst du einfach' ipsum' durch 'ipsum' ersetzen, oder? Also etwas wie 'diftext.replace (lookup +" [", found);', wobei 'divtext' der Inhalt Ihres editierbaren div ist,' lookup' ist der Nachschlage-String, also 'ips' in diesem Beispiel und' gefunden' ist die Zeichenfolge, die von der Autosuggest-Funktion gefunden wird, in diesem Fall "ipsum". – rolfv1
Bitte fügen Sie Ihren aktuellen Code in die Frage ein. Ich bezweifle, dass jemand dies von 0 für Sie implementieren. –