【问题标题】:How to select attribute with the same first word and optional for the last word?如何选择第一个单词相同且最后一个单词可选的属性?
【发布时间】:2019-08-22 17:37:18
【问题描述】:

我有这种元素

<div class="clas"></div>
<div class="clas_temp"></div>
<div class="clastemp"></div>
<div class="clas_test"></div>
<div class="clas_tmp"></div>
<div class="clas_t"></div>

我需要选择属性id 的第一个单词clas 是否具有可选的下一个值_test_ttemp

我只知道使用以下语法选择第一个单词。

$( "div[class^='clas']" ).html( "insert!" );

sn-p 上方将选择以clas 开头的所有类,但我需要更具体的第二个可选下一个值_test_ttemp。我怎么能那样做?可能的方法是使用像(_test|_t|temp) 这样的正则表达式,但是在 jQuery 中有一个正则表达式分组吗?

我希望结果会是这样。

<div class="clas"></div>
<div class="clas_temp">insert!</div>
<div class="clastemp"></div>
<div class="clas_test">insert!</div>
<div class="clas_tmp"></div>
<div class="clas_t">insert!</div>

【问题讨论】:

    标签: javascript jquery html regex


    【解决方案1】:

    您可以使用.filter( function ) 来过滤带有正则表达式的选定元素:

    $("div[class^='clas']").filter((idx, ele) => ele.classList.value.match(/(_test|_t|temp)$/) != undefined)
    

    或者您可以创建自己的选择器:

    // add the new selector
    ;(function($){
        $.extend($.expr[':'],{
            classByRegex: function(a, b, c) {
                var cv = a.classList.value;  // get current class list
                var sel = c.pop();  // get the regex
                return cv.match(new RegExp(sel)) != undefined;
            }
        });
    })(jQuery);
    
    
    //use it
    
    $( "div:classByRegex('^clas.*(_test|_t|temp)$')").text((idx, str) => str + ' insert!');
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    
    
    <div class="clas">clas</div>
    <div class="clas_temp">clas_temp</div>
    <div class="clastemp">clastemp</div>
    <div class="clas_test">clas_test</div>
    <div class="clas_tmp">clas_tmp</div>
    <div class="clas_t">clas_t</div>

    【讨论】:

    • 哇哦!令人印象深刻!您制作了一个自定义选择器...,这意味着没有内置用于使用 regex 选择 id 的 jquery ?
    • @Gagantous 是的,是
    【解决方案2】:

    要匹配所有这三个,选择器会很长:div[class^='clas'][class$='_temp'], div[class^='clas'][class$='_test'], div[class^='clas'][class$='_t']

    查看[attribute$=value] 选择器。

    var selector = "div[class^='clas'][class$='_temp'], div[class^='clas'][class$='_test'], div[class^='clas'][class$='_t']";
    
    var els = document.querySelectorAll(selector);
    
    console.log(els);
    <div class="clas"></div>
    <div class="clas_temp"></div>
    <div class="clastemp"></div>
    <div class="clas_test"></div>
    <div class="clas_tmp"></div>
    <div class="clas_t"></div>

    或者,您可以分两步完成..

    var selector = ", div[class^='clas'], div[class^='clas']";
    
    var $els = $("div[class^='clas']").filter("[class$='_temp'], [class$='_test'], [class$='_t']");
    
    $els.each(console.log);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <div class="clas"></div>
    <div class="clas_temp"></div>
    <div class="clastemp"></div>
    <div class="clas_test"></div>
    <div class="clas_tmp"></div>
    <div class="clas_t"></div>

    【讨论】:

    • 所以我需要选择所有三个可能的元素?
    • @Gagantous - 是的,我添加了另一个 jquery 特定的替代方案。但是使用类名本身可能更容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 2018-03-30
    相关资源
    最近更新 更多