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

时间:2011-03-21 09:10:59

标签: javascript extjs internet-explorer-9

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

  

Microsoft JScript运行时错误:

     

对象不支持属性或   方法'createContextualFragment'

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

6 个答案:

答案 0 :(得分:25)

createContextualFragment()Range个对象的方法,可以从HTML字符串创建文档片段。它出现在Firefox和WebKit和Opera中,但目前是非标准的(它不在DOM Level 2 Range spec但在工作中DOM Parsing and Serialization spec)并且IE 9没有实现它,这是符合微软在IE 9中实现标准功能的一般方法,这在以前是IE中缺失的。 ExtJs必须使用这种方法,虽然它非常愚蠢,因为它是非标准的,并且可以使用innerHTML轻松实现相同的结果,这在任何地方都得到支持。

<强>更新

您可以将以下内容修补到IE 9,因为它允许扩展主机对象原型,而以前的版本没有。以下是从Rangy library改编的createContextualFragment()的简单实现,但适用于大多数用途。有关详细信息和更全面的实施,请参阅this Rangy issue

请注意,这不适用于IE&lt; 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;
    };
}

答案 1 :(得分:3)

更快,更紧凑,没有循环,适用于IE9 +和所有非糟糕的浏览器:

var createContextualFragment = (function(){
  var doc = document.implementation.createHTMLDocument(''),
      range = doc.createRange(),
      body = doc.body;
  return function(html){
    body.innerHTML = html;
    range.selectNodeContents(body);
    return range.extractContents();
  }
})();

答案 2 :(得分:2)

嗯,通过一个小小的改动,Tim Down发布的代码为我工作:

if (typeof Range.prototype.createContextualFragment == "undefined") {
    Range.prototype.createContextualFragment = function (html) {
        var doc = window.document;
        var container = doc.createElement("div");
        container.innerHTML = html;
        var frag = doc.createDocumentFragment(), n;
        while ((n = container.firstChild)) {
            frag.appendChild(n);
        }
        return frag;
    };
}

答案 3 :(得分:2)

extjs 3.4.0解决了这个问题。无需更改代码bade。但是,对图书馆的工作很好。

答案 4 :(得分:1)

这已经在Ext JS 3.3 IIRC中得到修复,我想它将在最终版本发布之前在4.0中修复(截至本文撰写时它还没有达到测试版)。

答案 5 :(得分:1)

我刚刚将Tim Down的修复应用于我们的ext 3.3.1安装,因为没有它,IE9仍然无法正确显示我们的页面。换句话说,我认为这个修复不会进入EXTJS 3.3,至少不是公共版本。