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;
}
}
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. –
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. –
@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? –