:contains for multiple words

后端 未结 4 1272
小蘑菇
小蘑菇 2021-01-13 19:49

I am using the following jQuery

var etag = \'kate\'
if (etag.length > 0) {
    $(\'div\').each(function () {
        $(this).find(\'ul:not(:contains(\' +         


        
相关标签:
4条回答
  • 2021-01-13 20:12

    You could turn this into a function that takes any number of words separated by a character, like this:

    function filter(words) {
        var uls = $('div ul').hide();
        $.each(words.split(' '), function(i, v) {
            uls = uls.filter(':contains(' + v + ')');
        });
        uls.show();
    }
    
    //sample call
    var etag='kate clair'
    filter(etag);
    

    You can see a working demo here

    This finds <ul> elements that contain all the words in the given string.

    0 讨论(0)
  • 2021-01-13 20:14

    Another approach:

    var etag='Some text from server';
    
    if (etag.length > 0) {
        $('div ul').each(function () {
            var el = $(this); // Local reference
            (el.html() === etag) ? el.show() : el.hide(); 
        });
    }​
    
    0 讨论(0)
  • 2021-01-13 20:25

    This filter checks if any of the words in the given string match the text of the element.

    jQuery.expr[':'].containsAny = function(element, index, match) {
        var words = match[3].split(/\s+/);
        var text = $(element).text();
        var results = $.map(words, function(word) {
            return text === word;
        });
        return $.inArray(true, results) !== -1;
    };
    

    Show and hide as:

    $('ul').hide();
    $('li:containsAny(john kate)').parents('ul').show();
    

    See an example here.

    0 讨论(0)
  • 2021-01-13 20:29

    A slightly different approach - try this:

        var etag='kate test blah';
    
        var tags = etag.split(' ');
        $('div ul').each(function () {
          var list = $(this);
          list.hide();
          list.children('li').each(function() {
            var item = $(this);
            if ($.inArray(item.html(), tags) >= 0) list.show();
          });
        });
    

    Written in the browser, so sorry if there are any bugs!

    -- edit --

    Actually, I reread the question, and that code won't work. You need to define the behaviour more first - does the list have to contain all of the tags, or just one of the tags to be shown?

    -- edit 2 --

    Code updated. Kind of inefficient, but it should do the job.

    0 讨论(0)
提交回复
热议问题