Si potrebbe provare a salvare la selezione quando l'iframe perde lo stato attivo. Se sei sicuro che il contenuto dell'iframe non cambierà prima che l'utente si concentri nuovamente su di esso, puoi memorizzare lo Range
o TextRange
. Il seguente script (per la pagina principale) include lo script originale, non è ampiamente testato e sarebbe migliorata con una migliore rilevazione funzione, ma è qualcosa su cui lavorare:
h_FF=!document.all
h_rt_F=0
function HLC_DM()
{
h_rt_F=document.getElementById("moo").contentWindow
if(h_FF)
{
if(h_rt_F.document.designMode!="on")
{
try
{
h_rt_F.document.designMode="on"
h_rt_F.document.execCommand("redo",false,null)
createEventHandlers();
}
catch(e)
{
setTimeout("HLC_DM",200)
return false
}
}
}
else
h_rt_F.document.body.contentEditable=true
createEventHandlers();
}
function getContentWindow() {
return document.getElementById("moo").contentWindow;
}
function saveSelection() {
var win = getContentWindow();
var doc = win.document;
var sel = win.getSelection ? win.getSelection() : doc.selection;
var range;
if (sel) {
if (sel.createRange) {
range = sel.createRange();
} else if (sel.getRangeAt) {
range = sel.getRangeAt(0);
} else if (sel.anchorNode && sel.focusNode && doc.createRange) {
// Older WebKit browsers
range = doc.createRange();
range.setStart(sel.anchorNode, sel.anchorOffset);
range.setEnd(sel.focusNode, sel.focusOffset);
// Handle the case when the selection was selected backwards (from the end to the start in the
// document)
if (range.collapsed !== sel.isCollapsed) {
range.setStart(sel.focusNode, sel.focusOffset);
range.setEnd(sel.anchorNode, sel.anchorOffset);
}
}
}
return range;
}
function restoreSelection(range) {
var win = getContentWindow();
var doc = win.document;
var sel = win.getSelection ? win.getSelection() : doc.selection;
if (sel && range) {
if (range.select) {
range.select();
} else if (sel.removeAllRanges && sel.addRange) {
sel.removeAllRanges();
sel.addRange(range);
}
}
}
var selectedRange;
function blurHandler() {
selectedRange = saveSelection();
}
function focusHandler() {
if (selectedRange) {
restoreSelection(selectedRange);
}
}
var iframeHandlersCreated = false;
function createEventHandlers() {
// Prevent setting up twice
if (!iframeHandlersCreated) {
var iframe = document.getElementById("moo");
var doc;
if (iframe.contentDocument && iframe.contentDocument.addEventListener) {
doc = iframe.contentDocument;
doc.addEventListener("blur", blurHandler, false);
doc.addEventListener("focus", focusHandler, false);
} else if (iframe.attachEvent) {
iframe.attachEvent("onbeforedeactivate", blurHandler);
iframe.attachEvent("onfocus", focusHandler);
}
iframeHandlersCreated = true;
}
}
fonte
2009-09-24 11:51:50
Stai sbagliando. Prova questa demo 'contenteditable' nel tuo IE8: http://www.quirksmode.org/dom/execCommand/ Usa un iframe per l'area modificabile, e da tutti gli account funziona perfettamente. –
Non capisco. Mentre non sono convinto dal codice per l'impostazione di designMode nella domanda originale, la demo che hai collegato mostra esattamente lo stesso comportamento con le selezioni che questa domanda sta chiedendo. –
@Tim: Non ho IE8 ma ho IE7, e la demo sicuramente * non * perde la selezione quando si interagisce con i pulsanti in alto. Johnny potrebbe aver trovato un bug legittimo in IE8. @ Johnny, hai già provato la demo? –