我需要获取元素的ID,但该值是动态的,只有它的开头始终是相同的。
这是一段代码。
<form class="form-poll" id="poll-1225962377536" action="/cs/Satellite">
ID始终以poll-
数字开头,然后数字是动态的。
如何仅使用JavaScript而不使用jQuery获得ID?
我需要获取元素的ID,但该值是动态的,只有它的开头始终是相同的。
这是一段代码。
<form class="form-poll" id="poll-1225962377536" action="/cs/Satellite">
ID始终以poll-
数字开头,然后数字是动态的。
如何仅使用JavaScript而不使用jQuery获得ID?
getElementsByClassName
尚未预先构建。如果您希望它在IE中正常工作(至少是IE的旧版本...也许已在新版本中得到修复),则必须自己对其进行修补。
Answers:
document.querySelector('[id^="poll-"]').id;
选择器的意思是:获取一个元素,其中属性[id]
以string开头"poll-"
。
^
匹配开始
*
匹配任何位置
$
匹配结束
querySelectorAll
是很棒的。除了document.querySelectorAll('[id^="poll-"]')
返回列表。我们需要迭代列表以获取ID,而不是使用document.querySelectorAll('[id^="poll-"]').id
。
^
匹配起点,$
终点和*
任何位置。在你的情况下id$="dynamic_constant"
。
[id^=user-][id$=-image]
:)
试试这个。
function getElementsByIdStartsWith(container, selectorTag, prefix) {
var items = [];
var myPosts = document.getElementById(container).getElementsByTagName(selectorTag);
for (var i = 0; i < myPosts.length; i++) {
//omitting undefined null check for brevity
if (myPosts[i].id.lastIndexOf(prefix, 0) === 0) {
items.push(myPosts[i]);
}
}
return items;
}
示例HTML标记。
<div id="posts">
<div id="post-1">post 1</div>
<div id="post-12">post 12</div>
<div id="post-123">post 123</div>
<div id="pst-123">post 123</div>
</div>
像这样称呼它
var postedOnes = getElementsByIdStartsWith("posts", "div", "post-");
此处的演示:http : //jsfiddle.net/naveen/P4cFu/
假设您想要的是仅基于前缀确定元素的完整ID,那么您将必须对整个DOM进行搜索(或者,如果您知道某些子树,则至少要对整个子树进行搜索)元素始终保证包含您的目标元素)。您可以使用以下方法执行此操作:
function findChildWithIdLike(node, prefix) {
if (node && node.id && node.id.indexOf(prefix) == 0) {
//match found
return node;
}
//no match, check child nodes
for (var index = 0; index < node.childNodes.length; index++) {
var child = node.childNodes[index];
var childResult = findChildWithIdLike(child, prefix);
if (childResult) {
return childResult;
}
}
};
这是一个示例:http : //jsfiddle.net/xwqKh/
请注意,动态元素ID(例如正在使用的元素ID)通常用于保证单个页面上元素ID的唯一性。这意味着可能存在多个共享相同前缀的元素。可能您想找到所有这些。
如果要查找所有具有给定前缀的元素,而不仅仅是第一个,可以使用类似此处所示的内容:http : //jsfiddle.net/xwqKh/1/
querySelectorAll
用现代的枚举polls = document.querySelectorAll('[id ^= "poll-"]');
Array.prototype.forEach.call(polls, callback);
function callback(element, iterator) {
console.log(iterator, element.id);
}
第一行选择所有id
以string开头的元素poll-
。第二行调用枚举和回调函数。
我不确定我知道您要问什么,但您可以使用字符串函数来创建所需的实际ID。
var base = "common";
var num = 3;
var o = document.getElementById(base + num); // will find id="common3"
如果您不知道实际的ID,则无法使用getElementById查找对象,则必须以其他方式(通过类名,标签类型,属性,父级,子级,等等...)。
现在,您终于给了我们一些HTML,可以使用此普通JS查找ID以“ poll-”开头的所有表单元素:
// get a list of all form objects that have the right type of ID
function findPollForms() {
var list = getElementsByTagName("form");
var results = [];
for (var i = 0; i < list.length; i++) {
var id = list[i].id;
if (id && id.search(/^poll-/) != -1) {
results.push(list[i]);
}
}
return(results);
}
// return the ID of the first form object that has the right type of ID
function findFirstPollFormID() {
var list = getElementsByTagName("form");
var results = [];
for (var i = 0; i < list.length; i++) {
var id = list[i].id;
if (id && id.search(/^poll-/) != -1) {
return(id);
}
}
return(null);
}
您可能必须给它一个恒定的类并调用getElementsByClassName
,或者仅使用getElementsByTagName
,然后遍历结果并检查名称。
我建议您查看您的潜在问题,并找出一种可以提前知道ID的方式。
也许,如果您发布了更多有关为什么要这样做的信息,我们可以找到一个更好的选择。
<form class="form-poll" id="poll-1225962377536" action="/cs/Satellite" target="_blank">
ID始终以“ post-”开头,然后数字是动态的。
请检查您的ID名称,“民意调查”和“帖子”有很大的不同。
如前所述,您可以使用querySelector:
var selectors = '[id^="poll-"]';
element = document.querySelector(selectors).id;
但是如果您继续查询“ post”,querySelector将找不到“ poll”: '[id^="post-"]'