2009-09-24 13 views
5

El siguiente ejemplo es un ejemplo simple de un iframe que usa window.parent. [Activemode de diseño activado] (esto funciona). En FF todo está bien, pero en IE8 (sorpresa sorpresa), cualquier selección realizada se pierde al hacer clic fuera del iframe. Esto niega totalmente el uso de herramientas fuera del iframe. No puedo encontrar una solución 4 días más tarde ...IE8 iframe DesignMode pierde selección

abierto en IE8 http://www.chromedigital.co.za/hydrapage/test.htm

+0

Lo estás haciendo mal. Pruebe esta demostración 'contenteditable' en su IE8: http://www.quirksmode.org/dom/execCommand/. También usa un iframe para la región editable, y de todas las cuentas funciona bien. –

+0

No entiendo. Si bien no me convence el código para configurar designMode en la pregunta original, la demostración que ha vinculado exhibe exactamente el mismo comportamiento con las selecciones sobre las que pregunta esta pregunta. –

+0

@Tim: no tengo IE8 pero sí tengo IE7, y la demo definitivamente * no * pierde la selección cuando se interactúa con los botones superiores. Johnny puede haber encontrado un error legítimo en IE8. @Johnny, ¿has probado la demo? –

Respuesta

12

en cualquier elemento en el documento principal que no quiere para romper la selección del iframe, agregue unselectable="on".

Por ejemplo:

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

Gracias por eso, me pregunto por qué esto debe hacerse aunque ... –

+0

Me he visto afectado por este problema desde que salió IE8. Este es un hallazgo increíble para mí. Tim - te amo – jerebear

+0

Qué gran descubrimiento, felicitaciones a Tim – SW4

3

Usted podría intentar salvar la selección cuando el iframe pierde el foco. Si está seguro de que el contenido del iframe no cambiará antes de que el usuario lo vuelva a enfocar, puede almacenar el Range o el TextRange actualmente seleccionados. La siguiente secuencia de comandos (para la página principal) incluye su guión original, no se ha probado extensamente y se podría mejorar con una mejor detección de características, pero es algo con que trabajar:

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

¿Cómo demonios se ha bajado? No solo responde completamente la pregunta, sino que es una respuesta bastante complicada que requirió cierto esfuerzo para escribir. –

+0

Hola Tim - gracias por tu esfuerzo aquí - la demostración que proporcioné fue para indicar solo la pérdida de la selección - el código real almacena y procesa el rango - sin embargo, quiero determinar si esto es un error o un comportamiento nativo en ie8 .Si no es un error, entonces use su código (pero es una pena tener todos estos gastos adicionales para mantener una selección) - podría limitar la edición a gecko. es decir, sopla –

+0

Im diseño del demo crescentfresh proporcionado. Mabe hay una solución allí - esos botones no matan la selección - Ill update on my find ... –

0

Mi cuadro de edición puede agregar imágenes, tablas, etc., donde la última vez que hizo clic en el iframe y trabaja para IE6, IE7 y FF, pero para IE8 se añade a continuación al principio. Luego pueden cortarse y pegarse donde tú quieras, pero eso es una molestia. ¡MÁS GRAVE es que cuando quiero cambiar los atributos de una celda de tabla, por ejemplo, tengo que tener ahora un texto en la celda que debo resaltar o no puedo determinar en qué elemento estoy!

¿Tiene Microsoft alguna corrección de errores para el método de selección o es Firefox o versiones anteriores de, por ejemplo, el único curso?

saludos Mike W

+0

Es posible que desee hacer esta pregunta. –

Cuestiones relacionadas