getElementById()通配符

Flo*_*ler 20 javascript

我有一个div,并且我有一些未定义级别的子节点.

现在我必须将每个元素的ID更改为一个div.如何实现?

我想,因为他们有上传ID,所以如果父亲是id ='path_test_maindiv',那么下一个downer将是'path_test_maindiv_child',因此我想,我会通过通配符解决这个问题,例如:

document.getElementById('path_test_*')
Run Code Online (Sandbox Code Playgroud)

这可能吗?或者还有其他方法吗?

jok*_*net 27

不是原生JavaScript.你有各种选择:

1)放置一个类并使用getElementsByClassName,但它不适用于每个浏览器.

2)自己动手.就像是:

function getElementsStartsWithId( id ) {
  var children = document.body.getElementsByTagName('*');
  var elements = [], child;
  for (var i = 0, length = children.length; i < length; i++) {
    child = children[i];
    if (child.id.substr(0, id.length) == id)
      elements.push(child);
  }
  return elements;
}
Run Code Online (Sandbox Code Playgroud)

3)使用库或CSS选择器.像jQuery;)

  • 值得注意的是,这个答案虽然有效,但截至2014年已经过时了.请参阅下面的Felix King的答案:http://stackoverflow.com/a/4275292/1542891,这是一个非常支持的答案,不需要自己旋转选择器功能. (3认同)
  • @Florian - 你最好将`document.body.getElementsByTagName('*')`更改为`document.getElementById('path_test_maindiv').getElementsByTagName('*')`而不是提高效率.当您只需要特定DIV元素中的元素时,无需获取**所有**元素.:) (2认同)

Fel*_*ing 21

在其中一条评论中你说:

(...)IE无论如何都被禁止在我的页面上,因为他没有用CSS获取它.它是开发人员的管理工具,所以只有少数人,他们无论如何都会使用FF

我认为你应该从一开始就采用不同的方法,但是对于它的价值,在较新的浏览器(ok,FF3.5)中,你可以使用document.querySelectorAll()它来获得类似的结果,如jQuery:

var elements = document.querySelectorAll('[id^=foo]');
// selects elements which IDs start with foo
Run Code Online (Sandbox Code Playgroud)

更新: querySelectorAll()在IE <8和FF 3.0支持.

  • @Florian:在FF 3.0中只支持**,从3.5开始支持....真的有人还在使用3.0吗?;)(无论如何只是想给你另一种可能性). (2认同)

Jam*_*iec 11

jQuery允许您查找特定属性以特定值开头的元素

在jQuery中你会使用

$('[id^="path_test_"]')
Run Code Online (Sandbox Code Playgroud)

  • 实际上,我不是在使用jQuery,但是我想,mabye我很快就会开始...... thx;) (2认同)

Iva*_*lov 11

在 2019 年尝试将此作为通配符。

document.querySelectorAll("[id*=path_test_]")
Run Code Online (Sandbox Code Playgroud)

  • 当用现有答案添加一个八年前的问题的答案时,指出您的答案涉及哪些新方面以及它与现有答案有何不同以及您的答案在八年前是否有效,或者它是否依赖于在那八年里发生的事情,比如 JavaScript 中添加了一个新功能。 (2认同)