Trouvez tous les éléments basés sur les identifiants en utilisant regex sur le sélecteur jQuery

J’ai plusieurs éléments avec des identifiants uniques comme ceci:

J’espérais que ce qui suit fonctionnerait avec jQuery:

 $("#item-[.]+-top").each(function() { $(this).hide(); }); 

Je n’ai pas une bonne compréhension des expressions régulières et j’apprécierais quelques informations, car ce qui précède semble être incorrect.

Si vous faisiez cela avec regex, l’expression serait simplement:

 item-\d-top 

Où le \d indique n’importe quel chiffre (0..9) et où les autres caractères n’ont aucune signification particulière (ils sont donc traités comme des littéraux).

Cependant, jQuery n’a actuellement pas de filtre regex (seulement les choses telles que début / fin / contient / etc) – vous devrez donc en créer un (ce qui est possible, mais si vous envisagiez cela, vous devriez vous arrêter et envisager / pourquoi vous filtrez et déterminez s’il existe une meilleure solution en premier).

Il serait beaucoup plus simple de créer une classe (comme le suggère serg555 ) , car c’est exactement comme cela que vous traitez ces éléments.

Ou (si vous ne pouvez pas modifier le balisage pour append la classe) puis utilisez les filtres existants, en développant la réponse de gddc , je pourrais le faire:

 $('div[id^=item-][id$=-top]').hide() 

(Étant donné que vous pouvez avoir plusieurs éléments se terminant par ‘top’, maintenant ou à l’avenir, vous devez être plus précis pour éviter de cacher par inadvertance d’autres choses.)

Si l’identifiant ressemblait à quelque chose comme news-top-1 , news-top-2 , news-top-3 , news-top-4 etc., les sélecteurs vous auraient aidé.

http://api.jquery.com/atsortingbute-starts-with-selector/

 $.each( $("input[name^='news-top-']"), function () { alert( $(this).hide() ); }); 

Je leur assignerais une classe comme item puis ferais une recherche par cette classe $(".item") .

James Padolsey a créé un filtre merveilleux qui permet d’utiliser regex pour la sélection.

 jQuery.expr[':'].regex = function(elem, index, match) { var matchParams = match[3].split(','), validLabels = /^(data|css):/, attr = { method: matchParams[0].match(validLabels) ? matchParams[0].split(':')[0] : 'attr', property: matchParams.shift().replace(validLabels,'') }, regexFlags = 'ig', regex = new RegExp(matchParams.join('').replace(/^s+|s+$/g,''), regexFlags); return regex.test(jQuery(elem)[attr.method](attr.property)); } 

Maintenant vous pouvez utiliser

 $('div:regex(id,item-[0-9]-top)').hide() 

Frappez un problème similaire et appréciez la réponse de serg de créer une classe à la place, mais parce que je faisais plusieurs opérations sur de tels éléments, les collections avec clés étaient plus appropriées.