偵測瀏覽器功能
更新:2007 年 11 月
雖然瀏覽器支援 JScript 大部分的功能,但是只有伺服器端支援用於 .NET Framework、類別架構物件、資料型別、列舉型別、條件式編譯指示詞以及 const 陳述式的新功能。因此,您應該只在伺服器端的指令碼內使用這些功能。如需詳細資訊,請參閱 JScript 版本資訊。
JScript 指令碼可以偵測對本身進行解譯或編譯之引擎的功能。當您為伺服器端的應用程式 (在 ASP 或 ASP.NET 上執行) 或命令列程式撰寫程式碼時,並不需要這項偵測,因為您可以輕易找出支援的 JScript 版本和相關程式碼。但是在瀏覽器中執行用戶端上的指令碼時,這項偵測能夠確保指令碼與瀏覽器中的 JScript 引擎相容,因此十分重要。
JScript 的相容性有二種檢查方式,一是使用指令碼引擎函式,一是使用條件式編譯。二種方式,各有所長。
指令碼引擎函式
指令碼引擎函式 (ScriptEngine、ScriptEngineBuildVersion、ScriptEngineMajorVersion、ScriptEngineMinorVersion) 會傳回目前指令碼引擎版本的相關資訊。如需詳細資訊,請參閱 函式 (JScript)。
為了得到最高的相容性,您應該在支援的 JScript 版本檢查頁面中,只使用在 JScript 1 版中找到的功能。如果引擎支援的 JScript 版本比 1.0 還新,您可以重新導向至有進階功能的頁面。這表示您要支援的每個 JScript 版本,必須有各自的 Web 網頁版本。在大多數情況下,最有效的解決方式是只準備兩個頁面,一個專門為 JScript 的特殊版本而設計,另一個則是為不使用 JScript 而設計。
注意事項: |
---|
使用進階功能的 JScript 程式碼,必須另外放在瀏覽器不會以不相容的引擎執行的頁面中。這是絕對必要的,因為瀏覽器的指令碼引擎會解譯頁面中所有的 JScript 程式碼。在較舊的引擎上,無法使用 if…else 陳述式在使用新版 JScript 的區塊和 JScript 1 版程式碼的區塊之間切換。 |
下面的範例說明指令碼引擎函式的用法。這些函式是在 JScript 2.0 版中介紹的,因此使用之前您必須先瞭解引擎是否支援這些函式。如果引擎只支援 JScript 1.0 版或是無法辨別 JScript,typeof 運算子會對每個函式名稱傳回 "undefined" 字串。
if("undefined" == typeof ScriptEngine) {
// This code is run if the script engine does not support
// the script engine functions.
var version = 1;
} else {
var version = ScriptEngineMajorVersion();
}
// Display the version of the script engine.
alert("Engine supports JScript version " + version);
// Use the version information to choose a page.
if(version >= 5) {
// Send engines compatible with JScript 5.0 and better to one page.
var newPage = "webpageV5.htm";
} else {
// Send engines that do not interpret JScript 5.0 to another page.
var newPage = "webpagePre5.htm";
}
location.replace(newPage);
條件式編譯
條件式編譯變數和陳述式可以向不支援條件式編譯的引擎隱藏 JScript 程式碼。如果您想直接在 Web 網頁中放入少量的替代程式碼,可以使用這個方法。
注意事項: |
---|
請不要在條件式編譯區塊中使用多行註解,因為不支援條件式編譯的引擎可能會錯誤解譯註解。 |
<script>
/*@cc_on
@if(@_jscript_version >= 5 )
// Can use JScript Version 5 features such as the for...in statement.
// Initialize an object with an object literal.
var obj = {"a" : "Athens" , "b" : "Belgrade", "c" : "Cairo"};
var key;
// Iterate the properties.
for (key in obj) {
document.write("The "+key+" property has value "+obj[key]+".<BR>");
}
@else
@*/
alert("Engine cannot interpret JScript Version 5 code.");
//@end
</script>
如果條件式 @if 區塊中有許多程式碼,您不妨採用前述指令碼引擎函式的使用方法。