Internet Explorer (7/8) не может перебрать массив JavaScript - PullRequest
0 голосов
/ 22 марта 2012

Мне нужно заменить акцентированные символы в строке их безакцентированными аналогами, и я реализовал это http://lehelk.com/2011/05/06/script-to-remove-diacritics/.

var defaultDiacriticsRemovalMap = [
            {'base':'A', 'letters':/[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g},   
            /* ... 
            so on and so forth
            .... */
        ];

        var changes;
        function removeDiacritics (str) {
            if(!changes) {
                changes = defaultDiacriticsRemovalMap;
            }
            for(var i=0; i<changes.length; i++) {
                str = str.replace(changes[i].letters, changes[i].base);
            }
            return str.replace(/\s+/g, '_'); //space to dash
        }

Это не работает в IE 7 и 8 (работает в любом другом браузере) с ошибкой 'changes[...].letters' is null or not an object на линии str = str.replace(changes[i].letters, changes[i].base);, и я понятия не имею, почему.Я имею в виду, я понимаю, что браузер думает, что он встретил нулевое значение, но я не вижу, как это может быть.

Я скопировал свой код в jsfiddle (он выдает ту же ошибку, что ихорошо) так что вы можете взглянуть на это.

http://jsfiddle.net/GggcU/

Ответы [ 3 ]

3 голосов
/ 22 марта 2012

Я не уверен, что это ваша проблема, поскольку вы не вставили весь свой код, но я точно знаю, что IE7 / 8 выдает ошибку, если вы добавите дополнительную запятую после последнего элемента массива.

Итак, если у вас есть что-то вроде этого:

var defaultDiacriticsRemovalMap = [
 {'base':'A'},   
 {'k1':'v1'},
 ...
 {'k_last':'v_last'}, // this last comma will break your js in IE7/8
];
2 голосов
/ 22 марта 2012

Почти наверняка у вас есть запятая в массиве.IE рассматривает это как исключение и добавляет один к длине, эффективно добавляя дополнительный (неопределенный) член.Другие браузеры правильно игнорируют это.В любом случае удалите его.

Просто для того, чтобы показать, как IE обрабатывает запятую:

var a = [0,1,];

alert(a.length); // 3 in IE, 2 in others

alert(a.hasOwnProperty('2')); // false in all browsers

Конечная запятая не является пропуском, для этого требуются две запятые.*

1 голос
/ 22 марта 2012

У вас есть дополнительная запятая (, ) перед закрывающей скобкой вашего массива (] ), IE7 / 8 затем добавляет дополнительное значение undefined к этому массиву, поэтому при цикле при использовании итерации for IE7 / 8 встретит значение undefined с индексом 84 (попытайтесь зарегистрировать changes.length и посмотрите разницу)

...