【问题标题】:Scan DOM and return or manipulate elements that have specific attributes prepended with specific string [duplicate]扫描 DOM 并返回或操作具有以特定字符串开头的特定属性的元素 [重复]
【发布时间】:2013-10-17 06:58:11
【问题描述】:

我试图弄清楚如何从 DOM(从上到下)获取包含以给定字符串为前缀的特定属性的元素列表,例如,“猴子”就是那个字符串。如果有的话。

我使用$.each() 和:contains 提出了这个非常松散的想法,但在两者之间我看不出有什么好处。所以我想我会来这里挑选一些大脑。

我想要做的基本上是扫描我的 dom,当我调用一个给定的函数时,我最终会建立起来。这将寻找具有在这种情况下以“猴子”为前缀的属性的元素,想想data- 属性及其用途。减去提供特定选择器,而不是实际使用 data- 属性。

想象一下这个 HTML

<div monkey-user="bar" monkey-permission="read">
    <span monkey-user="bar" monkey-permission="read">some text</span>
</div>
<div>
    <input type="text" monkey-user="bar" monkey-permission="none">
</div>
<input type="text">
<input type="text">
<input type="text">
<input type="text">

然后是这个 javascript/jquery 概念,除非可以使用更清洁的东西。

var arr = new Array();
$("*").each(function()
    {
     if($(this).children().length == 0) 
         {
              if($(':contains("monkey-")',this))
              {
                 arr.push($(this));
              }   
         }
 });

在这种情况下,arr 的结果将是上面的 3 个元素,其中包含 monkey-,否则会跳过其他任何内容。还值得注意的是用户/权限是为了举例,从长远来看,这些可以是其他特定的东西,将根据需要使用(在这种情况下,这些将类似于使用 data 属性但我认为这将是另一个问题,因为没有人愿意将其作为奖励。

【问题讨论】:

  • 这似乎不是一个好主意。如果你描述你的实际用途,也许会有更好的方法。
  • 没有属性通配符选择器,因此您所做的任何事情都会效率低下。您必须遍历 dom 中的每个元素,然后遍历每个元素上的每个属性以查找匹配的属性。我建议找到另一种选择这些元素的方法。
  • 什么不是真正使用 data- 属性而不是试图模仿它?

标签: javascript jquery html jquery-selectors


【解决方案1】:

你可以试试这个方法:

var arr = $("body").find('*').filter(function(){
    var attrs = this.attributes; //get the attributes of the element
    return ($.grep(attrs, function(o){
        return /monkey/.test(o.name); //return the attributes that has name to be matched
    }).length); //return the elements that has at least one of the matched attributes
}).get();
console.log(arr);

Fiddle

但请注意,这些属性名称对 html 元素无效。考虑改用data-* 属性

如果您打算使用 data-* 那么您可以使用 data api(但这也会选择其他不是元素属性的数据属性集)

var arr = $("body").find('*').filter(function(){
    var attrs = Object.keys($(this).data());
    return ($.grep(attrs, function(o){
        return /monkey/.test(o) === true;
    }).length);
}).get();

Fiddle

但是这些方法确实会减慢速度并且效率低下,我建议您在所有具有猴子属性的属性中添加另一个属性,例如 data-hasmonkey。然后你可以让属性选择器更简单更好:$("[data-hasmonkey]");

【讨论】:

  • 缓慢是我关心的问题之一,因为我知道它基本上循环遍历 DOM 中的所有内容来做到这一点。但它用于我工作的公司的专有需求,以及他们想要它用于“组织”需求..
  • @chris 你知道哪些元素类型有机会拥有这个属性,那么你至少可以过滤以只查看那些元素类型而不是*。
  • 不幸的是,它可以是任何东西......从简单的跨度到 div,再到形成元素......基本上任何你会在开始和结束的正文标签中附加的东西。这就是为什么我需要在堆栈上挑选一些大脑.. 我无法用理智的逻辑来思考,希望其他人可能有。我认为老板的想法是基于 angular.js 并查看它如何在其标签中使用 ng- 将事物联系在一起
猜你喜欢
  • 1970-01-01
  • 2012-11-01
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
  • 2016-12-04
  • 2023-04-05
相关资源
最近更新 更多