我在IE9上使用ExtJs ..我几乎总是得到这个错误..
Microsoft JScript运行时错误:
对象不支持属性或 方法'createContextualFragment'
这意味着什么剂量?需要什么'createContextualFragment'?以及如何解决这个问题?
答案 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,至少不是公共版本。