IE8 iframe DesignMode失去选择

时间:2009-09-24 10:52:55

标签: javascript

以下示例是使用window.parent的iframe的简单示例。[turn designmode on](这可行)。在FF中一切都很好,但在IE8(惊喜)中,当你点击iframe时,任何选择都会丢失。这完全否定了iframe之外的工具的使用。我在4天后找不到解决方案......

在IE8中打开 http://www.chromedigital.co.za/hydrapage/test.htm

3 个答案:

答案 0 :(得分:12)

在主文档中的任何元素上,您不想破坏iframe选择,请添加unselectable="on"

例如:

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

答案 1 :(得分:3)

当iframe失去焦点时,您可以尝试保存选择。如果您确定iframe的内容在用户再次关注之前不会更改,则可以存储当前选定的RangeTextRange。以下脚本(对于主页面)包含您的原始脚本,未经过广泛测试,并且可以通过更好的功能检测进行改进,但可以使用:

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

答案 2 :(得分:0)

我的编辑框可以添加您最后在iframe中点击的图像,表格等,适用于ie6,ie7和FF但是对于ie8,它会在开始时添加。然后可以将它们剪切并粘贴到您想要的位置,但这会令人讨厌。更严重的是,当我想要更改表格单元格的属性时,例如,我必须在单元格中有一些文字,我必须突出显示或者我无法确定我在哪个元素!

微软是否对选择方法有任何错误修复,或者是Firefox或旧版本,即唯一的课程?

对待Mike W