基于部分字符串的Javascript getElementById


78

我需要获取元素的ID,但该值是动态的,只有它的开头始终是相同的。

这是一段代码。

<form class="form-poll" id="poll-1225962377536" action="/cs/Satellite">

ID始终以poll-数字开头,然后数字是动态的。

如何仅使用JavaScript而不使用jQuery获得ID?


请为清楚起见显示示例标记
naveen 2011年

您要元素的ID还是具有ID的元素?
aroth 2011年

我想获取元素的ID。
calebo 2011年

如果这是您自己的网站代码,则建议您为这些元素中的每一个提供一个类。仍然需要一定程度的代码,但是getElementsByClassName有许多预构建的函数。一些现代浏览器本机支持上述功能。
2011年

@Kranu-getElementsByClassName尚未预先构建。如果您希望它在IE中正常工作(至少是IE的旧版本...也许已在新版本中得到修复),则必须自己对其进行修补。
aroth

Answers:


119

可以使用querySelector为:

document.querySelector('[id^="poll-"]').id;

选择器的意思是:获取一个元素,其中属性[id]以string开头"poll-"

^匹配开始
*匹配任何位置
$匹配结束

jsfiddle


21
querySelectorAll 是很棒的。除了document.querySelectorAll('[id^="poll-"]')返回列表。我们需要迭代列表以获取ID,而不是使用document.querySelectorAll('[id^="poll-"]').id
索菲亚·冯

3
如果您知道动态值的终点多少有些不同,该怎么办?在我的场景中,它是id =“ dynamic_constant”吗?
JoeL 2015年

4
@JoeL^匹配起点,$终点和*任何位置。在你的情况下id$="dynamic_constant"
A1rPun 2015年

4
抱歉,在我的示例中我应该更加清楚。我如何选择ID以'user-'开头并以'-image'结束的id的所有元素,但是中间的数字可以变化。
戴夫·波特

5
@DavePotts使用[id^=user-][id$=-image]:)
A1rPun

10

试试这个。

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/


4

假设您想要的是仅基于前缀确定元素的完整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/


4

querySelectorAll 用现代的枚举

polls = document.querySelectorAll('[id ^= "poll-"]');
Array.prototype.forEach.call(polls, callback);

function callback(element, iterator) {
    console.log(iterator, element.id);
}

第一行选择所有id以string开头的元素poll-。第二行调用枚举和回调函数。


2

我不确定我知道您要问什么,但您可以使用字符串函数来创建所需的实际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);
}

问题是我只知道基数,但是不知道num值。
calebo 2011年

然后,如果没有完整的ID名称,就不能使用getElementById。如果您发布实际的HTML,我们可以帮助您采取其他策略。在您的新示例中,您可以对以“ post-”开头的ID使用CSS3策略,但是只有少数浏览器可以使用纯JS /浏览器(CSS3选择器引擎支持)来实现。在jQuery,Sizzle,
YUI3

我只需要能够使用ID以'poll-'开头的元素来设置变量,就可以了。<form class =“ form-poll” id =“ poll-1225962377536” action =“ / cs / Satellite” target =“ _ blank”>
calebo 2011年

如果您不打算使用更高级的选择器引擎,则只需使用标签,ID和类的结构即可。如果您不想共享并且不使用选择器引擎,那么我们将陷入困境。如果您只想告诉我们它是哪种标签,我们可以查看所有标签进行部分ID匹配。
jfriend00 2011年

好了,既然您已经显示了一些HTML,我添加了两个不同的函数来查找那些类型的表单元素。
jfriend00 2011年

0

您可能必须给它一个恒定的类并调用getElementsByClassName,或者仅使用getElementsByTagName,然后遍历结果并检查名称。

我建议您查看您的潜在问题,并找出一种可以提前知道ID的方式。

也许,如果您发布了更多有关为什么要这样做的信息,我们可以找到一个更好的选择。


请记住,某些旧版浏览器(IE9之前的任何版本的IE)均不支持getElementsByClassName。
jfriend00 2011年

@ jfriend00好的电话。这就是我对所有DOM脚本都使用jQuery的原因之一,因此我不必记住这种事情。
Joe Enos

当我没有jQuery且不想将其拉入页面时,我使用Sizzle库(我认为)是jQuery内部的选择器引擎。它也解决了这个问题,并为您提供了完整的选择器逻辑。如今,没有太多理由只依赖IE8的本机工作。
jfriend00 2011年

0

您可以使用id属性获取ID,然后使用substr方法删除ID的第一部分,然后选择parseInt将其转换为数字:

var id = theElement.id.substr(5);

要么:

var id = parseInt(theElement.id.substr(5));

0
<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-"]'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.