如何使用它的ID但使用widcard选择div?
如果DIV的ID为statusMessage_1098
,我想以document.getElementById('statusMessage_*')
之类的方式选择它。
这是因为在生成页面之前,我不知道ID的后缀,并且页面中只会出现一个这样的ID。这可能吗?
感谢您的帮助。
答案 0 :(得分:19)
是的,这是可能的。这将直接回答您的问题,而不依赖于第三方JavaScript或API或元素ID以外的属性。您也不必使用class =
自定义方法调用示例
// Uses JavaScript regex features to search on id= attribute
var arrMatches = document.getElementsByRegex('^statusMessage_.*');
这将获得一个数组,其中包含id为“statusMessage_”的所有元素(即使是嵌套的元素)。
实施示例 - 可重复使用和通用
这是getElementsByRegex
函数的一个实现,它从document
开始在DOM中搜索给定的正则表达式。为方便起见并根据预期行为将其附加到文档对象。
<head>
<script>
// Called as: document.getElementsByRegex("pattern").
// Returns an array of all elements matching a given regular expression on id.
// 'pattern' argument is a regular expression string.
//
document['getElementsByRegex'] = function(pattern){
var arrElements = []; // to accumulate matching elements
var re = new RegExp(pattern); // the regex to match with
function findRecursively(aNode) { // recursive function to traverse DOM
if (!aNode)
return;
if (aNode.id !== undefined && aNode.id.search(re) != -1)
arrElements.push(aNode); // FOUND ONE!
for (var idx in aNode.childNodes) // search children...
findRecursively(aNode.childNodes[idx]);
};
findRecursively(document); // initiate recursive matching
return arrElements; // return matching elements
};
</script>
</head>
可能有更高效的实施,但这个提供了一个开始。功能的主体可以根据品味用其他算法替换。
测试代码
最后,使用具有嵌套元素的HTML blurb进行测试
<body>
<div id="statusMessage_1">1</div>
<div id="statusMessage_2">2
<div id="content">other stuff</div>
<div id="statusMessage_3">3</div>
</div>
<script>
// a quick test to see if you get the expected result.
var arrMatches = document.getElementsByRegex('^statusMessage_.*');
alert('found ' + arrMatches.length + ' matches - expected 3.')
</script>
此HTML块包含以id="statusMessage_
开头的三个元素;因此警报测试会说
“找到3场比赛 - 预计3场”
变体附录信息
如果要将搜索限制为仅div元素或其他某种特定元素,则需要将以下getElementByTagName
代码注入算法以限制搜索的元素集。
var arrDivs = document.getElementsByTagName("div"); // pull all divs from the doc
您可能希望通过在第二个参数中传递标记名称来修改通用算法,以便在搜索开始之前进行过滤
var arrMatches = document.getElementsByRegex('^statusMessage_.*', 'div');
答案 1 :(得分:12)
使用jQuery可以做到这一点
$("div[id^='statusMessage_']")
编辑 - 使用班级名称选择
如果您可以使用类名,那么您可以使用类似
的内容$$('div.myDivClass');
获取所有div元素的类'myDivClass'
答案 2 :(得分:8)
我认为值得更新线程的最新方式是在JavaScript中执行此操作,因为搜索中仍会出现这种情况。
document.querySelector("[id^='statusMessage_']");
caniuse.com列出了它可用于IE8的ID以及其他浏览器的强大支持。
答案 3 :(得分:2)
在jquery中,最简单的方法是为每个div分配一个类,让我们说'statusMessage' 类似的东西:
<div id="statusMessage_<%=someid%>" class="statusMessage">...</div>
全部搞定:
$('.statusMessage') // or $('div.statusMessage') //or $('div[id^=statusMessage_]')
没有jquery:
var divs = document.getElementsByTagName('div');
for(var i=0;i<divs.length;i++){
if(divs[i].id.indexOf('statusMessage_')==0){
//do stuff here for every divs[i]
}
}
答案 4 :(得分:1)
function switch2 (elementid)
{
var divs = document.getElementsByTagName("div");
for ( var i = 0; divs[i]; i++ )
{
if (divs[i].id.indexOf("statusMessage_") == 0)
{
document.getElementById (divs[i].id).style.display = "none";
}
}
}
只需将document.getElementById (divs[i].id).style.display = "none";
替换为要应用于ID为 statusMessage _ 的所有div的任何CSS。
答案 5 :(得分:1)
2020年更新:
使用jQuery,您可以做到
$("div[id^=statusMessage_]")
**省略单引号。
我也经常在最后添加一个变量:
$("div[id^=statusMessage_" + id + "]")
答案 6 :(得分:0)
我不确定你是如何填充它的,但如果它来自后面的代码你可以尝试类似的东西:
document.getElementById('statusMessage_<%= generatedID %>')
其中generateID是从后面的代码生成的ID。
答案 7 :(得分:0)
在css中执行此操作的常用方法是为元素提供除了唯一ID之外的“statusMessage”类。然后,您可以使用选择器创建一个css规则,该选择器将影响该类的所有元素。例如
.statusMessage {color: red;}
请记住,元素可以包含多个类。例如
<p id="id123" class="class1 class2">
答案 8 :(得分:0)
如果您不想使用jQuery,那么还有另一种更简单的方法:
指定 class
- 例如将其命名为“message”,并使用以下内容:
function getElementsByClass(searchClass,node,tag) {
var classElements = new Array();
if ( node == null )
node = document;
if ( tag == null )
tag = '*';
var els = node.getElementsByTagName(tag);
var elsLen = els.length;
var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
for (i = 0, j = 0; i < elsLen; i++) {
if ( pattern.test(els[i].className) ) {
classElements[j] = els[i];
j++;
}
}
return classElements;
}
在这里你怎么称呼它:
var messages = getElementsByClass("message");
for(var index=0; index < messages.length; index++) {
// prompt the content of the div
//alert(message[index].innerText);
}