Je souhaite créer un bouton de retour arrière personnalisé avec la même logique que le bouton “Retour arrière” d’un clavier. J’utilise le code suivant:
function backSpace() { var e = jQuery.Event("keyup"); e.which = 8; // # Some key code value e.keyCode = 8; $("mainDiv").sortinggger(e); }
Mais ça ne marche pas. Je ne comprends pas ce que je fais mal. Je passe beaucoup de temps à résoudre ce problème, mais je ne l’ai pas encore résolu. Aidez-moi, s’il vous plaît.
Ajout à la réponse de @ CosLu
function backSpace() { p = document.getElementById("mainDiv"); c = getCaretPosition(p); console.log(getCaretPosition(p)); str = $("#mainDiv").html(); if (c > 0 && c <= str.length) { $("#mainDiv").focus().html(str.substring(0, c - 1) + str.substring(c, str.length)); p.focus(); var textNode = p.firstChild; var caret = c - 1; var range = document.createRange(); range.setStart(textNode, caret); range.setEnd(textNode, caret); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range); } } $.fn.setCursorPosition = function(pos) { this.each(function(index, elem) { if (elem.setSelectionRange) { elem.setSelectionRange(pos, pos); } else if (elem.createTextRange) { var range = elem.createTextRange(); range.collapse(true); range.moveEnd('character', pos); range.moveStart('character', pos); range.select(); } }); return this; }; function getCaretPosition(editableDiv) { var caretPos = 0, sel, range; if (window.getSelection) { sel = window.getSelection(); if (sel.rangeCount) { range = sel.getRangeAt(0); if (range.commonAncestorContainer.parentNode == editableDiv) { caretPos = range.endOffset; } } } else if (document.selection && document.selection.createRange) { range = document.selection.createRange(); if (range.parentElement() == editableDiv) { var tempEl = document.createElement("span"); editableDiv.insertBefore(tempEl, editableDiv.firstChild); var tempRange = range.duplicate(); tempRange.moveToElementText(tempEl); tempRange.setEndPoint("EndToEnd", range); caretPos = tempRange.text.length; } } return caretPos; }
JS Bin aahahtext
Solution pour l’entrée .
backSpace = function () { var str= $("#text_input").val(); var position = document.getElementById('text_input').selectionStart-1; str = str.substr(0, position) + '' + str.substr(position + 1); $("#text_input").val(str); }
Ce code fonctionne bien pour moi. Vous pouvez effacer lettre par lettre à la position du curseur ou supprimer une sélection
var textbox = document.getElementById('textbox'); function backspace() { var ss = textbox.selectionStart; var se = textbox.selectionEnd; var ln = textbox.value.length; var textbefore = textbox.value.subssortingng( 0, ss ); //text in front of selected text var textselected = textbox.value.subssortingng( ss, se ); //selected text var textafter = textbox.value.subssortingng( se, ln ); //text following selected text if(ss==se) // if no text is selected { textbox.value = textbox.value.subssortingng(0, ss-1 ) + textbox.value.subssortingng(se, ln ); textbox.focus(); textbox.selectionStart = ss-1; textbox.selectionEnd = ss-1; } else // if some text is selected { textbox.value = textbefore + textafter ; textbox.focus(); textbox.selectionStart = ss; textbox.selectionEnd = ss; } }
Ce serait une solution:
http://jsfiddle.net/nezkbws7/2/
function backSpace() { var txt = $("#mainDiv").text(); txt = txt.substr(0,txt.length-1) $("#mainDiv").text(txt); }
J’ai créé la fonctionnalité de retour arrière manuellement, pas avec la copie de l’événement.
Il suffit de mettre à jour votre js pour que cela fonctionne. J’ai trouvé un extrait pour rechercher la position de curseur ici: Obtenir la position de curseur dans contentEditable div
Notez que le code suivant suppose:
Il y a toujours un seul noeud de texte dans le fichier éditable et aucun autre noeud
La propriété éditable n’a pas la propriété CSS white-space définie sur pre
function backSpace() { p = document.getElementById ("mainDiv"); c = getCaretPosition(p); str= $("#mainDiv").html(); if(c>0 && c<=str.length){ $("#mainDiv").html(str.substring(0,c-1)+ str.substring(c,str.length)); } } function getCaretPosition(editableDiv) { var caretPos = 0, sel, range; if (window.getSelection) { sel = window.getSelection(); if (sel.rangeCount) { range = sel.getRangeAt(0); if (range.commonAncestorContainer.parentNode == editableDiv) { caretPos = range.endOffset; } } } else if (document.selection && document.selection.createRange) { range = document.selection.createRange(); if (range.parentElement() == editableDiv) { var tempEl = document.createElement("span"); editableDiv.insertBefore(tempEl, editableDiv.firstChild); var tempRange = range.duplicate(); tempRange.moveToElementText(tempEl); tempRange.setEndPoint("EndToEnd", range); caretPos = tempRange.text.length; } } return caretPos; }
aahahtext