Bạn có thể thử lưu lựa chọn khi iframe mất tập trung. Nếu bạn chắc chắn nội dung của khung nội tuyến sẽ không thay đổi trước khi người dùng tập trung vào nó một lần nữa, bạn có thể lưu trữ Range
hoặc TextRange
hiện đang được chọn. Các kịch bản sau đây (đối với trang chính) bao gồm kịch bản ban đầu của bạn, không được thử nghiệm rộng rãi và sẽ được cải thiện với tính năng phát hiện tốt hơn nhưng là một cái gì đó để làm việc với:
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;
}
}
Nguồn
2009-09-24 11:51:50
Bạn đang làm sai. Thử bản demo 'contenteditable' này trong IE8 của bạn: http://www.quirksmode.org/dom/execCommand/ Nó sử dụng iframe cho vùng có thể chỉnh sửa, và từ tất cả các tài khoản nó hoạt động tốt. –
Tôi không hiểu. Trong khi tôi không bị thuyết phục bởi mã để thiết lập designMode trong câu hỏi ban đầu, bản demo bạn đã liên kết trưng bày chính xác cùng một hành vi với các lựa chọn mà câu hỏi này đang hỏi về. –
@Tim: Tôi không có IE8 nhưng tôi có IE7 và bản demo chắc chắn không * mất * lựa chọn khi tương tác với các nút trên cùng. Johnny có thể đã tìm thấy một lỗi hợp pháp trong IE8. @ Johnny, bạn đã thử bản demo chưa? –