2010-10-07 32 views
1

背景故事被tempremental:JS可以與string.replace使用Safari

這工作正常,在所有瀏覽器Safari瀏覽器除外(5.0.1)

var chunk = arr[i]; 
chunk = chunk.replace('$', '\\$'); 
var a = eval('message.match(/' + chunk + '/gi);'); 
if(a instanceof Array) symbol = symbol.concat(a); 

所以我把它修改爲以下幾點:

var chunk = String(arr[i]); 
chunk = chunk.replace('$', '\\$'); 
var a = eval('message.match(/' + chunk + '/gi);'); 
if(a instanceof Array) symbol = symbol.concat(a); 

這讓Safari瀏覽器多一點快樂到它只是拋出一個明確的錯誤(FUN!)

我找到了解決方案,我在下面發佈它,以防其他同事腳本編寫者遇到此問題。

回答

2

,因爲我不知道是什麼的chunk值我無法重現該問題。

無論如何,這是eval不必要使用的一個例子,你可以使用RegExp構造函數從字符串建立RegExp對象,例如:

var re = /foo/gi; 

相當於創建一個對象運行時與RegExp構造:

var re = new RegExp('foo', 'gi'); 

把它應用到你的代碼:

var chunk = String(arr[i]); // use String() only if you are not sure if arr[i] is 

// Be aware that the following line is replacing only the first $ 
// char and you may want to scape other meta-characters: 
chunk = chunk.replace('$', '\\$'); 
var a = message.match(new RegExp(chunk,'gi')); 

if(a instanceof Array) symbol = symbol.concat(a); 
+0

+1這讓我覺得很奇怪,但我太懶惰,無法跟他一起鑽進去。 – Robusto 2010-10-07 00:20:53

0

所以 - 我試着圍繞問題區域(自然地)嘗試並獲得對錯誤的某種反饋。有趣的是,我沒有錯誤,問題消失了。奇怪的。

解決方案:

try { 
    var chunk = String(arr[i]); 
    chunk = chunk.replace('$', '\\$'); 
    var a = eval('message.match(/' + chunk + '/gi);'); 
    if(a instanceof Array) symbol = symbol.concat(a); 
} catch(e) {}