Javascript 删除id名称包含特定字符串的元素

Javascript 删除id名称包含特定字符串的元素,javascript,Javascript,我想删除id名称包含字符串bs的所有元素(假设它们都是div)。如何通过javascript实现这一点,而不管它们是否为嵌套元素?(不是jquery) ... 还有更多 纯JavaScript: 例如,在jQuery中,它是一行: $("div[id*='bs']").remove(); 演示:没有jQuery,但是如果支持CSS3选择器,您可以选择 var rem = document.querySelectorAll("[id*='bs']"), i = 0; for (; i <

我想删除id名称包含字符串
bs
的所有元素(假设它们都是div)。如何通过javascript实现这一点,而不管它们是否为嵌套元素?(不是jquery)


... 还有更多
纯JavaScript:

例如,在jQuery中,它是一行:

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

演示:没有jQuery,但是如果支持CSS3选择器,您可以选择

var rem = document.querySelectorAll("[id*='bs']"), i = 0;
for (; i < rem.length; i++)
    rem[i].parentNode.removeChild(rem[i]);
var rem=document.querySelectorAll(“[id*='bs']”),i=0;
对于(;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);
    }
}
var divs=document.queryselectoral(“[id]”);
对于(变量i=0,len=divs.length;i-1){
div.parentNode.removeChild(div);
}
}

获取元素列表的最方便的方法是
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');
var copy=[].slice.call(节点,0);//抄一份
对于(变量i=0,n=copy.length;i=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
    }
}
var nodes=document.getElementsByTagName('div');
对于(变量i=0;i=0){
d、 parentNode.removeChild(d);
}否则{
++i、 //向前迭代
}
}
试试这段代码 首先获取包含特定文本的所有元素(此处为“bs”)

var匹配=[];
var searchElements=document.getElementsByTagName(“正文”)[0]。子项;
对于(var i=0;i
然后从html的主体中删除它们

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

for(var i=0;iWhy'not jquery'?您需要什么(高级选择)是jQuery的核心功能之一。因为它不适用于我的情况。这段代码中有一个严重的错误,我正在检查另一个可能的错误。事实上,如果删除元素,那么集合将被修改。当您删除div.或向后迭代时,您必须
I--
。使用
query时不会发生这种情况选择Orall
,它返回一个静态集合。@Alnitak关于迭代我同意MaxArt,反向循环将完成这项工作。但是,实际上没有必要检查
,因为
元素将始终至少有
。或者我跳过了其他问题吗?@VisioN我正在考虑
div
位于
div
内部,如果先删除外部div,则会导致问题。不过,向后走可能会解决这一问题,因为内部div总是先删除。document.getElementsByTagName不会为您提供任何“孤立”节点,因为节点必须位于文档中。而且您不需要进行任何更改“复制”如果你只是以相反的顺序在节点列表上循环,那么改变的长度就无关紧要了。@如果你在一个div中有一个div,那么CBroe向前迭代可以得到一个孤立的节点,但我认为向后也可以解决这个问题。正如你已经说过的,节点列表是“活动的”–因此,如果删除外部节点,内部节点也会消失……因此没有“孤立”节点。只有长度会改变,因此必须保持循环中的动态状态。第一个答案不可移植,第二个答案中仍然有VisioN的原始错误。@Alnitak实际上没有。
querySelectorAll
工作(出于某种原因)前向迭代很好:。关于第一个,如果id包含bs或其他字符串,如何选择元素
?@Alnitak是的,我也找到了。因此,通过
NodeList
进行后向迭代,并对
id
属性进行基本检查,可能是这里的最佳解决方案,无论是快速还是跨浏览器。@VisioN或直接前进并执行en当然你不需要迭代删除的元素。理论上这更有效,因为它一次删除整个分支,而不是从叶节点备份。
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
    }
}
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]);
    }
  }
}
for(var i = 0;i<matches.length; i++)
    matches[i].parentNode.removeChild(matches[i]);