如何找到浏览器的Javascript引擎版本以及对ECMAScript 6的支持?
我navigator.appVersion
只是想知道浏览器的版本,而不是引擎的版本。
我建议您使用 功能检测, 而不要使用启发式方法检测浏览器的引擎。为此,您可以简单地 在try {..} catch (e) {...}
语句中包装一些代码,或使用一些if (...)
语句。
例如:
function check() {
if (typeof SpecialObject == "undefined") return false;
try { specialFunction(); }
catch (e) { return false; }
return true;
}
if (check()) {
// Use SpecialObject and specialFunction
} else {
// You cannot use them :(
}
在大多数情况下,有多种原因可以使特征检测成为最佳选择:
您不必依赖浏览器的版本,引擎或具体细节,也不必使用难以实现的,启发式的方法来检测它们。
您不会陷入有关浏览器/引擎规格检测的错误。
您不必担心浏览器特定的功能:例如,WebKit浏览器的规格与其他浏览器不同。
您可以确定,一旦检测到功能,便可以使用它。
这些是IMHO使特征检测成为最佳方法的主要原因。
使用 功能检测时 ,一种不确定的工作方式是一种聪明的工作方式,它不确定您可以/不能使用哪些功能,其中包括 几种功能检测,以及 __在
某些情况 下回退到 更基本的方法 (甚至从零开始创建这些方法)的情况。不支持您要使用的。
一个 具有后备功能的特征检测的
简单示例可能适用于该window.requestAnimationFrame
功能,并非所有浏览器都支持该功能,并且根据您使用的浏览器,它具有几个不同的前缀。在这种情况下,您可以像这样轻松地检测并
回退 :
requestAnimationFrame =
window.requestAnimationFrame // Standard name
|| window.webkitRequestAnimationFrame // Fallback to webkit- (old versions of Chrome or Safari)
|| window.mozRequestAnimationFrame // Fallback to moz- (Mozilla Firefox)
|| false; // Feature not supported :(
// Same goes for cancelAnimationFrame
cancelAnimationFrame = window.cancelAnimationFrame || window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || false;
if (!requestAnimationFrame) {
// Not supported? Build it by yourself!
requestAnimationFrame = function(callback) {
return setTimeout(callback, 0);
}
// No requestAnim. means no cancelAnim. Built that too.
cancelAnimationFrame = function(id) {
clearTimeout(id);
}
}
// Now you can use requestAnimationFrame
// No matter which browser you're running
var animationID = requestAnimationFrame(myBeautifulFunction);
现在,要解决一个 真正的问题 :如果您想检测对ES6的支持,您将无法像我上面所说的那样工作,因为
ES6功能的相关范围基于新的语法和专用词,并且会抛出一SyntaxError
,如果用在ES5,这意味着
编写同时包含ES5和ES6的脚本是不可能的!
这是一个演示此问题的示例;以下代码段无效,并且由于包含非法语法,因此在执行前将被阻止。
function check() {
"use strict";
try { eval("var foo = (x)=>x+1"); }
catch (e) { return false; }
return true;
}
if (check()) {
var bar = (arg) => { return arg; }
// THIS LINE will always throw a SyntaxError in ES5
// even before checking for ES6
// because it contains illegal syntax.
} else {
var bar = function(arg) { return arg; }
}
现在,由于您不能同时在同一个脚本中有条件地检查和执行ES6,因此 必须编写两个不同的脚本
:一个仅使用ES5,另一个包含ES6功能。使用两种不同的脚本, 只有在受支持的情况下 , ES6 才可以 导入 ,而不会引发
该 脚本SyntaxErrors
。
现在让我们做一个更相关的示例,假设您想在ES6脚本中使用这些功能:
Symbol
对象class
关键字构建的类(...)=>{...}
)功能注意: 只能使用 功能 或其他等效 功能 (例如) 来完成 新引入语法 (例如箭头功能)的 功能检测
,因为编写无效语法会在脚本执行之前停止脚本。这也是为什么您不能使用语句来检测类和箭头函数的原因:这些功能与关键字和语法有关,因此包装在块中可以很好地工作。
eval()
Function()``if``eval(...)``try {...} catch (e) {...}
因此,进入真正的代码:
HTML标记:
<html>
<head>
<script src="es5script.js"></script>
</head>
<body>
<!-- ... -->
</body>
</html>
es5script.js脚本中的代码:
function check() {
"use strict";
if (typeof Symbol == "undefined") return false;
try {
eval("class Foo {}");
eval("var bar = (x) => x+1");
} catch (e) { return false; }
return true;
}
if (check()) {
// The engine supports ES6 features you want to use
var s = document.createElement('script');
s.src = "es6script.js";
document.head.appendChild(s);
} else {
// The engine doesn't support those ES6 features
// Use the boring ES5 :(
}
您的代码es6script.js:
// Just for example...
"use strict";
class Car { // yay!
constructor(speed) {
this.speed = speed;
}
}
var foo = Symbol('foo'); // wohoo!
var bar = new Car(320); // blaze it!
var baz = (name) => { alert('Hello ' + name + '!'); }; // so cool!
浏览器/引擎检测
就像我在上面说的那样,在对某些JavaScript脚本进行编程时,浏览器和引擎检测并不是最佳实践。我将为您提供有关此主题的一些背景知识,只是不要让我的话成为“随机的个人意见”。
当考虑使用用户代理字符串来检测正在使用的浏览器时,第一步是尝试尽可能避免使用它。首先尝试确定您为什么要这样做。
[…] 您是否要检查是否存在特定功能?
您的站点需要使用某些浏览器尚不支持的特定Web功能,并且您希望将这些用户发送到功能较少的旧站点,但您知道可以使用。这是使用用户代理检测的最糟糕的原因,因为最终所有其他浏览器都会赶上来。您应尽力避免在这种情况下使用用户代理嗅探,而应
进行功能检测 。
另外,您说的是navigator.appVersion
,但考虑使用另一种方法,因为该方法以及许多其他导航器属性已被 弃用
,并且并不总是像您认为的那样运行。
不推荐使用
:此功能已从Web标准中删除。尽管某些浏览器可能仍支持它,但是它正在被删除。不要在新旧项目中使用它。使用它的页面或Web应用程序可能随时中断。
注意:
不要依赖此属性返回正确的浏览器版本。在基于Gecko的浏览器(如Firefox)和基于WebKit的浏览器(如Chrome和Safari)中,返回值以“ 5.0”开头,后跟平台信息。在Opera 10及更高版本中,返回的版本也不与实际的浏览器版本匹配。
问题内容: 是否有人能在IE / Firefox上正常运行的脚本示例能够检测浏览器是否能够显示嵌入式Flash内容。我说可靠是因为我知道不可能100%的时间。 问题答案: SWFObject非常可靠。我已经使用它很长时间了。
问题内容: 专业的网页设计师如何创建跨浏览器的CSS?通常是手动完成,还是像YUI针对JavaScript那样可以简化流程的工具包?我希望远离Dreamweaver之类的所见即所得编辑器。谢谢! 问题答案: 通常是手工完成的。 通常从对比赛场地应用CSS重置开始。 而且,您应该针对符合标准的CSS,然后作为对IE的最后手段,才可以使用hacks(是的,我刚刚说过)。
问题内容: 您如何确定用户是否按下浏览器中的“后退”按钮? 您如何使用系统在单页Web应用程序内强制使用页内后退按钮? 到底为什么浏览器后退按钮不触发自己的事件!? 问题答案: (注意:根据Sharky的反馈,我提供了用于检测退格的代码) 因此,我经常在SO上看到这些问题,并且最近遇到了我自己控制后退按钮功能的问题。在为我的应用程序寻找最佳解决方案(带哈希导航的单页)几天后,我提出了一个简单的,跨
问题内容: 我正在从Firefox 3.5开始为新服务开发Web应用程序。 界面设计是无表的,仅使用divs + CSS和性能良好的做法。 现在,尽管与Safari兼容仅花费了很少的时间,但IE还是很痛苦。 我的问题是:有什么可以用来加速跨浏览器检查的吗?例如,我已经知道FF和IE之间的许多区别,但是使用特定工具可能会有所帮助。 你能建议一个吗? 谢谢, 猩红 问题答案: 跨浏览器开发 没有工具可
问题内容: 如何使用JavaScript检测Safari浏览器?我在下面尝试过代码,它不仅可以检测Safari,还可以检测Chrome浏览器。 问题答案: 您可以轻松地使用Chrome的索引来过滤掉Chrome:
Web Storage 是一项非常重要,并且很实用的技术,因此浏览器的支持度非常高,所有的主流浏览器,包括IE8,都在一定程度上支持Web Storage。尽管如此,最好还是像往常一样,在使用前先检测浏览器是否支持Web Storage。 在Web Storage中,可以直接使用 window 对象访问特定域下存储的数据。因此,只需检测浏览器是否支持 window.localStorage 或 w