我不得不调试在IE8中失败的基于WYSIWYG javascript的HTML编辑器。它仅设计用于IE,因此应简化解决方案。这是现有的失败代码:
function isAllowed() {
var sel
var obj
sel = foo.document.selection
if (sel.type != "Control")
{
obj = sel.createRange().parentElement()
} else {
obj = sel.createRange()(0)
}
if (obj.isContentEditable) {
foo.focus()
return true
} else {
return false
}
}
基本上发生的事情是,如果您选择一些文本并单击 insert image 按钮,它首先运行此 isAllowed 函数以查看您选择的文本是可编辑的(即在ContentEditable的iframe内)
这似乎是IE8中document.selection
或createRange()
的分解。
问题在于,当您未使用鼠标选择任何文本并单击可编辑区域中的某个位置时,sel.createRange().parentElement()
似乎返回iframe之外的元素,因此它不是ContentEditable且函数返回< EM>假
我想知道是否有人能够对IE8的选择和范围实施中发生的变化有所了解,这会导致这种行为?
答案 0 :(得分:1)
好的,答案很简单!它必须通过添加foo.focus();来改变IE8将焦点放在iframe上的方式。对于下面的代码,一切都按预期工作。希望这对某人有所帮助,但如果他们的代码在第一时间正确编写,则可能不会:)
function isAllowed() {
var sel;
var obj;
foo.focus();
sel = foo.document.selection;
if (sel.type != "Control")
{
var rng = sel.createRange();
obj = rng.parentElement();
} else {
obj = sel.createRange()(0);
}
if (obj.isContentEditable) {
foo.focus();
return true;
} else {
return false;
}
}
答案 1 :(得分:0)
您是否考虑过使用调试器或将警报放入javscript中,这样您就可以弄清楚发生了什么。找出返回的元素,也许你会发现你的问题。它可能会返回一些父元素而不是iframe(我只是在这里猜测)。此外,我不知道为什么如果他们只点击了该区域,它会运行。也许我误解了一些事情。