2009-09-24 15 views
5

Das folgende Beispiel ist ein einfaches Beispiel für einen iframe, der window.parent verwendet [Designmodus aktivieren] (das funktioniert). In FF ist alles in Ordnung, aber in IE8 (Überraschungsüberraschung) ist jede getroffene Auswahl verloren, wenn Sie aus dem Iframe klicken. Dadurch wird die Verwendung von Werkzeugen außerhalb des iFrame vollständig negiert. Ich kann nicht eine Lösung, die 4 Tage später finden ...IE8 iframe DesignMode verliert die Auswahl

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

+0

Sie tun es falsch. Probieren Sie diese "contenteditable" Demo in Ihrem IE8: http://www.quirksmode.org/dom/execCommand/ Es verwendet auch einen iframe für die editierbare Region, und von allen Konten funktioniert es gut. –

+0

Ich verstehe nicht. Obwohl ich von dem Code für das Setzen von designMode in der ursprünglichen Frage nicht überzeugt bin, zeigt die verknüpfte Demo genau das gleiche Verhalten mit Auswahlen, nach denen diese Frage fragt. –

+0

@Tim: Ich habe kein IE8, aber ich habe IE7, und die Demo definitiv verliert * nicht * die Auswahl bei der Interaktion mit den oberen Tasten. Johnny hat möglicherweise einen legitimen Fehler in IE8 gefunden. @Johnny, hast du die Demo schon probiert? –

Antwort

12

auf ein beliebiges Element im Hauptdokument Sie nicht wollen Um die Iframe-Auswahl aufzuheben, fügen Sie unselectable="on" hinzu.

Zum Beispiel:

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

Danke dafür - ich frage mich, warum dies getan werden muss ... –

+0

Ich habe von diesem Problem PLAGUED seit IE8 kam heraus. Das ist ein erstaunlicher Fund für mich. Tim - Ich liebe dich. – jerebear

+0

Was für ein großartiger Fund, ein großes Lob an Tim – SW4

3

Sie könnten versuchen, die Auswahl Speichern, wenn der iframe den Fokus verliert. Wenn Sie sicher sind, dass sich der Inhalt des Iframes nicht ändert, bevor der Benutzer ihn erneut fokussiert, können Sie die aktuell ausgewählte Range oder TextRange speichern. Das folgende Skript (für die Hauptseite) umfaßt Ihr Original-Skript, ist nicht ausgiebig getestet und würde mit einer besseren Feature-Erkennung verbessert werden, sondern ist etwas, mit zu arbeiten:

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

Wie zum Teufel ist das downvoted ?? Es beantwortet nicht nur die Frage vollständig, es ist eine ziemlich umständliche Antwort, die einige Anstrengungen zum Schreiben erforderte. –

+0

Hallo Tim - danke für deine Mühe hier - die Demo, die ich zur Verfügung stellte, sollte nur den Verlust der Auswahl anzeigen - der echte Code speichert und verarbeitet den Bereich - aber ich möchte feststellen, ob dies ein Fehler oder ein natives Verhalten in ie8 ist .Wenn es kein Bug ist - dann benutze deinen Code schlecht (aber es ist schade, dass er all den zusätzlichen Overhead hat, um eine Auswahl aufrecht zu erhalten) - ich könnte nur die Bearbeitung auf Gecko beschränken. dh bläst –

+0

Im désor der crescentfresh zur Verfügung gestellt. Mabe gibt es eine Lösung dort - diese Tasten töten nicht die Auswahl - Ill Update auf meine Suche ... –

0

Meine Editbox Bilder hinzufügen, Tabellen usw., wo Sie das letzte Mal in der iframe geklickt und arbeitet für IE6, IE7 und FF aber für IE8 es fügt dann an den Start. Sie können dann geschnitten und eingefügt werden, wo Sie sie wollen, aber das ist ein Ärgernis. ERNSTER ist, dass, wenn ich zum Beispiel die Attribute einer Tabellenzelle ändern möchte, ich jetzt einen Text in der Zelle haben muss, den ich hervorheben muss, oder ich kann nicht bestimmen, in welchem ​​Element ich bin!

Haben Microsoft irgendwelche Fehlerkorrekturen für die Auswahlmethode oder ist Firefox oder alte Versionen von zB der einzige Kurs?

Grüße Mike W

+0

Sie könnten dies als Frage stellen. –

Verwandte Themen