基于部分字符串的 JavaScript getElementById。

136
我需要获取一个元素的ID,但它的值是动态的,只有开头始终相同。
这是代码片段。
<form class="form-poll" id="poll-1225962377536" action="/cs/Satellite">

该ID总是以poll-开头,其余数字是动态的。

我如何只使用JavaScript而不是jQuery来获取该ID?


为了清晰起见,请展示一个标记示例 - naveen
你需要元素的ID还是带有该ID的元素? - aroth
如果这是你自己的网站代码,我建议你给每个元素都加上一个类。这仍然需要一定程度的编码,但有许多预构建的函数可以使用 getElementsByClassName。一些现代浏览器本身就支持该函数。 - Kranu
@Kranu - getElementsByClassName 并不是完全预先构建的。如果你想让它在IE中正常工作(至少在旧版本的IE中...也许在新版本中已经修复了),那么你必须自己修补它。 - aroth
@Aroth:预构建的意思是你可以找到一段代码片段,只需复制并粘贴即可添加支持。你所指的术语是本地支持。 - Kranu
显示剩余2条评论
9个回答

229
你可以使用querySelector来实现这个功能:
document.querySelector('[id^="poll-"]').id;

选择器的意思是:
获取一个属性 [id] 以字符串 "poll-" 开头的元素。

^ 匹配开头
* 匹配任意位置
$ 匹配结尾

示例

console.log(document.querySelector('[id^=poll-]').id)
<form id="poll-1225962377536"></form>


36
querySelectorAll 很好用。但是 document.querySelectorAll('[id^="poll-"]') 返回的是一个列表。我们需要遍历这个列表,获取id,而不能使用 document.querySelectorAll('[id^="poll-"]').id - Sophia Feng
3
如果稍微有所不同,你知道这个动态值的结束会怎样?在我的情况下,它是id="dynamic_constant"。 - JoeL
4
@JoeL中的^匹配字符串开头,$匹配字符串结尾,*匹配字符串中的任意位置。在你的例子中应该使用id$="dynamic_constant" - A1rPun
4
抱歉,我在举例时应该更清楚。我该如何选择所有id以'user-'开头且以'-image'结尾的元素,但中间的数字可能会变化? - Dave Potts
7
@DavePotts 使用 [id^=user-][id$=-image] :) - A1rPun
显示剩余6条评论

12

试一下这个。

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/


11

querySelectorAll现代枚举方法

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

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

首行选取所有以字符串“poll-”开头的id元素。 第二行调用枚举和回调函数。

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的唯一性。这意味着可能有多个元素共享相同的前缀。也许您想找到它们全部。
如果要查找具有给定前缀的所有元素,而不仅仅是第一个元素,可以使用此处演示的内容:http://jsfiddle.net/xwqKh/1/

2

我不完全确定你在问什么,但是你可以使用字符串函数来创建你所需要的实际ID。

var base = "common";
var num = 3;

var o = document.getElementById(base + num);  // will find id="common3"

如果您不知道实际ID,则无法使用getElementById查找对象,您必须以其他方式查找它(按类名、标签类型、属性、父级、子级等查找)。
现在您终于提供了一些HTML代码,您可以使用以下纯JS查找所有具有以“poll-”开头的ID的表单元素:
// 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);
}

问题是我只知道基础,但我不知道数值。 - calebo
然后,您不能仅使用ID名称的一部分来使用getElementById。如果您发布实际的HTML,我们可以帮助您采用不同的策略。对于您的新示例,您可以使用以“post-”开头的ID的CSS3策略,但只有少数浏览器可以使用纯JS /浏览器(CSS3选择器引擎支持)。最好使用jQuery,Sizzle,YUI3等选择器引擎。 - jfriend00
我只需要能够将以“poll-”开头的id元素设置为变量的值。 <form class="form-poll" id="poll-1225962377536" action="/cs/Satellite" target="_blank"> - calebo
如果您不想使用更高级的选择器引擎,那么标签、ID和类的结构就是您所拥有的全部。如果您不想分享并且不会使用选择器引擎,那么我们就陷入了死胡同。如果您只告诉我们它是什么类型的标签,我们可以查看所有标签以进行部分ID匹配。 - jfriend00
好的,既然你展示了一些HTML,我添加了两个不同的函数来查找那些类型的表单元素。 - jfriend00

1

你可能需要给它一个常量类并调用getElementsByClassName,或者只是使用getElementsByTagName,并循环遍历结果,检查名称。

我建议您查看底层问题,并找出一种可以预先知道ID的方法。

也许如果您发布了更多关于为什么会出现这种情况的信息,我们可以找到更好的替代方案。


请注意,getElementsByClassName在一些旧版浏览器中不受支持(任何IE9之前的版本)。 - jfriend00
@jfriend00 好主意。这就是我在所有DOM脚本中使用jQuery的原因之一,这样我就不必记住那种东西了。 - Joe Enos
当我没有jQuery并且不想将其引入页面时,我使用Sizzle库,它(我认为)是jQuery内部的选择器引擎。它也解决了这个问题,并提供了完整的选择器逻辑。现在没有太多理由仅使用IE8本地支持的功能。 - jfriend00

0

您可以使用 id 属性获取 id,然后使用 substr 方法删除其前面的部分,最后可选地使用 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">

标识符始终以“post-”开头,然后数字是动态的。

请检查您的ID名称,“poll”和“post”非常不同。

如已回答,您可以使用querySelector:

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

但是如果你一直查询“post”,querySelector将无法找到“poll”:'[id^="post-"]'


0
如果您需要最后一个 ID,可以这样做:
var id_list = document.querySelectorAll('[id^="image-"]')
var last_id = id_list.length
alert(last_id)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接