我在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。
答案 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中完美运行的优点,可以通过短暂延迟解决...不知道为什么!
抱歉!很快就说了......结果我的超时(在这种情况下)没有用。