什么';我试图用JavaScript删除元素有什么不对?

什么';我试图用JavaScript删除元素有什么不对?,javascript,dom,Javascript,Dom,我有一个使用以下系统的表单:字段及其标签为float:left,一条解释如何填写字段的扩展注释显示在最右侧,并以较宽的左边距定位。 根据Eric Meyer一本书中的建议,我使用hr将两者对齐:我将hr样式设置为: .lineup{清除:两者;可见性:隐藏} 然后,我使用Javascript在需要时显示注释。 这非常有效,除了(Safari中的一些奇怪问题)当注释非常长时,当它“向下推”另一个表单内容时。 因此,我说,我可以编写一个Javascript函数来运行页面构建,删除hr(记住他们的偏

我有一个使用以下系统的表单:字段及其标签为
float:left
,一条解释如何填写字段的扩展注释显示在最右侧,并以较宽的左边距定位。
根据Eric Meyer一本书中的建议,我使用hr将两者对齐:我将
hr
样式设置为:

.lineup{清除:两者;可见性:隐藏}
然后,我使用Javascript在需要时显示注释。
这非常有效,除了(Safari中的一些奇怪问题)当注释非常长时,当它“向下推”另一个表单内容时。
因此,我说,我可以编写一个Javascript函数来运行页面构建,删除hr(记住他们的偏移),并将所有描述移动到hr所在位置附近的某个地方。
但我不能让它移除人力资源

最后,代码:

var hrListY = new Array();              // Y-coordinates of HR "lineup" elements

// Moves all descriptions so their middle is where the top used to be, and
// removes the <hr>s previously used to position them.

function relayoutDescriptions() {
        var hrs = document.getElementsByTagName("hr");
        alert('hrs.length = ' + hrs.length);
        var i;
        for (i = 0; i < hrs.length; i++) {
                var hr = hrs[i];
                if (hr.className == 'lineup') {
                        hrListY.push(hr.offsetTop);
                        alert('Got an HR element: Y = ' + hr.offsetTop + ' parentNode class = "' + hr.parentNode.className + '"');
                        hr.parentNode.removeChild(hr);
                        }
                }

// Now we have a list of Y-coordinates of HR elements, hrListY.  We use it
// to adjust the offsetTop's of the -desc divs.  For each one, we adjust the
// offsetTop so the center of the div is at the height where the HR was.

        }
var hrListY=new Array();//HR“排列”元素的Y坐标
//移动所有描述,使其中间位于顶部,然后
//删除以前用于定位它们的
s。 函数relayotdescriptions(){ var hrs=document.getElementsByTagName(“hr”); 警报(“小时长度=”+小时长度); var i; 对于(i=0;i
到目前为止,我只知道这些。它为offsetTop提供了合理的升序数,并提供了一个合理的父节点类,但最终的布局清楚地表明,firebug确认,hr仍然存在

帮忙

附加说明
如果有一种简单的方法可以用JQuery实现这一点,我愿意接受,但我真的很想知道这里发生了什么


谢谢

getElementsByTagName返回的节点列表是活动的,这意味着当您从DOM中删除其中一个元素时,右边的元素会向左移动,因此您只需每隔一秒删除一个项目

DOM中的NodeList和NamedNodeMap对象是活动的;也就是说,对底层文档结构的更改反映在所有相关的NodeList和NamedNodeMap对象中

您可以通过移动
警报('hrs.length='+hrs.length)看到这一点在循环中。每次通过时,它都会发出不同的警报

要解决此问题,可以复制列表

var myNodeList = document.getElementsByTagName('HR');
myNodeList = Array.prototype.slice.call(myNodeList);
或者可以从右向左迭代

var myNodeList = document.getElementsByTagName('HR');
for (var i = myNodeList.length; --i >= 0;) {
  ...
}

因此,当您删除一个项目时,不会有任何向右移动的内容扰乱您的索引。

getElementsByTagName返回的节点列表是活动的,这意味着当您从DOM中删除其中一个元素时,向右移动的内容会向左移动,因此您只需每隔一秒删除一个项目

DOM中的NodeList和NamedNodeMap对象是活动的;也就是说,对底层文档结构的更改反映在所有相关的NodeList和NamedNodeMap对象中

您可以通过移动
警报('hrs.length='+hrs.length)看到这一点在循环中。每次通过时,它都会发出不同的警报

要解决此问题,可以复制列表

var myNodeList = document.getElementsByTagName('HR');
myNodeList = Array.prototype.slice.call(myNodeList);
或者可以从右向左迭代

var myNodeList = document.getElementsByTagName('HR');
for (var i = myNodeList.length; --i >= 0;) {
  ...
}

这样,当你删除一个项目时,就不会有任何向右移动的东西扰乱你的索引。

好建议!另一个选项是隐藏而不是删除它:
hr.style.display=“无”轻微修改:也是为了(i=…length-1;…但它是有效的。向后迭代…谁会这么做?这很有道理。感谢您的教育!好建议!另一个选项是隐藏


而不是删除它:
hr.style.display=“none”
轻微修改:也是为了(i=…长度-1;…但它是有效的。向后迭代…谁会这么做?这很有道理。谢谢你的教育!