【问题标题】:Find all elements whose id begins with a common string查找 id 以公共字符串开头的所有元素
【发布时间】:2023-04-01 07:03:01
【问题描述】:

我有一个 XSL,它创建了多个 id 为“createdOn”的元素加上一个 $unique-id

Example : createdOnid0xfff5db30

我想使用 JavaScript 查找这些变量并将其存储在一个变量中。我试过了

var dates = document.getElementsById(/createdOn/);

但这似乎不起作用。

【问题讨论】:

标签: javascript regex


【解决方案1】:

使用 jQuery 你可以使用attr starts with 选择器:

var dates = $('[id^="createdOnid"]');

使用现代浏览器,您可以将CSS3 attribute value begins with 选择器与querySelectorAll 一起使用:

var dates = document.querySelectorAll('*[id^="createdOnID"]');

但是对于旧浏览器(并且没有 jQuery)的后备,您需要:

var dateRE = /^createdOnid/;
var dates=[],els=document.getElementsByTagName('*');
for (var i=els.length;i--;) if (dateRE.test(els[i].id)) dates.push(els[i]);

【讨论】:

  • @Šime 我不知道答案,无论是对于 jQuery、W3C 规范还是现实世界的浏览器行为。但它不会损害功能:)
  • 酷。我使用 self.driver.execute_script("return document.querySelectorAll... ")[0].click() 让 Selenium 做到了这一点
【解决方案2】:

您应该刚刚使用了简单的CSS selectorJavaScript.querySelectorAll() 方法。

在你的情况下:

var dates = document.querySelectorAll('[id^="createdOnId"]');

【讨论】:

    【解决方案3】:

    因为您没有标记 jQuery,而且您可能不需要它,所以我的建议是在创建这些元素时为这些元素添加一个类。然后使用大多数浏览器内置的 getElementsByClassName() 函数。对于 IE,您需要添加类似 this:

    if (typeof document.getElementsByClassName!='function') {
        document.getElementsByClassName = function() {
            var elms = document.getElementsByTagName('*');
            var ei = new Array();
            for (i=0;i<elms.length;i++) {
                if (elms[i].getAttribute('class')) {
                    ecl = elms[i].getAttribute('class').split(' ');
                    for (j=0;j<ecl.length;j++) {
                        if (ecl[j].toLowerCase() == arguments[0].toLowerCase()) {
                            ei.push(elms[i]);
                        }
                    }
                } else if (elms[i].className) {
                    ecl = elms[i].className.split(' ');
                    for (j=0;j<ecl.length;j++) {
                        if (ecl[j].toLowerCase() == arguments[0].toLowerCase()) {
                            ei.push(elms[i]);
                        }
                    }
                }
            }
            return ei;
        }
    }
    

    【讨论】:

    • 通过创建正则表达式来测试特定类的 className 可以更加轻松快捷:var lookingFor = new RegExp('(?:^|\\s)'+arguments[0]+'(?:\\s|$)'); ... if (lookingFor.test(el.className)){ ... }
    【解决方案4】:
    function idsLike(str){
        var nodes= document.body.getElementsByTagName('*'),
        L= nodes.length, A= [], temp;
        while(L){
            temp= nodes[--L].id || '';
            if(temp.indexOf(str)== 0) A.push(temp);
        }
        return A;
    }
    
    idsLike('createdOn')
    

    【讨论】:

      【解决方案5】:

      尝试以下方法:

      var values = new Array(valueKey_1);
      var keys = new Array("nameKey_1");
      var form = document.forms[0];
      for (var i = 0; i < form.length; i++) {
          name = form.elements[i].name;
          var startName = name.toLowerCase().substring(0, 18);
          if (startName == 'startStringExample') {
          values.push(name.value);
          keys.push(name);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-08-02
        • 2012-06-30
        • 2016-12-17
        • 2011-01-18
        • 2017-04-23
        • 2011-11-30
        • 1970-01-01
        • 2011-04-07
        相关资源
        最近更新 更多