使用 JavaScript 通过自定义属性获取元素

发布于 2024-11-14 10:33:51 字数 344 浏览 3 评论 0原文

我有一个 XHTML 页面,其中每个 HTML 元素都有一个唯一的自定义属性,如下所示:

<div class="logo" tokenid="14"></div>

我需要一种通过 ID 查找此元素的方法,类似于 document.getElementById(),但不是使用通用的ID,我想使用自定义 "tokenid" 属性搜索元素。就像这样:

document.getElementByTokenId('14'); 

这可能吗?如果是的话 - 任何提示将不胜感激。

I have an XHTML page where each HTML element has a unique custom attribute, like this:

<div class="logo" tokenid="14"></div>

I need a way to find this element by ID, similar to document.getElementById(), but instead of using a general ID, I want to search for the element using my custom "tokenid" attribute. Something like this:

document.getElementByTokenId('14'); 

Is that possible? If yes - any hint would be greatly appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

沧笙踏歌 2024-11-21 10:33:51

在 HTML 中使用自定义属性并不好。如果有的话,您应该使用 HTML5 的 data 属性

不过,您可以编写自己的函数来遍历树,但这与 getElementById 相比相当慢,因为您无法使用任何索引:

function getElementByAttribute(attr, value, root) {
    root = root || document.body;
    if(root.hasAttribute(attr) && root.getAttribute(attr) == value) {
        return root;
    }
    var children = root.children, 
        element;
    for(var i = children.length; i--; ) {
        element = getElementByAttribute(attr, value, children[i]);
        if(element) {
            return element;
        }
    }
    return null;
}

在最坏的情况下,这会遍历整棵树。想想如何改变你的观念,让你能尽可能的利用浏览器的功能。

在较新的浏览器中,您使用 querySelector 方法,它会在哪里:

var element = document.querySelector('[tokenid="14"]');

这也会快得多。


更新:请注意下面 @Andy E 的评论。您可能会遇到 IE 问题(一如既往;))。如果您进行大量此类元素检索,那么您确实应该考虑使用 JavaScript 库,例如 jQuery,正如其他人提到的那样。它隐藏了所有这些浏览器差异。

It is not good to use custom attributes in the HTML. If any, you should use HTML5's data attributes.

Nevertheless you can write your own function that traverses the tree, but that will be quite slow compared to getElementById because you cannot make use of any index:

function getElementByAttribute(attr, value, root) {
    root = root || document.body;
    if(root.hasAttribute(attr) && root.getAttribute(attr) == value) {
        return root;
    }
    var children = root.children, 
        element;
    for(var i = children.length; i--; ) {
        element = getElementByAttribute(attr, value, children[i]);
        if(element) {
            return element;
        }
    }
    return null;
}

In the worst case, this will traverse the whole tree. Think about how to change your concept so that you can make use browser functions as much as possible.

In newer browsers you use of the querySelector method, where it would just be:

var element = document.querySelector('[tokenid="14"]');

This will be much faster too.


Update: Please note @Andy E's comment below. It might be that you run into problems with IE (as always ;)). If you do a lot of element retrieval of this kind, you really should consider using a JavaScript library such as jQuery, as the others mentioned. It hides all these browser differences.

—━☆沉默づ 2024-11-21 10:33:51
<div data-automation="something">
</div>

document.querySelector("div[data-automation]")

=>找到div

document.querySelector("div[data-automation='something']")

=>查找具有值的 div

<div data-automation="something">
</div>

document.querySelector("div[data-automation]")

=> finds the div

document.querySelector("div[data-automation='something']")

=> finds the div with a value

杀お生予夺 2024-11-21 10:33:51

如果您使用 jQuery,您可以使用它们的一些选择器魔法来执行以下操作:

    $('div[tokenid=14]')

作为您的选择器。

If you're using jQuery, you can use some of their selector magic to do something like this:

    $('div[tokenid=14]')

as your selector.

一口甜 2024-11-21 10:33:51

用普通的 JavaScript 来做这件事就可以了:

  const something = document.querySelectorAll('[data-something]')

Doing this with vanilla JavaScript will do the trick:

  const something = document.querySelectorAll('[data-something]')
胡大本事 2024-11-21 10:33:51

您可以使用 JQuery 来完成此操作:

$('[tokenid=14]')

这里是一个小提琴示例。

You can accomplish this with JQuery:

$('[tokenid=14]')

Here's a fiddle for an example.

怪我入戏太深 2024-11-21 10:33:51

如果您愿意使用 JQuery,那么:

var myElement = $('div[tokenid="14"]').get();

If you're willing to use JQuery, then:

var myElement = $('div[tokenid="14"]').get();
预谋 2024-11-21 10:33:51

使用这个更稳定的函数:

function getElementsByAttribute(attr, value) {
  var match = [];
  /* Get the droids we are looking for*/
  var elements = document.getElementsByTagName("*");
  /* Loop through all elements */
  for (var ii = 0, ln = elements.length; ii < ln; ii++) {
    if (elements[ii].nodeType === 1){      
      if (elements[ii].name != null){        
      /* If a value was passed, make sure it matches the elements */
        if (value) {
          if (elements[ii].getAttribute(attr) === value) 
           match.push(elements[ii]);           
      } else {
        /* Else, simply push it */
         match.push(elements[ii]);          
      }
     }
   }
  }
return match;
};

Use this more stable Function:

function getElementsByAttribute(attr, value) {
  var match = [];
  /* Get the droids we are looking for*/
  var elements = document.getElementsByTagName("*");
  /* Loop through all elements */
  for (var ii = 0, ln = elements.length; ii < ln; ii++) {
    if (elements[ii].nodeType === 1){      
      if (elements[ii].name != null){        
      /* If a value was passed, make sure it matches the elements */
        if (value) {
          if (elements[ii].getAttribute(attr) === value) 
           match.push(elements[ii]);           
      } else {
        /* Else, simply push it */
         match.push(elements[ii]);          
      }
     }
   }
  }
return match;
};
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文