原生JS封装removeClass()方法遇到正则不能传参?

代码如下:

function removeClass(element, className) {
  element.className = element.className.replace(/(?:^|\s)className(?!\S)/g, '');
}

问题1:正则里面className直接解析成字符串了,而不是传入的参数。
问题2:如何修改成像jQuery一样用element.removeClass(className)调用?

谢谢~

有人能说一下问题2的思路吗?-.-!

阅读 2.7k
1 个回答

楼主这样是直接新建了一个匹配className这个字符串本身的正则表达式

如果要通过变量新建正则表达式应该这样

function removeClass(element, className) {
  element.className
     = element.className
         .replace(new RegExp("\(\?:^|\\s)"+className+"(?!\\S\)", 'g'),"");
}

这种方法会在某种情况下出现意料之外的结果,例如

<div class="a b c"></div>

removeClass(div,"a c") //fail or unexpected

替换className最好的轮子个人认为大概是这样(仍有不完善的地方)。

function removeClass(element, className) {
    let targetClassNames = className.split(" ");
    let classNames = element.className.split(" ");
    return element.className = classNames
        .filter(className=>targetClassNames.indexOf(className)<0).join(" ");
}

function addClass(element, className) {
    let targetClassNames = className.split(" ");
    let classNames = element.className.split(" ");
    targetClassNames.filter(className=>classNames.indexOf(className)<0);
    return element.className = classNames.concat(targetClassNames).join(" "));
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题