【问题标题】:How to remove a class that starts with...?如何删除以...开头的类?
【发布时间】:2015-02-19 14:13:43
【问题描述】:

HTML

<div class="ativo37 and many other classes"></div>
<div class="another classes here with ativo1"></div>
<div class="here ativo9 and more two or three"></div>

JS

$("div[class^='ativo']").on("click", function(){
    $(this).removeClass("^='ativo'"); // How to achieve it?
});

除了.removeClass("^='ativo'");,我还能做什么?

JSFiddle

【问题讨论】:

标签: javascript jquery


【解决方案1】:

.removeClass() 接受一个删除类的函数并接受索引和旧的 CSS 值:

返回一个或多个以空格分隔的要删除的类名的函数。接收集合中元素的索引位置和旧类值作为参数。

您可以删除以所需名称开头的类名并保留现有的使用:

$("div[class*='ativo']").removeClass (function (index, css) {
   return (css.match (/(^|\s)ativo\S+/g) || []).join(' ');
});

Working Demo

【讨论】:

【解决方案2】:

没有jQuery,你可以使用classListstartsWith

var el = document.querySelector('div[class*="ativo"]');
for (let i = el.classList.length - 1; i >= 0; i--) {
    const className = el.classList[i];
    if (className.startsWith('ativo')) {
        el.classList.remove(className);
    }
}

【讨论】:

  • 2019年最佳答案
  • 请注意,此答案会在迭代时从数组中删除元素,因此如果它们恰好在元素的 classList 中是连续的,它将无法删除两个匹配类中的后者。
  • @Altay_H 好收获!更新了答案。
【解决方案3】:
function removeClassByPrefix(el, prefix) {
    var regx = new RegExp('\\b' + prefix + '.*?\\b', 'g');
    el.className = el.className.replace(regx, '');
    return el;
}

您可以使用这个纯Javascript解决方案。

【讨论】:

  • 如果我尝试在包含连字符的类中使用它时遇到问题,例如:class-name 使用“类”作为前缀,我仍然以“名称”结尾.有什么方法可以改变正则表达式来解决这个问题?
  • @AhmedWagdi 将表达式更改为:new RegExp('\\b' + prefix + '(.*)?\\b', 'g');
【解决方案4】:

@str 和 @Djurdjen 的答案都有问题。如果您删除 forEach()-loop 中的类,您将删除当前正在循环的元素。例如,在 Edge 中,这可能会导致 classNamebeeing null

更好的解决方案是向后循环classList-元素:

function removeClassesByPrefix(el, prefix)
{
    for(var i = el.classList.length - 1; i >= 0; i--) {
        if(el.classList[i].startsWith(prefix)) {
            el.classList.remove(el.classList[i]);
        }
    }
}

【讨论】:

    【解决方案5】:

    我在上面的解决方案中遇到了问题,它有时只从类名中删除了匹配的前缀,而不是整个类。所以我把它改成了这个

    function removeClassByPrefix(el, prefix) {
        var regx = new RegExp('\\b' + prefix + '.*?\\b', 'g');
        [...el.classList].forEach(className => {
            regx.test(className) && item.classList.remove(className);
        });
    }
    

    【讨论】:

      【解决方案6】:

      我会这样做:

      function removeClassStartsWith (node, className) {
         [...node.classList].forEach(v => {
            if (v.startsWith(className)) {
               node.classList.remove(v)
            }
         })
      }
      

      用法:

      // Example node: <div class="id-1"></div>
      
      const el = document.querySelectorAll('div')[0]
      removeClassStartsWith(el, 'id-')
      

      【讨论】:

        【解决方案7】:
        function removeClassByPrefix(el, prefix) {
            let newClassList = []
         
            el.classList.forEach(className => {
                if (className.indexOf(prefix) !== 0 ) {
                    newClassList.push(className)
                }
            })
            
            el.className = newClassList.join(' ')
        }
        

        【讨论】:

        • 如果你对你的代码写一些简短的解释就好了。代码做什么以及如何管理任务?
        • 简而言之 - 它以干净的方式排除所有以前缀开头的类,而不是通过正则表达式逐行切割: 1. 定义一个方法; 2.创建本地数组; 4. 循环遍历来自名为“el”的参数的DOM元素的类列表(浏览器原生类列表); 5. 检查循环中的类名是否不以来自名为“prefix”的参数的前缀开头; 6. 将一个有效的类名附加到 newClassList; 10. 将类列表数组连接成空格分隔的字符串,并将其设置为提到的DOM元素;
        【解决方案8】:

        这种方法允许在没有 jquery-prerequisite 的情况下通过任何字符串过滤器删除 css 类。

        node.classList.remove(
            ...Array.from(node.classList.entries())
               .map(([,c]) => c)
               .filter(c => c.startsWith('prefix')));

        它的作用是,使用 entries() 迭代器从类列表条目中创建一个数组。这些格式为 [index, classname]。现在我可以轻松地将它们首先映射到类名,然后使用所有类型的数组函数(如本例中的过滤器)来找到正确的类集。

        【讨论】:

        • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
        【解决方案9】:

        我编写了这个函数来使用'startsWith()'从HTMLElement中删除给定的类名

        export function removeClassStartingWith(currentEl, currentClassName){
          currentEl.classList.forEach((curr, index) => {
            if(curr.startsWith(currentClassName)){
              const currentClass = currentEl.classList[index];
              currentEl.classList.remove(currentClass);
              return true;
            }else{
              return false;
            }
          });
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-10-31
          • 2017-10-04
          • 1970-01-01
          • 2019-10-16
          • 2015-12-04
          • 2014-05-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多