通过Id获取多个元素

IT技术 javascript html elements
2021-01-31 22:36:46

我有一个页面,整个页面都带有锚标记,如下所示:

<a id="test" name="Name 1"></a>
<a id="test" name="Name 2"></a>
<a id="test" name="Name 3"></a>

ID 始终相同,但名称会更改。

例如,我需要填充这些锚标记的名称列表;姓名 1、姓名 2、姓名 3。到目前为止,这是我到达的地方:

document.write(document.getElementById("readme").name);

这会写出第一个锚标记的名称。我需要一种通过 Id 获取多个元素的方法。


任何帮助是极大的赞赏。

6个回答

如果您可以更改标记,则可能需要class改用。

HTML

<a class="test" name="Name 1"></a>
<a class="test" name="Name 2"></a>
<a class="test" name="Name 3"></a>

JS

var elements = document.getElementsByClassName("test");
var names = '';
for(var i = 0; i < elements.length; i++) {
    names += elements[i].name;
}
document.write(names);

jsfiddle 演示

如果我使用 <p> 或 <div> 而不是 <a> 上面的小提琴不起作用
2021-03-16 22:36:46
如果您想要一个适用于所有三个的属性,<p>、<div>、<a>。然后也许可以使用像标题这样的全局属性。所以它将是 <p title="my attribute">。然后像这样读取值:elements[i].title。您可以在同一个 jsfiddle 中尝试此操作。developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes
2021-04-06 22:36:46

今天,您可以通过这种方式选择具有相同 id 属性的元素:

document.querySelectorAll('[id=test]');

或者用jQuery这种方式:

$('[id=test]');

CSS 选择器#test { ... }也适用于所有带有id = "test". 唯一的事情:(document.querySelectorAll('#test')$('#test')) - 将仅返回具有此 ID 的第一个元素。好不好 - 我不知道。但有时很难遵循唯一标识标准

例如,您有带有 HTML-id 和 JS 代码的评论小部件,使用这些 HTML-id。迟早你需要多次渲染这个小部件,将不同的对象评论到一个页面中:这里标准将被破坏(通常没有时间或不允许 - 重写内置代码)。

感谢您按要求回答问题,而不是对其进行框架挑战。使用类是一个可爱的解决方案...除非您使用其他人的代码/网页。对于诸如 Tampermonkey 脚本之类的东西,我们无法让页面“正确”。我想隐藏 Quora 的所有新的付费“订阅”帖子,这些帖子都具有 id="content_paywall_card_title_text" 并且没有其他与常规帖子显着的区别特征。所以这个答案实际上回答了所问的问题,非常有帮助。谢谢你。
2021-03-16 22:36:46
正确回答问题 + 比 $('*').filter 答案更有效。除非您知道自己在做什么,否则使用类是最好的解决方案。
2021-04-13 22:36:46

与其他人可能说的相反,对多个元素使用相同的 Id 不会阻止页面加载,但是当尝试通过 Id 选择元素时,返回的唯一元素是指定了 id 的第一个元素。更不用说使用相同的 id 甚至不是有效的 HTML。

既然如此,永远不要使用重复的 id 属性。如果您认为需要,那么您正在寻找课程例如:

<div id="div1" class="mydiv">Content here</div>
<div id="div2" class="mydiv">Content here</div>
<div id="div3" class="mydiv">Content here</div>

请注意每个给定元素如何具有不同的 id,但具有相同的类。与您上面所做的相反,这是合法的 HTML 语法。您用于“.mydiv”(点表示类)的任何 CSS 样式都将适用于具有相同类的每个单独元素。

在 Snipplr 的帮助下,您可以使用它通过指定某个类名来获取每个元素:

function getAllByClass(classname, node) {

    if (!document.getElementsByClassName) {
        if (!node) {
            node =  document.body;
        }

        var a = [],
            re = new RegExp('\\b' + classname + '\\b'),
            els = node.getElementsByTagName("*");

        for (var i = 0, j = els.length; i < j; i++) {
            if (re.test(els[i].className)) {
                a.push(els[i]);
            }
        }
    } else {
        return document.getElementsByClassName(classname);
    }

    return a;
}

上面的脚本将返回一个数组,因此请确保为此正确调整。

@Shaz 你就是那个人,因为你用纯 JavaScript +1 让它保持真实。
2021-03-29 22:36:46
@Sean Patrick Floyd 好吧,对于一个 OP 没有要求 jQuery,如果用户只需要一些功能,为什么要增加页面加载时间,稍微降低速度?当然,您使用 jQuery 编写的代码可能更短,但总体而言要大得多。每次我想要牛排时,我都不会买一整头牛。
2021-03-31 22:36:46
@Sean Patrick Floyd 我同意这一点,我的主要观点是 10 行代码,你不应该只是诉诸于使用框架。
2021-04-06 22:36:46
@Loktar 突然需要重新发明轮子了?有几十个生产质量的库可以将上述代码简化为单行代码。
2021-04-12 22:36:46
@Loktar 我认为如果你做任何重要的事情都有一个 javascript DOM 操作库是必须的。只需从 CDN 获取它,它就会被缓存。除了上述功能之外,还有一些浏览器错误。
2021-04-12 22:36:46

您不能有重复的 ID。ID 应该是唯一的。您可能想改用专门的类。

是的,您可以拥有重复的 ID。这是一个坏主意,但你可以拥有它们。
2021-03-15 22:36:46

这是我想出的一个函数

function getElementsById(elementID){
    var elementCollection = new Array();
    var allElements = document.getElementsByTagName("*");
    for(i = 0; i < allElements.length; i++){
        if(allElements[i].id == elementID)
            elementCollection.push(allElements[i]);

    }
    return elementCollection;
}

显然,原型支持一个约定,可能还有其他主要的 JavaScript 库。

然而,我发现美元符号函数或多或少已经成为 document.getElementById() 的事实上的快捷方式。让我们面对现实吧,我们都经常使用 document.getElementById()。不仅键入需要时间,而且还会向代码中添加字节。

这是原型中的函数:

function $(element) {
  if (arguments.length > 1) {
    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
      elements.push($(arguments[i]));
    return elements;
  }
  if (Object.isString(element))
    element = document.getElementById(element);
  return Element.extend(element);
}

[来源]