2009-09-24 26 views
5

Ví dụ dưới đây là ví dụ đơn giản về khung nội tuyến sử dụng window.parent. [Turn designmode on] (công trình này). Trong FF tất cả là tốt, nhưng trong IE8 (ngạc nhiên bất ngờ) bất kỳ lựa chọn được thực hiện sẽ bị mất khi bạn nhấp vào trong khung nội tuyến. Điều này hoàn toàn phủ nhận việc sử dụng các công cụ bên ngoài khung nội tuyến. Tôi không thể tìm thấy một giải pháp 4 ngày sau đó ...IE8 iframe DesignMode mất lựa chọn

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

+0

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. –

+0

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ề. –

+0

@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? –

Trả lời

12

Trên bất kỳ phần tử trong tài liệu chính mà bạn muốn không để phá vỡ lựa chọn khung nội tuyến, hãy thêm unselectable="on".

Ví dụ:

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

Cảm ơn vì điều đó - Tôi tự hỏi tại sao điều này cần phải được thực hiện ... –

+0

Tôi đã gặp rắc rối bởi vấn đề này kể từ khi IE8 ra mắt. Đây là một tìm kiếm tuyệt vời cho tôi. Tim - Anh yêu em. – jerebear

+0

Thật là một sự tìm kiếm tuyệt vời, kudo đối với Tim – SW4

3

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; 
} 
} 
+1

Làm thế nào địa ngục này đã được downvoted ?? Nó không chỉ hoàn toàn trả lời câu hỏi, mà là một câu trả lời khá liên quan mà phải mất một chút nỗ lực để viết. –

+0

Hi Tim - cảm ơn vì nỗ lực của bạn ở đây - bản demo tôi đã cung cấp chỉ ra sự mất lựa chọn - mã thực không lưu trữ và xử lý phạm vi - tuy nhiên, tôi muốn xác định xem đây có phải là lỗi hay hành vi bản địa trong ie8 không .Nếu nó không phải là một lỗi - sau đó bị bệnh sử dụng mã của bạn (nhưng xấu hổ của nó để có tất cả các chi phí thêm này để duy trì một lựa chọn) - tôi chỉ có thể hạn chế chỉnh sửa để tắc kè. tức là thổi –

+0

Im phát hiện crescentfresh demo được cung cấp. Mabe có một giải pháp trong đó - những nút không giết lựa chọn - Cập nhật Ill trên tìm kiếm của tôi ... –

0

My Editbox thể thêm hình ảnh, bảng biểu vv nơi bạn cuối cùng nhấp vào iframe và làm việc cho IE6, IE7 và FF nhưng đối với ie8 nó bổ sung thêm sau đó vào lúc bắt đầu. Sau đó, chúng có thể được cắt và dán vào nơi bạn muốn, nhưng đó là một mối phiền toái. SERIOUS THÊM hơn nữa là khi tôi muốn thay đổi các thuộc tính của một ô bảng, ví dụ, tôi phải có một số văn bản bây giờ trong ô mà tôi phải làm nổi bật hoặc tôi không thể xác định yếu tố nào tôi đang ở!

Có Microsoft sửa lỗi cho phương pháp lựa chọn hoặc Firefox hoặc phiên bản cũ của tức là khóa học duy nhất không?

liên quan đến Mike W

+0

Bạn có thể muốn hỏi câu hỏi này như một câu hỏi. –

Các vấn đề liên quan