【问题标题】:Javascript getElementById based on a partial string基于部分字符串的Javascript getElementById
【发布时间】:2011-10-22 22:03:47
【问题描述】:

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

这是代码的 sn-p。

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

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

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

【问题讨论】:

  • 为了清楚起见,请显示示例标记
  • 你要元素的id,还是有id的元素?
  • 我要获取元素的ID。
  • 如果这是您自己的网站代码,我建议您为这些元素中的每一个赋予一个类。它仍然需要一定程度的代码,但有许多用于 getElementsByClassName 的预构建函数。一些现代浏览器原生支持上述功能。
  • @Kranu - getElementsByClassName 还没有完全预先构建。如果您希望它在 IE 中正常工作(至少,旧版本的 IE ......也许它已在新版本中修复),那么您必须自己修补它。

标签: javascript getelementbyid


【解决方案1】:

can usequerySelector

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

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

^ 匹配起点
* 匹配任意位置
$ 匹配终点

jsfiddle

【讨论】:

  • querySelectorAll 很棒。除了document.querySelectorAll('[id^="poll-"]') 返回一个列表。我们需要迭代列表以获取 id 而不是使用document.querySelectorAll('[id^="poll-"]').id
  • 如果你知道动态值的 END 有什么不同呢?在我的场景中,它是 id="dynamic_constant"?
  • @JoeL ^ 匹配起点,$ 匹配终点,* 匹配任意位置。在您的情况下,它将是id$="dynamic_constant"
  • 对不起,我的例子应该更清楚。我将如何选择 ID 以“user-”开头并以“-image”结尾的所有元素,但中间的数字可能会有所不同。
  • @DavePotts 使用 [id^=user-][id$=-image] :)
【解决方案2】:

试试这个。

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/

【讨论】:

    【解决方案3】:

    querySelectorAll 使用现代枚举

    polls = document.querySelectorAll('[id ^= "poll-"]');
    Array.prototype.forEach.call(polls, callback);
    
    function callback(element, iterator) {
        console.log(iterator, element.id);
    }
    

    第一行选择id^= 开头的字符串poll- 的所有元素。 第二行调用枚举和回调函数。

    【讨论】:

      【解决方案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/

      【讨论】:

        【解决方案5】:

        我不完全确定我知道你在问什么,但你可以使用字符串函数来创建你正在寻找的实际 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);
        }
        

        【讨论】:

        • 问题是我只知道base,不知道num值。
        • 那么,没有完整的 ID 名称就不能使用 getElementById。如果您发布您的实际 HTML,我们可以帮助您采用不同的策略。在您的新示例中,您可以对以“post-”开头的 ID 使用 CSS3 策略,但只有少数浏览器可以使用纯 JS/浏览器(CSS3 选择器引擎支持)来实现。在 jQuery、Sizzle、YUI3 等中使用选择器引擎会更好......
        • 我只需要能够设置一个变量,其中 id 以 'poll-' 开头的元素作为它的值。
        • 如果您不打算使用更高级的选择器引擎,标签、ID 和类的结构就是您所拥有的。如果您不想共享并且不会使用选择器引擎,那么我们就处于死胡同。如果您只想告诉我们它是什么类型的标签,我们可以查看所有这些标签以进行部分 ID 匹配。
        • 好的,既然您已经展示了一些 HTML,我添加了两个不同的函数来查找这些类型的表单元素。
        【解决方案6】:

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

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

        也许如果你发布更多关于你为什么会得到这个的信息,我们可以找到一个更好的选择。

        【讨论】:

        • 请记住,getElementsByClassName 在某些较旧的浏览器中不受支持(IE9 之前的任何 IE 版本)。
        • @jfriend00 好电话。这就是我在所有 DOM 脚本中使用 jQuery 的原因之一,所以我不必记住那种东西。
        • 当我没有 jQuery 并且不想将其拉入页面时,我使用 Sizzle 库,它(我认为)是 jQuery 内部的选择器引擎。它也解决了这个问题,并为您提供了完整的选择器逻辑。这些天没有太多理由只使用 IE8 原生可以做的事情。
        【解决方案7】:

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

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

        或:

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

        【讨论】:

          【解决方案8】:
          <form class="form-poll" id="poll-1225962377536" action="/cs/Satellite" target="_blank">
          

          ID 总是以“post-”开头,然后数字是动态的。

          请检查您的 id 名称,“poll”和“post”有很大不同。

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

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

          但如果您继续查询“post”,querySelector 将找不到“poll”:'[id^="post-"]'

          【讨论】:

            猜你喜欢
            • 2015-10-31
            • 1970-01-01
            • 2019-09-19
            • 2013-10-02
            • 1970-01-01
            • 2021-12-31
            • 1970-01-01
            • 2022-10-19
            • 1970-01-01
            相关资源
            最近更新 更多