Вы можете попробовать сохранить выбор, когда IFrame теряет фокус. Если вы уверены, что содержимое iframe не изменится, прежде чем пользователь снова сосредоточится на нем, вы можете сохранить выбранные в данный момент Range
или TextRange
. Следующий сценарий (для главной страницы) включает в свой оригинальный сценарий, не тщательно протестирован и будет улучшен с лучшим обнаружением особенностей, но это что-то, чтобы работать с:
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;
}
}
Вы делаете это неправильно. Попробуйте эту демонстрацию «contenteditable» в своем IE8: http://www.quirksmode.org/dom/execCommand/ Он также использует iframe для редактируемого региона, и со всех учетных записей он отлично работает. –
Я не понимаю. Хотя я не убежден кодом для установки designMode в исходном вопросе, демонстрация, которую вы связали, демонстрирует точно такое же поведение с выборами, о которых спрашивает этот вопрос. –
@ Тит: У меня нет IE8, но у меня есть IE7, и демо определенно делает * не * теряют выбор при взаимодействии с верхними кнопками. Джонни, возможно, нашел законную ошибку в IE8. @ Джонни, ты еще пробовал демо? –