2017-07-19 69 views
0

我有一个旧脚本,用于通过向body标签添加类名来更改网站的字体大小,其部分功能是在将其更改为其中一个之前移除现有类设置。问题是存在一个eval行,它会从body标签上的其他类中删除“large”,“medium”或“small”等任何实例,这些实例充当页面的唯一标识符,这会干扰其他脚本使用。如何在下面的代码中更改eval行,以便它只匹配整个单词?JavaScript eval()语法

/* Override CSS with global font size selected by user */ 
 
function changeFontSize(size) { 
 
var oldClasses, currentClass; 
 

 
/*sets key words to be eliminated*/ 
 
oldClasses = eval("/large|medium|small/ig"); 
 

 
/*gets the current class names*/ 
 
currentClass = document.body.className; 
 

 
/*eliminates key words from string, then adds new size*/ 
 
document.body.className = currentClass.replace(oldClasses, "") + " " + size; 
 
}

+1

...为什么会出现在这里'在eval'第一名?!? 'oldClasses =/large | medium | small/ig'是相同的,除非不是邪恶。如果你需要自定义字符串,'oldClasses = new RegExp(['large','medium','small']。join('|'),'ig')'。 (这里没有回答这个问题,只是表示怀疑。) – Amadan

+0

_“我怎样才能改变下面的行,以便它只搜索整个单词?”_问题不清楚。 “搜索”在哪里发生? – guest271314

+0

我对eval不太了解,所以我不能告诉你为什么这是必要的。我从上下文中假定它的目的是列出脚本在分配给body标签的类中查找的术语。 – Tom

回答

3

没有很好的理由在这里使用的eval(...)操作。就像这里提到的很多,eval是不好的做法。

了解更多关于在这里:​​ what does eval do and why its evil?

eval("/large|medium|small/ig")相同var pattern = /large|medium|small/ig/。前者将在评估string以推导出它作为正则表达式文字之前的含义。鉴于后者是一个直接的声明,本质上它更有效,因为您正在跳过评估步骤。

由于字体模式是静态的(不会更改),所以最好将其声明为正则表达式对象并继续使用它。

例子:

var FONT_SIZE_NAMES_PATTERN = new RegExp(/\b(large|medium|small)\b/ig); 
 

 
function changeFontSize(size) { 
 
    var oldClasses, currentClass; 
 

 
    /*gets the current class names*/ 
 
    currentClass = "large"; 
 

 
    /*eliminates key words from string, then adds new size*/ 
 
    // document.body.className = currentClass.replace(FONT_SIZE_NAMES_PATTERN, "") + " " + size; 
 
    console.log("New class name = " + currentClass.replace(FONT_SIZE_NAMES_PATTERN, "") + " " + size); 
 
} 
 

 
changeFontSize("VERY LARGE");

+0

我不得不调整一下,但是工作得很好。谢谢! – Tom