2010-10-07 100 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) {}