ExtJs4 + IE9 = Object不支持属性或方法'createContextualFragment'

obe*_*iro 11 javascript extjs internet-explorer-9

我在IE9上使用ExtJs ..我几乎总是得到这个错误..

Microsoft JScript运行时错误:

Object不支持属性或方法'createContextualFragment'

这意味着什么剂量?需要什么'createContextualFragment'?以及如何解决这个问题?

Tim*_*own 25

createContextualFragment()是一种Range从HTML字符串创建文档片段的对象方法.它存在于Firefox和WebKit和Opera中但目前是非标准的(它不在DOM Level 2 Range规范中,但在正在进行的DOM解析和序列化规范中)并且IE 9没有实现它,这是符合微软在IE 9中实现标准功能的一般方法,这在以前是IE中缺失的.ExtJs必须使用这种方法,虽然相当愚蠢,因为它是非标准的,并且可以很容易地实现相同的结果innerHTML,这在任何地方都得到支持.

UPDATE

您可以将以下内容修补到IE 9,因为它允许扩展主机对象原型,而以前的版本没有.以下是createContextualFragment()改编自我的Rangy库的天真实现,但适用于大多数用途.有关详细信息和更全面的实施,请参阅此Rangy问题.

请注意,这在IE <9中不起作用,因为这些浏览器没有DOM Range实现.

if (typeof Range.prototype.createContextualFragment == "undefined") {
    Range.prototype.createContextualFragment = function(html) {
        var startNode = this.startContainer;
        var doc = startNode.nodeType == 9 ? startNode : startNode.ownerDocument;
        var container = doc.createElement("div");
        container.innerHTML = html;
        var frag = doc.createDocumentFragment(), n;
        while ( (n = container.firstChild) ) {
            frag.appendChild(n);
        }
        return frag;
    };
}
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,这个补丁在IE8中引起了问题,IE8显然完全没有Range对象.所以我将条件更改为if(typeof Range!="undefined"&& typeof Range.prototype.createContextualFragment =="undefined") (2认同)