【发布时间】:2020-07-16 22:24:52
【问题描述】:
我有一堆类名,例如 md:block 和 sm:flex
我需要:
- 查找所有以“md”或“sm”开头的类。
- 在每个“md”和“sm”之后附加“-panel”。
- 以
md-panel:block和sm-panel:flex结尾。
在 cmets 中的第一次尝试:https://stackoverflow.com/a/61035473/4019931
第二次尝试:
/*
Add / remove prefixes to DOM element classes. Requieres JQuery.
https://gist.github.com/carloscabo/e0374676c614dd6e6ea19ad4b9ecf9a4
by Carlos Cabo 2016. MIT License.
How it works:
1. Loops over the group of elements
2. For each element if it has any class that matches the regex:
a. If the prefix is NOT present -> adds
b. If the prefix IS present -> removes
$jquery_selector, conatining group of elements where replacement will be done
regex, refired to the classname, all classes matching this selector in the group of elements will be un/prefixed
prefix, string that will be added / removed from matching classes
add, true = add prefix ( default value)
flase = remove prefix
Adding 'pre-' to all classnames matched in regex:
addRemoveClassPrefix(
$('#imgs-slider, #imgs-slider [class^=swiper]'), // JQuery selector: Group of elements where to be executed
/^swiper/, // RegEx: All classNames starting with 'swiper'
'pre-' // Add this prefix
);
Removing 'pre-' to all classnames matched in regex:
addRemoveClassPrefix(
$('[class^=pre-swiper]'), // JQuery selector: Group of elements where to be executed
/^pre-swiper/, // RegEx: All classNames starting with 'swiper'
'pre-' // Add this prefix
);
*/
function addRemoveClassPrefix( $jquery_selector, regex, prefix ) {
if ($jquery_selector.length) {
$jquery_selector.each( function(idx, el) {
var
$el = $(el),
classes = $el.attr('class').split(' '),
new_class;
for (var i = 0; i < classes.length; i++) {
if (regex.test( classes[i] )) {
new_class = ( classes[i].indexOf( prefix ) === 0 ) ? classes[i].replace( prefix, '') : prefix+classes[i] ;
$el.addClass( new_class ).removeClass( classes[i] );
}
}
});
}
}
我发现这个 (https://gist.github.com/carloscabo/e0374676c614dd6e6ea19ad4b9ecf9a4) 几乎可以满足我的要求。但我有 3 个问题我想不通。
- 如何将正则表达式设置为 /*md/ 而不会变成代码中的注释。
- 如何在正则表达式中设置多个内容。 /*sm/*md/ ?
-
如何更改它,使其在类名中间拆分并添加第一部分+前缀+最后一部分。我试过这个:
new_class = ( classes[i].indexOf( prefix ) === 0 ) ? classes[i].split('-panel:').join(':') : classes[i].split(':').join('-panel:');
我需要它将所有 'md:value' 转换为 'md-panel:value',反之亦然。任何帮助将不胜感激。
【问题讨论】:
-
嗯,我可以看到您的代码没有明显错误。您是否尝试过检查 jquery 对象/长度,或者将其简化为使用静态 html 的简单示例?
-
做了一个小的codepen,你的代码看起来还不错。也许
md:元素是通过 js 生成的,并且在运行时它们还没有添加到 DOM 中? -
谢谢@ne1410s + ifthenelse。我意识到它正在寻找以“sm:”或“md:”开头的类值。但我没有意识到这对整个类的含义。因此,当我在“md:block”类之前有另一个类值时,它没有拾取它。通过将 [class^=”value”] 更改为 [class*=”value”] 来修复它并且它起作用了!
标签: javascript jquery arrays regex classname