作者Blog:www.coolcode.cn
IE 5.5 中的 JScript 版本是 5.5 版,它比以前版本的 JScript 中多了如數組的 push、pop、shift、unshift 方法和 encodeURI、decodeURI 等一些重要的函數。而這些增加的內容在目前其他瀏覽器(如 Moziila/Firefox 和 Opera)上也同樣支援。因此目前開發網站一般對於 IE 瀏覽器只能相容到 5.5 版,而對於更低版本的 IE(如 IE 5、IE 4 等),則不再去考慮了。雖然這些低版本的 IE 瀏覽器目前已經不是主流,但如果能夠不需要修改現有代碼就能夠相容它們的話,倒是也可以考慮。因此我做了這個相容低版本 IE 的 JScript 5.5 實現。當然它不可能完全相容 JScript 5.5,但對於最常用的一些方法,都已經實現了。
該庫使用非常簡單,只需要在網頁的 head 部分加入:
<script type="text/javascript" src="iecompat.js"></script>
就可以了。
完全實現的:
Array 對象中:
·push 方法
·pop 方法
·shift 方法
·unshift 方法
·splice 方法
Date 對象中:
·toDateString 方法
·toTimeString 方法
·toLocaleDateString 方法
·toLocaleTimeString 方法
·Function 對象中:
·apply 方法
·call 方法
Global 對象中:
·undefined 屬性
·encodeURI 方法
·encodeURIComponent 方法
·decodeURI 方法
·decodeURIComponent 方法
Number 對象中:
·toExponential 方法
·toFixed 方法
·toPrecision 方法
對於錯誤處理,IE 5(JScript 5)中已經有了 try…catch 和 throw 語句,因此 decodeURI、decodeURIComponent、toExponential、toFixed、toPrecision、apply 如果出現運行期錯誤,在 IE 5 上會拋出跟 IE 5.5+ 中一樣的錯誤資訊,但是因為 IE 4 沒有錯誤處理語句,如果上述函數出現運行期錯誤,將會返回 null。注意上面說的運行期錯誤,不是指上述函數實現中的錯誤,而是指在這些函數正常工作的情況下應該出現的錯誤。
其中 Function 的 apply 函數的實現參考了:
http://www.openjsan.org/doc/a/ad/adamk/Upgrade/0.04/lib/Upgrade/Function/apply.html
這段程式。
不完全實現的:
Error 對象
Object 對象中:
·isPrototypeOf 方法
·hasOwnProperty 方法
·propertyIsEnumerable 方法
String 對象中:
·toLocaleLowerCase 方法
·toLocaleUpperCase 方法
·localeCompare 方法
因為 IE 4 不具備錯誤處理語句,因此 Error 對象在 IE 4 上並不具備 IE 5 以上 Error 對象應具有的功能,因此它對於 IE 4 的實現只能保證你在訪問或建立它時不會出錯。
Object 中的 isPrototypeOf、hasOwnProperty 和 propertyIsEnumerable 方法只是做了類比實現,其傳回值並非總是正確。
String 對象中的 toLocaleLowerCase、toLocaleUpperCase 和 localeCompare 方法實際上並沒有考慮本地字元集,但在大部分系統上它還是工作正常的。
完全沒有實現的:
Regex對象中擴充的屬性和限定符
下載: iecompat.js
<br />/* iecompat.js<br />*<br />* Copyright Ma Bingyao <br />* Version: 1.3<br />* LastModified: 2006-06-18<br />* This library is free. You can redistribute it and/or modify it.<br />* http://www.coolcode.cn/?p=126<br />*/ </p><p>/*@cc_on @*/ </p><p>/*@if (@_jscript_version str) return 1;<br /> if (this 20) {<br /> @if (@_jscript_version n) {<br /> s = Math.round(parseFloat("." + s) * Math.pow(10, n + 1)).toString();<br /> if ((s.length - 1) > n) {<br /> e += 1;<br /> s = Math.round(parseFloat("." + s) * Math.pow(10, n + 1)).toString();<br /> }<br /> }<br /> if (e >= 0) {<br /> e = "+" + e;<br /> }<br /> if (n == 0) {<br /> return s + "e" + e;<br /> }<br /> else {<br /> return s.substr(0, 1) + "." + s.substr(1) + "e" + e;<br /> }<br />} </p><p>Number.prototype.toFixed = function (n) {<br /> function repeat(s, n) {<br /> var out = "";<br /> for (var i = 0; i 20) {<br /> @if (@_jscript_version = 0) {<br /> s += repeat("0", e);<br /> if (n > 0) {<br /> s += "." + repeat("0", n);<br /> }<br /> }<br /> else if (-e 0) {<br /> s = repeat("0", n - s.length + 1) + s;<br /> s = s.substr(0, s.length - n) + "." + s.substr(s.length - n);<br /> }<br /> }<br /> return s;<br />} </p><p>Number.prototype.toPrecision = function (n) {<br /> function repeat(s, n) {<br /> var out = "";<br /> for (var i = 0; i 21) {<br /> @if (@_jscript_version parseInt(d).toString().length) {<br /> e++;<br /> s = s.slice(0, -1);<br /> }<br /> e += len - s.length;<br /> len = s.length;<br /> e += len - 1; </p><p> if (e -7) {<br /> if ((e 0)) {<br /> s = s.substr(0, e + 1) + "." + s.substr(e + 1);<br /> }<br /> else if (e = 0) {<br /> e = "+" + e;<br /> }<br /> if (n == 1) {<br /> s += "e" + e;<br /> }<br /> else {<br /> s = s.substr(0, 1) + "." + s.substr(1) + "e" + e;<br /> }<br /> }<br /> return s;<br />} </p><p>var undefined; </p><p>function encodeURI(str) {<br /> var l = ['%00', '%01', '%02', '%03', '%04', '%05', '%06',<br /> '%07', '%08', '%09', '%0A', '%0B', '%0C', '%0D',<br /> '%0E', '%0F', '%10', '%11', '%12', '%13', '%14',<br /> '%15', '%16', '%17', '%18', '%19', '%1A', '%1B',<br /> '%1C', '%1D', '%1E', '%1F', '%20', '!', '%22',<br /> '#', '$', '%25', '&', "'", '(', ')', '*', '+', ',',<br /> '-', '.', '/', '0', '1', '2', '3', '4', '5', '6',<br /> '7', '8', '9', ':', ';', '%3C', '=', '%3E', '?',<br /> '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',<br /> 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',<br /> 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '%5B', '%5C',<br /> '%5D', '%5E', '_', '%60', 'a', 'b', 'c', 'd', 'e',<br /> 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',<br /> 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',<br /> 'z', '%7B', '%7C', '%7D', '~', '%7F'];<br /> var out, i, j, len, c, c2; </p><p> out = [];<br /> len = str.length;<br /> for (i = 0, j = 0; i > 6) & 0x1F)).toString(16).toUpperCase();<br /> out[j++] = '%' + (0x80 | ( c & 0x3F)).toString(16).toUpperCase();<br /> continue;<br /> }<br /> else if (c 0xDFFF) {<br /> out[j++] = '%' + (0xE0 | ((c >> 12) & 0x0F)).toString(16).toUpperCase();<br /> out[j++] = '%' + (0x80 | ((c >> 6) & 0x3F)).toString(16).toUpperCase();<br /> out[j++] = '%' + (0x80 | (c & 0x3F)).toString(16).toUpperCase();<br /> continue;<br /> }<br /> else {<br /> if (++i >> 18) & 0x3F)).toString(16).toUpperCase();<br /> out[j++] = '%' + (0x80 | ((c >>> 12) & 0x3F)).toString(16).toUpperCase();<br /> out[j++] = '%' + (0x80 | ((c >>> 6) & 0x3F)).toString(16).toUpperCase();<br /> out[j++] = '%' + (0x80 | (c & 0x3F)).toString(16).toUpperCase();<br /> continue;<br /> }<br /> }<br /> }<br /> }<br /> @if (@_jscript_version > 6) & 0x1F)).toString(16).toUpperCase();<br /> out[j++] = '%' + (0x80 | ( c & 0x3F)).toString(16).toUpperCase();<br /> continue;<br /> }<br /> else if (c 0xDFFF) {<br /> out[j++] = '%' + (0xE0 | ((c >> 12) & 0x0F)).toString(16).toUpperCase();<br /> out[j++] = '%' + (0x80 | ((c >> 6) & 0x3F)).toString(16).toUpperCase();<br /> out[j++] = '%' + (0x80 | (c & 0x3F)).toString(16).toUpperCase();<br /> continue;<br /> }<br /> else {<br /> if (++i >> 18) & 0x3F)).toString(16).toUpperCase();<br /> out[j++] = '%' + (0x80 | ((c >>> 12) & 0x3F)).toString(16).toUpperCase();<br /> out[j++] = '%' + (0x80 | ((c >>> 6) & 0x3F)).toString(16).toUpperCase();<br /> out[j++] = '%' + (0x80 | (c & 0x3F)).toString(16).toUpperCase();<br /> continue;<br /> }<br /> }<br /> }<br /> }<br /> @if (@_jscript_version > 6) != 2) {<br /> return throwerror();<br /> }<br /> }<br /> var out, i, j, len;<br /> var c, c2, c3, c4, s; </p><p> out = [];<br /> len = str.length;<br /> i = j = 0;<br /> while(i > 4) {<br /> case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: {<br /> // 0xxxxxxx<br /> out[j++] = String.fromCharCode(c);<br /> break;<br /> }<br /> case 12: case 13: {<br /> // 110x xxxx 10xx xxxx<br /> if ((c2 = checkutf8()) == null) return null;<br /> out[j++] = String.fromCharCode(((c & 0x1F) >> 10) & 0x03ff) | 0xd800,<br /> (s & 0x03ff) | 0xdc00);<br /> }<br /> else {<br /> return throwerror();<br /> }<br /> break;<br /> }<br /> default: {<br /> return throwerror();<br /> }<br /> }<br /> }<br /> }<br /> }<br /> }<br /> }<br /> return out.join('');<br />} </p><p>function decodeURIComponent(str) {<br /> function throwerror() {<br /> @if (@_jscript_version > 6) != 2) {<br /> return throwerror();<br /> }<br /> }<br /> var out, i, j, len;<br /> var c, c2, c3, c4, s; </p><p> out = [];<br /> len = str.length;<br /> i = j = 0;<br /> while(i > 4) {<br /> case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: {<br /> // 0xxxxxxx<br /> out[j++] = String.fromCharCode(c);<br /> break;<br /> }<br /> case 12: case 13: {<br /> // 110x xxxx 10xx xxxx<br /> if ((c2 = checkutf8()) == null) return null;<br /> out[j++] = String.fromCharCode(((c & 0x1F) >> 10) & 0x03ff) | 0xd800,<br /> (s & 0x03ff) | 0xdc00);<br /> }<br /> else {<br /> return throwerror();<br /> }<br /> break;<br /> }<br /> default: {<br /> return throwerror();<br /> }<br /> }<br /> }<br /> }<br /> }<br /> return out.join('');<br />} </p><p>Array.prototype.push = function () {<br /> var curlen = this.length;<br /> for (var i = 0; i = 0 ; i--) {<br /> this[i + arglen] = this[i] ;<br /> }<br /> for (var i = 0; i 1) {<br /> for (var i = 1; i <br /><input onclick="runEx('runcode26437')" type="button" value="運行代碼"><input onclick="doCopy('runcode26437')" type="button" value="複製代碼"><input onclick="doSave(runcode26437)" type="button" value="儲存代碼">[Ctrl+A 全選 注:如需引入外部Js需重新整理才能執行]</andot>
如果你想測試低版本的 IE 瀏覽器上的效果,又沒有安裝低版本的 IE 瀏覽器,可以使用這個包:ie_all.zip 。這裡面都是不需要安裝的 IE,直接釋放壓縮包到一個目錄下,就可以運行了。如果你是 win9x 系統,可以到 這裡 下載 win9x 版的 standalone IE。