1

我不得不调试一个在 IE8 中失败的基于所见即所得 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 内)。
这似乎在 IE8document.selectioncreateRange().

问题是,当您不使用鼠标选择任何文本并单击可编辑区域中的某个位置时,sel.createRange().parentElement()似乎会返回 iframe 之外的元素,因此它不是 ContentEditable 并且函数返回false

我想知道是否有人可以深入了解 IE8 的选择和范围的实现发生了什么变化,这些变化会导致这种行为?

4

2 回答 2

1

好的,答案很简单!这一定是 IE8 将焦点放在 iframe 上的方式发生了变化,添加了 foo.focus(); 到下面的代码,一切都按预期工作。希望这对某人有所帮助,但如果他们的代码一开始就正确编写,则可能不会:)

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;
        }
}
于 2010-07-09T04:34:54.447 回答
0

您是否考虑过使用调试器或将警报放入 javscript,以便了解发生了什么。找出正在返回的元素,也许你会发现你的问题。它有可能返回一些父元素而不是 iframe(我只是在这里猜测)。另外,我不确定如果他们只点击该区域,它为什么会运行。也许我误解了什么。

于 2010-07-09T02:59:57.580 回答