我需要用字符串替换非重音字符串中的重音字符,然后我实现了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(它也会在那里激发相同的错误),所以你可以看看它。
答案 0 :(得分:3)
我不确定这是你的问题,因为你没有粘贴整个代码,但我确信如果你在数组的最后一个元素之后添加一个额外的逗号,IE7 / 8会抛出一个错误。
所以,如果你有这样的事情:
var defaultDiacriticsRemovalMap = [
{'base':'A'},
{'k1':'v1'},
...
{'k_last':'v_last'}, // this last comma will break your js in IE7/8
];
答案 1 :(得分:2)
几乎可以肯定,数组中有一个尾随逗号。 IE将其视为一个省略并添加一个长度,有效地添加了一个额外的(未定义的)成员。其他浏览器正确忽略它。无论如何,请将其删除。
只是为了展示IE如何处理逗号:
var a = [0,1,];
alert(a.length); // 3 in IE, 2 in others
alert(a.hasOwnProperty('2')); // false in all browsers
尾随逗号不是一个省略号,需要两个尾随逗号。
答案 2 :(得分:1)
在数组的右括号(] )之前有一个额外的逗号(,),IE7 / 8然后为此数组添加额外的undefined
值,所以当使用for
迭代循环时,IE7 / 8在索引84时会遇到值undefined
(尝试记录changes.length
并看到差异)