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;
    };
}

extjs 3.4.0 устраняет эту проблему. Нет необходимости менять код. Хорошая работа в библиотеке.


Это уже было исправлено в Ext JS 3.3 IIRC, и я предполагаю, что он будет исправлен в 4.0 до окончательного выпуска (он даже не попал в бета-версию на момент написания этой статьи).


Я только что применил исправление Тима Дауна к нашей установке ext 3.3.1, потому что IE9 по-прежнему не отображает наши страницы правильно без него. Другими словами, Я не думаю, что это исправление попало в EXTJS 3.3, по крайней мере, не в общедоступную версию.