IE8中选择和范围功能的更改

时间:2010-07-09 01:23:31

标签: javascript internet-explorer-8 wysiwyg contenteditable

我不得不调试在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.selectioncreateRange()的分解。

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

我想知道是否有人能够对IE8的选择和范围实施中发生的变化有所了解,这会导致这种行为?

2 个答案:

答案 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(我只是在这里猜测)。此外,我不知道为什么如果他们只点击了该区域,它会运行。也许我误解了一些事情。