JavaScript IE appendChild() - 对方法或属性访问的意外调用

时间:2009-11-10 15:14:45

标签: javascript internet-explorer call appendchild

我在IE中遇到过这个问题。我有两个div用于将所选元素从一个拖到另一个。假设我在div1中有一个子元素(也是div),在div2中有一些子元素。我在div1的子元素上调用div2.appendChild()方法。它从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移动到另一个父div。

7 个答案:

答案 0 :(得分:5)

对于搜索结果的好处 - 在将子节点附加到命名空间元素时,我在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);
}

答案 1 :(得分:3)

我在IE7中遇到过这个问题,结果证明IE7 DOM并不完美。

在我的情况下,我有一个由ASP.NET MCV TagBuilder呈现的图像标记,它将其呈现为:

<img ...></img>

注意那里的结束标记,这就是导致问题的原因。它在渲染时起作用:

<img ... />

希望这有帮助。

答案 2 :(得分:2)

我同意Kaze noe Koe,动态设置元素的名称并不是最防弹的做法。不幸的是,我无法告诉你如何摆脱错误。但是,我强烈建议使用JavaScript库(jQuery,Prototype,Dojo,...)。它们非常小,相对容易学习,并且比可怕的DOM API更方便使用。最后但同样重要的是,它们可以保护您免受许多此类尴尬的浏览器不兼容问题的影响。试一试,经过几天你无法想象回去,我保证。

答案 3 :(得分:0)

你确定它没有消亡:

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

你想用这条线做什么?


说真的,试着评论一下。我甚至不认为这是你认为的 - 是不是正确的属性叫做 nodeName

答案 4 :(得分:0)

儿童[I] .childNodes [0]。名称= toLocation;

父div中包含的每个子div也包含一个隐藏的输入值。父div不包含name属性,只包含id。当子div被从一个父div拖到另一个父div时,它会更新divs id的所有隐藏输入的名称值。提交表单后,服务器可以区分特定父div中存在哪些值。到目前为止,这在IE和Firefox中都可以正常使用。问题肯定在于appendChild()方法,因为它在这个语句上不断破坏。如果父div在加载时为空,则一切正常。如果父div将子项附加到不同的div然后再返回我只在IE中获得异常。

不幸的是,我还没有实现框架。我们的标签经常更改以适应新的要求。

感谢您对我的主题的回复,希望现在更有意义。

干杯

grep的

答案 5 :(得分:0)

解决了!......有点儿 我在子div中隐藏了输入,这些输入存储了为表单提交而移动的项目的id。我删除了隐藏的输入并将它们放在我的选择框下面。每次移动div时,它都会将隐藏的名称更新为父divs id。当节点有子节点时,似乎IE有appendChild()的问题。这确实有效,有时失败。添加没有子元素的单个元素始终有效。我不确定问题究竟是什么,但上面已将其整理出来。

干杯

grep的

答案 6 :(得分:0)

与IE7有同样的问题,通过添加超时来治愈它:

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

我已经失去了在IE浏览器中无法正常工作但无法在Firefox中完美运行的优点,可以通过短暂延迟解决...不知道为什么!

抱歉!很快就说了......结果我的超时(在这种情况下)没有用。