3

我想删除 id name 包含 string 的所有元素(假设它们都是 div)bs。无论它们是否是嵌套元素,如何通过 javascript 执行此操作?(不是jQuery)

<div id="new_bs_add"></div>

<div id="bsremove"></div>

<div id="somethingelse"></div>

... and many more
4

4 回答 4

9

没有 jQuery,但如果支持 CSS3 选择器,你可以选择

var rem = document.querySelectorAll("[id*='bs']"), i = 0;
for (; i < rem.length; i++)
    rem[i].parentNode.removeChild(rem[i]);

否则,只需对 VisioN 的解决方案进行轻微编辑:

var divs = document.querySelectorAll("[id]");
for (var i = 0, len = divs.length; i < len; i++) {
    var div = divs[i];
    if (div.id.indexOf("bs") > -1) {
        div.parentNode.removeChild(div);
    }
}
于 2013-03-26T14:00:10.200 回答
4

纯 JavaScript:

var divs = document.getElementsByTagName("div");
for (var i = divs.length; i;) {
    var div = divs[--i];
    if (div.id.indexOf("bs") > -1) {
        div.parentNode.removeChild(div);
    }
}

As an example, in jQuery it is one line:

$("div[id*='bs']").remove();

DEMO: http://jsfiddle.net/c4ewU/

于 2013-03-26T13:58:13.627 回答
3

获取元素列表的最便携方法是document.getElementsByTagName. 然而,结果列表是一个活动节点列表,这意味着如果您修改文档,列表也会更改!

有两种解决方案。一种是复制一份清单:

var nodes = document.getElementsByTagName('div');
var copy = [].slice.call(nodes, 0);   // take a copy

for (var i = 0, n = copy.length; i < n; ++i) {
    var d = copy[i];
    if (d.parentNode && d.id.indexOf('bs') >= 0) {
        d.parentNode.removeChild(d);
    }
}

第二种是向后处理列表,或者确保在修改列表时不推进迭代器。这采用后一种方法:

var nodes = document.getElementsByTagName('div');
for (var i = 0; i < nodes.length; /* blank */ ) {
    var d = nodes[i];
    if (d.id.indexOf('bs') >= 0) {
        d.parentNode.removeChild(d);
    } else {
        ++i; // iterate forward
    }
}
于 2013-03-26T14:00:36.903 回答
0

尝试此代码首先获取包含某些文本的所有元素(此处为“bs”)

var matches = [];
var searchElements = document.getElementsByTagName("body")[0].children;
for(var i = 0; i < searchElements.length; i++) {
  if(searchElements[i].tagName == 'DIV') {
    if(searchElements[i].id.indexOf('bs') != -1) {
       matches.push(searchElements[i]);
    }
  }
}

然后从html正文中删除它们

for(var i = 0;i<matches.length; i++)
    matches[i].parentNode.removeChild(matches[i]);

如果您在第一个循环中删除它们,将有一些标签不会被删除,因为每次删除节点时子数组长度都会减少。因此,将它们全部放入外部数组然后删除它们的更好方法。

于 2013-03-26T14:27:54.620 回答