JavaScript IE appendChild () - непредвиденный вызов доступа к методу или свойству - PullRequest
5 голосов
/ 10 ноября 2009

У меня была эта проблема в IE. У меня есть два div, которые я использую для перетаскивания выбранных элементов из одного в другой. Допустим, у меня есть дочерний элемент (также div) в div1 и несколько дочерних элементов в div2. Я вызываю метод div2.appendChild () для дочернего элемента div1. Он удаляет дочерний элемент из div1 и добавляет его в div2. Если я затем пытаюсь добавить дочерний элемент обратно в div1, я получаю следующее исключение «Неожиданный вызов метода или доступа к свойству» в IE. Он отлично работает в Firefox. Ниже приведен фрагмент кода для JavaScript.

function moveSelectedGroupBoxItems(toLocation, grp){
    document.body.className = 'groupBoxDefaultCursor';
    if(groupBoxfromLocation != toLocation){
        if(grp == groupBoxGroup){
            var fromVal = document.getElementById(groupBoxfromLocation);
            var toVal = document.getElementById(toLocation);

            var children = fromVal.childNodes;
            for (var i = children.length - 1; i >= 0; i--) {
                if(children[i].className == 'groupBoxItemSelected'){
                    children[i].childNodes[0].name=toLocation;
                    toVal.appendChild(children[i]);
                }
            }
        }
    }
    groupBoxfromLocation = '';
    groupBoxGroup = '';
    return false;
}

Это в основном перемещает выбранные дочерние элементы div от одного родительского элемента div к другому при перетаскивании.

Ответы [ 7 ]

5 голосов
/ 23 декабря 2010

Для преимуществ результатов поиска - у меня была такая же ошибка в IE 6 и 7 «Неожиданный вызов метода или доступа к свойству» при добавлении дочернего узла к элементу пространства имен, но пространство имен не было объявлено.

var a=document.createElement("foo:blah");
var b=document.createElement("div");
a.appendChild(b); //Fails

Чтобы обойти это, мне пришлось добавить объявление пространства имен в HTML-код:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:foo>

или динамически через javascript (вероятно, следует заключить в try / catch):

var namespaces = document.namespaces;
if(namespaces) {
    namespaces.add("foo", null, null);
}
3 голосов
/ 17 сентября 2010

У меня была эта проблема в IE7, и оказалось, что DOM IE7 не был идеальным.

В моем случае у меня был тег изображения, отображаемый в ASP.NET MCV TagBuilder, который отображал его как:

<img ...></img>

Обратите внимание на конечный тег и именно это вызвало проблему. Он работал, когда отображается как:

<img ... />

Надеюсь, это поможет.

2 голосов
/ 10 ноября 2009

Я согласен с Kaze noe Koe, динамическая установка названия элементов - не самая пуленепробиваемая практика. К сожалению, я не могу сказать вам, как избавиться от ошибки. Тем не менее, я настоятельно рекомендую использовать библиотеку JavaScript (jQuery, Prototype, Dojo, ...). Они довольно малы, относительно просты в освоении и намного удобнее в использовании, чем ужасный DOM API. И последнее, но не менее важное: они защищают вас от многих таких неловких несовместимостей браузера. Попробуй, через пару дней ты не можешь представить, что вернусь, обещаю.

0 голосов
/ 05 января 2011

просто имел ту же проблему с IE7, вылечил ее, добавив таймаут:

setTimeout(function(){gallery.appendChild(g_field)},300);

Я потерял счет из-за того, что что-то не работает в IE, но отлично работает в Firefox, что может быть решено за короткую задержку ... не знаю почему!

Извини! говорил скоро ... оказывается, мой тайм-аут (в данном случае) не работал.

0 голосов
/ 12 ноября 2009

решено! ... вроде У меня были скрытые входные данные в дочерних элементах div, в которых содержался идентификатор элемента, перемещаемого для отправки формы. Я удалил скрытые входы и поместил их под своими полями выбора. Каждый раз, когда div перемещается, он обновляет имя скрытого идентификатора родителя div. Кажется, у IE есть проблема с appendChild (), когда у узла есть дочерние элементы. Иногда это срабатывало, а иногда не удавалось. Добавление одного элемента без дочерних элементов всегда работает. Я точно не знаю, в чем проблема, но с вышеизложенным разобрались.

Приветствия

Grep

0 голосов
/ 11 ноября 2009

дети [я] .childNodes [0] .name = toLocation;

Каждый дочерний элемент div, содержащийся в родительском элементе div, также содержит скрытое значение ввода. Родительские div не содержат атрибута name, только id. Когда дочерние элементы перетаскиваются из одного родительского элемента в другой родительский элемент, он обновляет значение имени всех скрытых входных данных до идентификатора элемента div. Когда форма отправлена, сервер может определить, какие значения присутствовали в конкретном родительском элементе div. Это работает в IE и Firefox без сбоев до сих пор. Проблема определенно заключается в методе appendChild (), поскольку он продолжает нарушать этот оператор. Если родительский div пуст при загрузке, все работает отлично. Если родительский div дочерние элементы добавляются в другой div, а затем снова я получаю исключение только в IE.

К сожалению, я пока не могу реализовать фреймворк. Наши теги часто меняются, чтобы соответствовать новым требованиям.

Спасибо за ваши ответы на мою тему, надеюсь, теперь это имеет больше смысла.

Приветствия

Grep

0 голосов
/ 10 ноября 2009

Вы уверены, что он не умирает:

children[i].childNodes[0].name=toLocation;

Что вы пытаетесь достичь с помощью этой строки?


Серьезно, попробуйте закомментировать. Я даже не думаю, что это то, что вы думаете - разве это не правильное свойство, называемое nodeName ?

...