2009-09-24 8 views
5

L'esempio seguente è un semplice esempio di un iframe che utilizza window.parent. [Turn designmode on] (funziona). In FF va tutto bene, ma in IE8 (sorpresa a sorpresa) qualsiasi selezione fatta viene persa quando si fa clic fuori dall'iframe. Ciò nega totalmente l'uso di strumenti al di fuori dell'iframe. Non riesco a trovare una soluzione 4 giorni più tardi ...IE8 Iframe DesignMode perde la selezione

Open in IE8 http://www.chromedigital.co.za/hydrapage/test.htm

+0

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. –

+0

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. –

+0

@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? –

risposta

12

su qualsiasi elemento nel documento principale che non vuole per interrompere la selezione dell'iframe, aggiungi unselectable="on".

Ad esempio:

<div onclick="makeBold()" unselectable="on">Bold</div> 
+0

Grazie per quello - mi chiedo perché questo deve essere fatto ... –

+0

Sono stato PLAGUED da questo problema sin da quando IE8 è uscito. Questa è una scoperta incredibile per me. Tim: ti amo – jerebear

+0

Che grande scoperta, complimenti a Tim – SW4

3

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; 
} 
} 
+1

Come diavolo è stato downvoted ?? Non solo risponde pienamente alla domanda, è una risposta piuttosto complessa che richiede un certo sforzo per scrivere. –

+0

Ciao Tim - grazie per il tuo impegno qui - la demo che ho fornito era solo per indicare la perdita della selezione - il codice reale memorizza ed elabora l'intervallo - tuttavia, voglio determinare se questo è un bug o un comportamento nativo in ie8 .Se non è un bug, usa male il tuo codice (ma è vergognoso avere tutto questo overhead extra per mantenere una selezione) - potrei limitarmi a modificare il gecko. cioè soffia –

+0

Im disecting the demo crescentfresh fornito. Mabe c'è una soluzione in là - quei pulsanti non uccidono la selezione - Ill update sul mio find ... –

0

mio Editbox possono aggiungere immagini, tabelle ecc dove lo scorso cliccato nel iframe e lavora per IE6, IE7 e FF, ma per IE8 si aggiunge quindi alla partenza. Possono quindi essere tagliati e incollati dove vuoi, ma questo è un fastidio. PIÙ SERIOSO è che quando voglio cambiare gli attributi di una cella di tabella, per esempio, devo avere del testo ora nella cella che devo evidenziare o non posso determinare quale elemento sono dentro!

Sono state risolte eventuali correzioni di errori Microsoft per il metodo di selezione o Firefox o versioni precedenti, ovvero l'unico corso?

saluti Mike W

+0

Si potrebbe desiderare di porre questa domanda come una domanda. –

Problemi correlati