IE не поддерживает "insertBefore" - PullRequest
       0

IE не поддерживает "insertBefore"

7 голосов
/ 21 февраля 2012

У меня проблема с этим фрагментом кода:

    var logo = document.getElementById("move_this");
    prependElement('container', logo);

    function prependElement(parentID, child) {
        parent = document.getElementById(parentID);
        parent.insertBefore(child, parent.childNodes[0]);
    }

В IE у меня есть ошибка:

SCRIPT438: объект не поддерживает свойство или метод 'insertBefore'

Есть ли способ решить эту проблему?

Ответы [ 2 ]

10 голосов
/ 21 февраля 2012

Используйте это так:

var parent=document.getElementById(parentID);

в противном случае parent будет глобальным, но всегда есть глобальный родительский объект, окно parent (и только для чтения).

Кроме того: IE требует в качестве второго аргумента действительный узел или ноль, поэтому убедитесь, что у parent есть childNodes, чтобы избежать ошибок:

parent.insertBefore(child,(parent.hasChildNodes())
                            ? parent.childNodes[0]
                            : null);
4 голосов
/ 20 февраля 2014

insertBefore работает правильно в IE, если 2-й параметр является допустимым элементом DOM, или null (typeof null равен Object и, таким образом, typeof элемент DOM).

Для Array любой индекс вне границ (который в данном случае равен 0, поскольку children[] пуст) вернет undefined.IE перестает работать в следующем случае, так как 2-й параметр становится undefined -

parent.insertBefore(child, parent.childNodes[0])
//parent.childNodes[INDEX]
//where `INDEX` is greater than parent.childNodes.length

Таким образом, лучший подход для этого случая будет

var refEl  = parent.childNodes[INDEX] || null;
parent.insertBefore(newRowHolderNode.childNodes[0], refEl);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...