【问题标题】:Vanilla Javascript: Find a data attribute of the same name as an element given its idVanilla Javascript:查找与给定其id的元素同名的数据属性
【发布时间】:2017-09-06 05:14:21
【问题描述】:

是否可以在 DOM 中找到具有与元素 id 相同名称的 data 属性的元素? (给数据属性赋予与 id 相同的值是不是一种不好的做法?)

示例语法:

HTML:

<li id="tab-1"></li>
<p data-tab="tab-1">Content 1</p>

想知道如何在 Vanilla Javascript 中实现这一点。谢谢☺

编辑:我希望编写我的代码,以便如果我有元素的 ID,如果我没有关闭它,我可以只查找相同值的数据属性我的头顶。

【问题讨论】:

  • querySelector
  • “这是不好的做法吗” ...如果两者之间存在密切关系,则根本不是。不完全清楚你到底在问什么。您想要 “find same as” 的用例是什么?
  • "编辑:我希望编写我的代码,以便如果我有元素的 ID,如果我没有,我可以只查找相同值的数据属性它从我的脑海中消失。”您需要data-* 属性的特定.namecss 选择器不提供仅通过属性值选择元素的方法。
  • “是否有可能找到具有与元素 id 相同名称的数据属性的元素” data-* 属性没有 .name 属性等于问题元素的.id

标签: javascript dom custom-data-attribute


【解决方案1】:

是的,你可以这样做。 以下是你的做法:

var usingId = document.querySelector('#tab-1');
var usingDt = document.querySelector('[data-tab="tab-1"]');
console.log(usingId);
console.log(usingDt);
<li id="tab-1">Tab</li>
<p data-tab="tab-1">P Tab</p>

这是一种不好的做法吗?不是

【讨论】:

    【解决方案2】:

    如果您尝试使用来自不同元素的.id 字符串属性选择具有未知html5 data-* 属性的元素,您可以查询document 中的所有元素,检查.name 和@每个元素的.attributes 的987654327@,如果属性的.value 等于提供.id 的元素的.id 并且.attribute 属性的.name 不是"id",则使用匹配的元素属性等于.querySelector()处的选择器

    <li id="tab-1"></li>
    <p data-tab="tab-1">Content 1</p>
    <script>
    let id = document.getElementById("tab-1").id;
    for (let el of document.querySelectorAll("*")) {
      for (let {name, value} of el.attributes) {  
      if (value === id && name !== "id") {
         document.querySelector(`[${name}="${id}"]`)
         .style.color = "green";
         break;
      }
      }
    }
    </script>

    【讨论】:

    • let id = document.getElementById("tab-1").id; 这让我很开心。谢谢。 (你也可以let id = document.getElementById("tab-1").id.split('').join('').replace(/a/g, 'a');
    • @Kaiido 或let {id} = document.getElementById("tab-1")。只是试图按照解释回答问题。也就是说,查询 document 以获取仅使用 .id 匹配 data-* 属性值的元素。
    • @Kaiido 正如对问题的解释,未提供data-* 属性的.name,仅.value 与不同元素的.id 相同。 css 选择器不会仅通过属性值来选择元素。虽然可以通过编写一个函数来完成。
    • 好吧,css 选择器不是那种方式,但这个let id= ... 仍然完全没用而且很有趣。而不是像这样在 quesrySelctorAll 的所有元素上循环,您应该使用 DOMTreeWalker,它更有效,并且只有元素可以具有属性。
    • TreeWalker 也不是这个用例的最佳选择,但您绝对应该尝试一下。 developer.mozilla.org/en-US/docs/Web/API/Document/…
    【解决方案3】:

    如果需要不知道attribute 的名称,哪个值是您要查找的字符串,那么您可以创建一个XPath query,它将返回所有具有该值属性的元素:

    //*[@*='value']

    解压:

    '//' + // from root to anywhere in the tree
       '*' + // any kind of node
         '[@*' + // with any attribute
             ' = "value"' // which value is 'value'
                          ']'
    

    var valueToFind = 'find-me';
    var query = document.evaluate(`//*[@*='${valueToFind}']`, document, null, XPathResult.ANY_TYPE, null);
    var elements = [], el;
    while(el = query.iterateNext()){
      // in your case you will filter it to not be the original node 
      // if(el !== original)
      elements.push(el);
      }
    console.log(elements);
    <div data-id="find-me"></div>
    <div data-id="do-not-find-me"></div>
    <div class="find-me"></div>
    <div class="do-not-find-me"></div>
    <div style="find-me"></div>
    <div id="find-me"></div>

    如果目标是只获取具有此类值的data-* 属性的元素,那么查询会更长一些:

    //*[@*[starts-with(name(), 'data-')] = '${valueToFind}']

    解压:

     '//' + // from root to anywhere in the tree
      '*' + // any kind of node
       '[@*' + // with any attribute
          '[starts-with(name(), "data-")]' + // which starts with "data-"
             ' = "value"' // and which value is 'value'
               ']'
    

    var valueToFind = 'find-me';
    var query = document.evaluate(`//*[@*[starts-with(name(), 'data-')] = '${valueToFind}']`, document, null, XPathResult.ANY_TYPE, null);
    var elements = [], el;
      
    while(el = query.iterateNext()){
      elements.push(el);
      }
    console.log(elements);
    <div data-id="find-me"></div>
    <div data-foo="find-me"></div>
    <div data-id="do-not-find-me"></div>
    <div class="find-me"></div>
    <div class="do-not-find-me"></div>
    <div style="find-me"></div>
    <div id="find-me"></div>

    【讨论】:

    • OP 专门尝试选择具有data-* 属性的元素,其值等于不同的元素.id@* 是通配符吗?如果是,如何调整以仅匹配具有data-* 属性的元素?
    • @guest271314 我不知道要制作部分 通配符 值,因此您必须在 while 循环中对其进行过滤:您只需要检查 @ 987654336@您已经过滤了文档节点的巨大部分。
    • 您为什么不在Answer 执行任务?当然,对于“是否可以找到具有与元素 ID 相同的 .name 相同的数据属性的元素”的问题并不完全清楚,因为 data-* 属性是 "data-tab",而不是 "data-tab-1"。也许 OP 意味着具有相同的 data-* 值作为不同元素的 .id 值?
    • @guest271314,添加了一个带有过滤功能的新 sn-p,我不得不承认我也对真正的要求感到困惑。
    • @guest271314 实际上有一个以 XPath 开头的函数...我不知道 ;-) 也回答了第二个链接,但第一个有点无关紧要,dataset 方法可能更干净。
    猜你喜欢
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    相关资源
    最近更新 更多