2017-07-19 67 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