前一篇不知道怎么被博客園給刪了,重新補發一個。
最近在項目中發現一個很詭異的問題,通過js獲取cookie時,發現賦給用戶name的時候IE9和低於9以下的瀏覽器對比時獲取到的名字不一樣,通過調試發現是split方法在解析||時當值為空時就會出現被“吃掉”的問題。
當我們在開發的過程想要對特定的字符進行分割,首相想到的就是使用split函數,這樣是一個效率非常高的方法。但是讓人嘆息的是該方法雖然可以在Chrome和Firefox正常運作,但是在低版本IE瀏覽器卻無法正常工作,IE9及以上版本都沒有問題。split方法是支持正則表達式的,ES中還對它的獲取匹配和貪婪模式做了一些定義,低版本IE瀏覽器尚未兼容上。這些新概念不被兼容是無可厚非的,但是低版本IE甚至連split的基本功能都沒兼容好。split方法使用正則表達式時,返回的結果中就會吞掉所有空字符串。下面展示下相同的方法在不同版本IE瀏覽器下獲取到的值:
IE8獲取的結果:
IE9獲取的結果:

有沒有發現區別在哪里?IE8的行為很詭異吧?原本應為9個參數的,可是在IE8中卻成為了8個參數,原本為空的值在IE8中直接被飢渴的IE8給吞掉了。於是就研究了下解決方案,和大家分享一下。
1:如果我們需要同時使用多個字符切字符串又想兼容IE8可以先把需要用於切割的字符replace到同一個字符再執行split。(雖然效率不高)。
2:如果要用非消耗匹配的正則去分割字符串,而且還想兼容好IE8的話,那就只有另謀出路吧,別想split了。 這里再跟大家分享一種不需要改動原來的代碼,只需要在你的代碼中添加如下函數,即可解決split函數在IE瀏覽器下無法使用的問題:
//重寫split 用於解決IE7,IE8,IE9的split的兼容性(panda-2016-06-16)
var split;
split = split || function (undef) {
var nativeSplit = String.prototype.split,
compliantExecNpcg = /()??/.exec("")[1] === undef,
self;
self = function (str, separator, limit) {
if (Object.prototype.toString.call(separator) !== "[object RegExp]") {
return nativeSplit.call(str, separator, limit);
}
var output = [],
flags = (separator.ignoreCase ? "i" : "") +
(separator.multiline ? "m" : "") +
(separator.extended ? "x" : "") + // Proposed for ES6
(separator.sticky ? "y" : ""), // Firefox 3+
lastLastIndex = 0,
separator = new RegExp(separator.source, flags + "g"),
separator2, match, lastIndex, lastLength;
str += "";
if (!compliantExecNpcg) {
separator2 = new RegExp("^" + separator.source + "$(?!\\s)", flags);
}
limit = limit === undef ?
-1 >>> 0 : // Math.pow(2, 32) - 1
limit >>> 0; // ToUint32(limit)
while (match = separator.exec(str)) {
lastIndex = match.index + match[0].length;
if (lastIndex > lastLastIndex) {
output.push(str.slice(lastLastIndex, match.index));
if (!compliantExecNpcg && match.length > 1) {
match[0].replace(separator2, function () {
for (var i = 1; i < arguments.length - 2; i++) {
if (arguments[i] === undef) {
match[i] = undef;
}
}
});
}
if (match.length > 1 && match.index < str.length) {
Array.prototype.push.apply(output, match.slice(1));
}
lastLength = match[0].length;
lastLastIndex = lastIndex;
if (output.length >= limit) {
break;
}
}
if (separator.lastIndex === match.index) {
separator.lastIndex++;
}
}
if (lastLastIndex === str.length) {
if (lastLength || !separator.test("")) {
output.push("");
}
} else {
output.push(str.slice(lastLastIndex));
}
return output.length > limit ? output.slice(0, limit) : output;
};
String.prototype.split = function (separator, limit) {
return self(this, separator, limit);
};
return self;
}();
希望能對大家有所幫助!
您的觀看將是我最大的動力,您還可觀看我其他的博客,寫的不好請諒解。謝謝您給予的支持。 博客地址:http://www.cnblogs.com/zhangzhixiong/

