2011-01-14 9 views
8

Ich stieß auf diesen Beitrag, der 2 Funktionen zum Speichern und Wiederherstellen von ausgewählten Text aus einem contenteditable div zeigt. Ich habe die untere div als zufrieden stellbar und die 2 Funktion von der anderen post. Wie verwende ich diese Funktionen, um ausgewählten Text zu speichern und wiederherzustellen.contenteditable ausgewählten Text speichern und wiederherstellen

<div style="width:300px;padding:10px;" contenteditable="true">test test test test</div> 

<script> 
function saveSelection() { 
    if (window.getSelection) { 
     sel = window.getSelection(); 
     if (sel.getRangeAt && sel.rangeCount) { 
      return sel.getRangeAt(0); 
     } 
    } else if (document.selection && document.selection.createRange) { 
     return document.selection.createRange(); 
    } 
    return null; 
} 

function restoreSelection(range) { 
    if (range) { 
     if (window.getSelection) { 
      sel = window.getSelection(); 
      sel.removeAllRanges(); 
      sel.addRange(range); 
     } else if (document.selection && range.select) { 
      range.select(); 
     } 
    } 
} 
</script> 
+0

Sie müssen Methoden des Range-Objekts verwenden helfen (siehe mozilla doc: https://developer.mozilla.org/de/DOM/range). Grundsätzlich besteht ein Bereich aus einem Knoten und einem Offset innerhalb dieses Knotens. Eine Möglichkeit, den HTML-Code zusammen mit dem Bereich zu speichern, besteht in der Verwendung von "carets" (siehe Schließen von Bibliotheken für Ideen: http://closure-library.googlecode.com/svn/docs/class_goog_dom_SavedCaretRange.html). – yonran

Antwort

19

Eine typische Anwendung würde eine Art von Widgets oder Dialogeingabe von dem Benutzer zu akzeptieren, wird die Anzeige (damit möglicherweise die ursprüngliche Auswahl zu zerstören) und die Wiederherstellung die Auswahl Danach Widget ausgeblendet wurde. Tatsächlich ist die Verwendung der Funktionen ziemlich einfach; Die größte Gefahr besteht darin, die Auswahl zu speichern, nachdem sie bereits zerstört wurde.

Hier ist ein einfaches Beispiel. Es zeigt eine Texteingabe an und überschreibt die Auswahl in der editierbaren <div> mit dem Text von dieser Eingabe. Es gibt zu viel Code hier einfügen, so ist hier der vollständige Code: http://www.jsfiddle.net/timdown/cCAWC/3/

Extract:

<div id="test" contenteditable="true">Some editable text</div> 
<input type="button" unselectable="on" onclick="displayTextInserter();" 
    value="Insert text"> 
<div id="textInserter"> 
    <input type="text" id="textToInsert"> 
    <input type="button" onclick="insertText()" value="Insert"> 
</div> 

<script type="text/javascript"> 
var selRange; 

function displayTextInserter() { 
    selRange = saveSelection(); 
    document.getElementById("textInserter").style.display = "block"; 
    document.getElementById("textToInsert").focus(); 
}  

function insertText() { 
    var text = document.getElementById("textToInsert").value; 
    document.getElementById("textInserter").style.display = "none"; 
    restoreSelection(selRange); 
    document.getElementById("test").focus(); 
    insertTextAtCursor(text); 
} 
</script> 
+0

+1, ich suchte genau nach dieser Lösung. Danke, dass du meinen Tag gemacht hast. –

+0

@TimDown - Tim, wie würdest du 'saveSelection()' und 'restoreSelection (range)' so verwenden, dass du das 'contenteditable div' als Ziel haben kannst? also ist es wie saveSelection ('mycontentId') 'und restoreSelection (range, 'mycontentId')? Ich versuche, es auf zwei separaten Divs zu verwenden, und ich muss jedes Ziel anvisieren? Gibt es eine Möglichkeit, "getElementById" in die beiden Funktionen zu integrieren, sodass ich ein Targeting durchführen kann? – Andy

+0

@Andy: Die Auswahl ist an das Dokument gebunden, nicht an einzelne Elemente, aber es gibt nichts, was Sie daran hindert, mehrere verschiedene Auswahlen zu speichern. Können Sie ein konkretes Beispiel dafür geben, was Sie erreichen möchten? –

1

nur eine Empfehlung:

es schwer ist, mit nativen Browser-Auswahl zu arbeiten + contenteditable + Griff Alle anderen Browser Aspekte + Auswahl und usw. von Grund auf neu speichern und wiederherstellen ..

I rangyhttps://code.google.com/p/rangy/wiki/SelectionSaveRestoreModuleempfehlen würde , die speziell gemacht, um alle harte Arbeit mit Auswahl für Sie

Prüfung der Dokumentation, ist es einfach zu bedienen;) hoffen, dass es Ihnen

Verwandte Themen