JS String.replace может быть временным с Safari - PullRequest
1 голос
/ 07 октября 2010

Предыстория:

Это прекрасно работает во всех браузерах, КРОМЕ 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 BIT более счастливым, когда он просто выдавал неоднозначную ошибку (FUN!)

Я нашел решение и выкладываю его ниже на случай, если другие коллеги-сценаристы столкнутся с этой проблемой.

Ответы [ 2 ]

2 голосов
/ 07 октября 2010

Я не смог воспроизвести проблему, потому что я не уверен, каково значение 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 голосов
/ 07 октября 2010

Итак, я поместил попытку / поймать вокруг проблемной области (естественно), чтобы попытаться получить какой-то отзыв об ошибке.Забавно, я не получаю ошибки, и проблема исчезает.Странно.

Решение:

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) {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...