【问题标题】:jquery how to find element searching against attribute namejquery如何查找针对属性名称搜索的元素
【发布时间】:2012-05-20 05:14:34
【问题描述】:

我有一个非常具体的查询,如何找到具有某个属性的所有元素。

我的元素具有遵循特定模式的属性,以下是一些示例:

 <div data-jtemplate-href="x"></div>
 <span data-jtemplate-text="x"></span>
 <input data-jtemplate-something="x"/>
 <table data-jtemplate-else="x"></table>

如您所见,我所有的元素都具有名称前缀为'data-jtemplate'的属性,我如何找到所有带有属性前缀data-jtemplate的元素?

【问题讨论】:

    标签: jquery attributes css-selectors


    【解决方案1】:

    创建您自己的表达式,请参阅http://jsfiddle.net/6pCh4/

    $.expr[":"].dataAttrStartingWith = function(el, i, m) {
      for (var p in $(el).data()) {
         if (p.substring(0, m[3].length) === m[3]) return true;    
      }
      return false;
    };  
    
    
    console.log($('body *:dataAttrStartingWith(jtemplate)'))
    

    此表达式将过滤所有具有data-jtemplate-* 属性的元素(正如您在小提琴中看到的那样,我添加了另一个被此过滤器正确丢弃的元素)

    当然,这可以通过其他 data-* 属性进行自定义(只需在选择器中更改 jtemplate

    【讨论】:

    • 不知道您可以添加自己的表达式。现在我做:) 干杯
    • 请注意,如果您重复执行此操作,我怀疑查找类对浏览器的执行效率会更高。
    【解决方案2】:

    只需添加另一个您可以搜索的属性(数据或其他):

     <div class="jtemplate" data-jtemplate-href="x"></div>
     <span class="jtemplate" data-jtemplate-text="x"></span>
     <input class="jtemplate" data-jtemplate-something="x"/>
     <table class="jtemplate" data-jtemplate-else="x"></table>
    

    无需将其定义为 CSS 样式。现在您只需要选择器$('.jtemplate') 来获取所有这些元素。

    【讨论】:

    • 如果这些元素有自己的类而不是所有的类怎么办?
    • 你可以给任意DOM元素添加多个类,用空格分隔,它们都会被应用到那个元素:&lt;p class="jtemplate big medium small"&gt;...&lt;/p&gt;
    • 无需添加其他类,只需创建自定义表达式
    【解决方案3】:

    我建议你按照这个来转换你的标记:

    <div "data-jtemplate"="href-x"></div>
    <span "data-jtemplate"="text-y"></span>
    <input "data-jtemplate"="something-z" />
    <table "data-jtemplate"="else-v"></table>
    

    现在您可以进行非常简单的搜索:

    var jTemplate = $("*[data-jtemplate]") // selects all elements with that prefix
    $("*[data-jtemplate^='href-']", jTemplate) // select all elements with href in jTemplate scope
    $("*[data-jtemplate^='text-']").each( function(i, ele)
    {
       var attr = $(this).attr("data-jtemplate").replace("text-",""); // gives you actual value of the attribute
    });
    

    更新:

    <div 'data-jtemplate'='{href:"http://example.com",text:"example",attr:10,private:false}'></div> 
    // {href:"http://example.com",text:"example",attr:10,private:false} -> easy to create on the server
    
    var json = $("[data-jtemplate]").eq(0).attr("data-jtemplate");
    var parsedData = $.parseJSON(json);
    var href = parsedData.href; // etc -- easy to access
    

    【讨论】:

    • 但是如果他想要每个 DOM 元素不止一个 data-jtemplate 值怎么办?即&lt;div data-jtemplate-href="x" data-jtemplate-text="y"&gt;&lt;/div&gt;
    • then class, idd, 你可以使用特殊的class,或者你可以添加这样的逻辑:data-jtemplate='{text:"val",href:"qq.com",else:"nom-nom"}' - then您可以简单地将其解析为 JSON,并且您可以消除编写解析表达式的所有需要​​;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2020-01-30
    • 2010-10-16
    相关资源
    最近更新 更多