javascript - 使用 JavaScript 移除类

标签 javascript css regex

我正在尝试使用 JavaScript 添加/删除类。 (请不要发布有关 JQuery 的信息,因为那无关紧要。)我遇到了 this answer ,建议使用正则表达式删除类。这是代码:

function removeClass(ele, cls) {
    if (hasClass(ele, cls)) {
        var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
        ele.className = ele.className.replace(reg, ' ');
    }
}

我将添加和删除同一个类。问题是,我这样做了多少次,就是在类名中添加了多少个空格。例如,如果我添加和删除类 5 次,则 2 个类名之间将有 5 个空格。

如何防止空格出现?

CodePen

代码片段

var myDiv = document.getElementById('myDiv'),
  par = document.getElementById('par');

myDiv.addEventListener('click', function() {
  if (hasClass(myDiv, 'tryThis')) {
    removeClass(myDiv, 'tryThis');
  } else {
    addClass(myDiv, 'tryThis');
  }
  console.log(myDiv.className);
});



function hasClass(ele, cls) {
  return ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
}

function addClass(ele, cls) {
  if (!hasClass(ele, cls)) ele.className += " " + cls;
}

function removeClass(ele, cls) {
  if (hasClass(ele, cls)) {
    var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
    ele.className = ele.className.replace(reg, ' ');
  }
}
#myDiv {
  width: 100px;
  height: 100px;
  background-color: green;
}
.tryThis {
  border: 2px solid orange;
}
<div id="myDiv" class="hello">Click Me</div>
<p id="par"></p>

最佳答案

有两个解决方案。第一个(也是最简单的)是使用 classList .该解决方案的唯一缺点是您将无法继续支持比其实现更早的浏览器。

至于第二个解决方案,它保持对旧浏览器的支持并扩展您的正则表达式解决方案,我建议将一个函数传递给 replace检查类名的两边是否都是空格。如果是,则返回 ' ',否则返回 ''

function removeClass(ele, cls) {
  if (hasClass(ele, cls)) {
    var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
    ele.className = ele.className.replace(reg, function(match) {
      if (match.match(/^\s.+\s$/) !== null) {
        return ' ';
      } else {
        return '';
      }
    });
  }
}

编辑:还有使用 shim、sham、shiv、polyfill 等的选项。

关于javascript - 使用 JavaScript 移除类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34983810/

相关文章:

css - 重置字体大小 :0 doesn't work with 'em' unit

python - 正则表达式捕获Python中字符串和\n字符之间的数据

python - 在 python 中用空格重新拆分

javascript - 使用 Javascript 从 excel 电子表格复制并粘贴到带有克隆行的 HTML 表格中?

javascript - .map、.every 和 .forEach 之间有什么区别?

javascript - 如何使 Chrome 扩展程序的未捕获异常处理程序工作(由于 CORS 保护而不起作用)

html - 在单选按钮文本附近没有对齐。它有点提升

jquery - 定位 jquery 选项卡和框的问题

regex - Clojure 中的转义括号

javascript - jQuery 仅从循环中获取第一个 id 值