Вопрос по javascript, appendchild, internet-explorer, call – JavaScript IE appendChild () - непредвиденный вызов доступа к методу или свойству

5

У меня была эта проблема в 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 в другой при перетаскивании.

... и это определенноs? элементы option, table, thead, tfoot, tbody, tr, td, script, style или param? ;-) scunliffe

Ваш Ответ

7   ответов
2

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

Я второй твой совет Kaze no Koe
0

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

ура

Grep

Конечно, было бы неплохо узнать, для чего нужны голоса Joseph Gabriel
0

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

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

Сожалею! говорил в ближайшее время ... оказывается, мой тайм-аут (в этом случае) нет работа.

Я уверен, что самая запутанная часть всего этого, если вы вставили предупреждение ("") перед gallery.appendChild (g_field) без задержки это, вероятно, сработает. IE единственный браузер, где предупреждение имеет дополнительные функции, кроме отображения сообщения. Gerrit Brink
5

6 и 7 "Неожиданный вызов метода или доступа к свойству при добавлении дочернего узла к элементу пространства имен, но пространство имен hasn 'не было объявлено.

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

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


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

var namespaces = document.namespaces;
if(namespaces) {
    namespaces.add("foo", null, null);
}
+1 Это неТочно решить мою проблему, но привести меня к решению. Мой использовал тег HTML5 без HTML5 шив. Поменял это на и это сработало. mVChr
0

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

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

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

ура

Grep

0

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

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

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

3

и оказалось, что DOM IE7 не был идеальным.

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

<img ...="">

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

<img ...="">

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

Похожие вопросы