ExtJs4 + IE9 = объект не поддерживает свойство или метод 'createContextualFragment'
Я работаю с ExtJs на IE9.. и я почти всегда получаю эту ошибку..
ошибка выполнения Microsoft JScript:
объект не поддерживает свойство или метод createContextualFragment'
какой дозе это означает? Для чего нужен "createContextualFragment"? И как это исправить?
6 ответов
createContextualFragment()
метод Range
объекты, создающие фрагмент документа из строки HTML. Он присутствует в Firefox и WebKit и Opera, но в настоящее время не является стандартным (это не в спецификация диапазона DOM уровня 2 но находится в процессе работы DOM синтаксический анализ и сериализация spec) и IE 9 не реализовали его, что согласуется с общим подходом Microsoft к реализации стандартных функций в IE 9, который ранее отсутствовал в ТО ЕСТЬ. ExtJs должен использовать этот метод, хотя и довольно глупо, поскольку он нестандартен и тот же результат может быть легко достигнут с помощью innerHTML
, который поддерживается везде.
обновление
вы можете исправить следующее в IE 9, так как это позволяет расширять прототипы объектов хоста, чего не было в предыдущих версиях. Ниже приведена наивная реализация createContextualFragment()
адаптировано из my Rangy библиотека но соответствующее для большинств польз. Видеть это Rangy вопрос для уточнения деталей и для более тщательной реализации.
обратите внимание, что это не будет работать в IE
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;
};
}
быстрее, плотнее, без цикла, работает в 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();
}
})();
Ну, с небольшим изменением код, опубликованный Тимом Дауном, работал для меня:
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;
};
}
Это уже было исправлено в Ext JS 3.3 IIRC, и я предполагаю, что он будет исправлен в 4.0 до окончательного выпуска (он даже не попал в бета-версию на момент написания этой статьи).
Я только что применил исправление Тима Дауна к нашей установке ext 3.3.1, потому что IE9 по-прежнему не отображает наши страницы правильно без него. Другими словами, Я не думаю, что это исправление попало в EXTJS 3.3, по крайней мере, не в общедоступную версию.