2009-09-24 3 views
5

아래 예제는 window.parent. [turn designmode on] (이 작동)을 사용하는 iframe의 간단한 예입니다. FF에서는 모든 것이 잘되지만 IE8 (깜짝 놀람)에서는 iframe을 클릭 할 때 선택 사항이 손실됩니다. 이것은 iframe 외부의 도구 사용을 완전히 무효화합니다. 나는 당신은 iframe이 포커스를 잃을 때 선택을 저장 시도 할 수 IE8 http://www.chromedigital.co.za/hydrapage/test.htmIE8 iframe DesignMode가 선택을 잃습니다.

+0

잘못하고 있습니다. IE8에서이'contenteditable' 데모를보십시오 : http://www.quirksmode.org/dom/execCommand/ 편집 가능한 영역을 위해 iframe을 사용하고 모든 계정에서 잘 작동합니다. –

+0

이해가 안됩니다. 원래 질문에서 designMode를 설정하는 코드로 확신하지는 못했지만, 링크 한 데모는이 질문에서 요구하는 선택 사항과 정확히 동일한 동작을 나타냅니다. –

+0

@Tim : IE8은 없지만 IE7이 있고 데모는 상단 버튼과 상호 작용할 때 선택을 잃지 않습니다. Johnny는 IE8에서 합법적 인 버그를 발견했을 수 있습니다. @ 조니, 데모 한번 해봤 니? –

답변

12

iframe 선택을 해제하려면 unselectable="on"을 추가하십시오. 예를 들어

:

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

왜 고마워요 -이게 왜 끝나야하는지 궁금합니다 ... –

+0

IE8이 나온 이래로이 문제로 인해 PLAGUED되었습니다. 이것은 나를위한 놀라운 발견입니다. 팀 - 사랑해. – jerebear

+0

무슨 좋은 발견, 팀에 대한 칭찬 – SW4

3

의 해결 방법 4 일 후 ...

열기를 찾을 수 없습니다. 사용자가 포커스를 다시 받기 전에 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; 
} 
} 
+1

도대체 어떻게 이것이 downvoted되었습니다 ?? 질문에 완전히 답할뿐만 아니라 글쓰기에 많은 노력을 기울였습니다. –

+0

안녕하세요, Tim - 여기에 대한 귀하의 노력에 감사드립니다 - 내가 제공 한 데모는 선택의 손실을 나타 내기위한 것이 었습니다 - 실제 코드는 저장 및 처리를 수행합니다 - 그러나 이것이 버그 또는 네이티브 동작인지 여부를 ie8에서 결정하고자합니다 .그 버그가 아니라면 - 코드를 잘못 사용하면 (그러나 선택을 유지하기 위해이 여분의 오버 헤드가있는 것은 수치 스럽습니다) - 편집을 게코로 제한 할 수 있습니다. ie 불어 –

+0

제공된 데모 크레스 센트 레스를 지우고 있습니다. 거기에 해결책이 있습니다 - 그 버튼은 선택을 죽이지 않습니다 - 내 업데이 트에 나쁜 업데이 트가 ... –

0

내 편집 상자 이미지, 당신이 마지막으로 iframe에 클릭하고 IE6, IE7과 FF 작동 테이블 등을 추가 할 수 있지만, IE8 것이 시작 부분에 다음 추가합니다. 그런 다음 잘라내어 원하는 위치에 붙여 넣을 수 있지만 이는 불편합니다. 더 심각한 것은 예를 들어 표 셀의 속성을 변경하려고 할 때 강조 표시해야하는 셀에 텍스트가 있어야하거나 현재 어떤 요소가 있는지 확인할 수 없다는 것입니다.

Microsoft에 선택 방법에 대한 버그 수정이 있습니까? 아니면 Firefox 또는 이전 버전, 즉 유일한 과정입니까?

감사합니다. 마이크 W

+0

당신은 질문 으로이 질문하고 싶지 수도 있습니다. –

관련 문제