检测浏览器功能

尽管浏览器支持大多数 JScript 功能,但只有在服务器端才支持面向 .NET Framework、基于类的对象、数据类型、枚举、条件编译指令和 const 语句的那些新功能。 因此,您应该在服务器端脚本中以独占方式使用这些功能。 有关更多信息,请参见 JScript 版本信息

JScript 脚本可检测对其进行解释或编译的引擎的能力。 如果为服务器端应用程序(将运行在 ASP 或 ASP.NET 中)或命令行程序编写代码,则不必检测,因为可以很方便地发现所支持的 JScript 版本和相应的代码。 然而,当在浏览器中运行客户端脚本时,为了确保脚本与浏览器中的 JScript 引擎相兼容,该检测就是很重要的。

有两种方法可以检查 JScript 的兼容性:使用脚本引擎函数或使用条件编译。 同时使用这两种方法有一些优点。

脚本引擎函数

脚本引擎函数 (ScriptEngineScriptEngineBuildVersionScriptEngineMajorVersionScriptEngineMinorVersion) 返回有关脚本引擎当前版本的信息。 有关更多信息,请参见 函数 (Visual Studio - JScript)

为了得到最大的兼容性,在检查受支持的 JScript 版本的页中,应该只使用在 JScript 版本 1 中能够找到的那些功能。 如果某个引擎支持高于 1.0 的 JScript 版本,则可以重定向到包含高级功能的另一页。 这就意味着,对应于您想要支持的每个 JScript 版本,您都必须有每个网页的一个单独版本。 在大多数情况下,最有效的解决方案就是只有两个页,一个用于特定版本的 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 代码隐藏起来。 如果想在网页中直接包含少量替换代码,这种方法就是很有用的。

提示

不要在条件编译块中使用多行注释,因为不支持条件编译的引擎可能会对其作出错误解释。

<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 块包含大量代码,利用上述方法来使用脚本引擎函数可能更容易一些。

请参见

概念

JScript 版本信息

其他资源

编写、编译、调试 JScript 代码

函数 (Visual Studio - JScript)

条件编译