JavaScript 判断浏览器类型/系统平台/渲染引擎

// 当前平台是否支持V8 Break Iterator。 V8检查对于检测所有基于Blink的浏览器是必需的。
let hasV8BreakIterator;

// 我们需要对`Intl`的引用进行尝试/捕获,因为在某些情况下访问它可能导致IE抛出异常。
// 这些情况与Windows的特定版本有关,如果用户提供了一个多填充的“地图”,则可能会发生这种情况。参阅:
// https://github.com/Microsoft/ChakraCore/issues/3189
// https://github.com/angular/components/issues/15687
try {
    hasV8BreakIterator = (typeof Intl !== 'undefined' && (Intl as any).v8BreakIterator);
} catch {
    hasV8BreakIterator = false;
}

export class Platform {
    /** 当前浏览器是否为 Microsoft Edge */
    isEdge = /(edge)/i.test(navigator.userAgent);

    /** 当前渲染引擎是否为 Microsoft Trident. */
    isTrident = /(msie|trident)/i.test(navigator.userAgent);

    // EdgeHTML和Trident模拟了Blink特定的事情,需要从此检查中排除。
    /** 当前渲染引擎是否为 Blink. */
    isBlink = (!!((window as any).chrome || hasV8BreakIterator) && typeof CSS !== 'undefined' && !this.isEdge && !this.isTrident);

    // Webkit是EdgeHTML,Blink和Trident中userAgent的一部分。 因此,我们需要确保Webkit独立运行,并且不会用作其他引擎的基础。
    /** 当前渲染引擎是否为 WebKit. */
    isWebKit = /AppleWebKit/i.test(navigator.userAgent) && !this.isBlink && !this.isEdge && !this.isTrident;

    /** 当前系统平台是否为 Apple iOS. */
    isIos = /iPad|iPhone|iPod/.test(navigator.userAgent) && !('MSStream' in window);

    // 很难检测到普通的Gecko引擎,因为大多数浏览器将其自身识别为类似Gecko的浏览器并根据此内容修改userAgent。
    // 由于我们仅涵盖了一个明确的Firefox案例,因此我们可以简单地检查Firefox而无需进行不稳定的检查
    /** 当前浏览器是否为 Firefox. */
    isFirefox = /(firefox|minefield)/i.test(navigator.userAgent);

    // 移动端上的Trident将android平台添加到userAgent来欺骗检测。
    /** 当前系统平台是否为 Android. */
    isAndroid = /android/i.test(navigator.userAgent) && !this.isTrident;

    // Safari浏览器将在其userAgent中包含Safari关键字。
    // 一些浏览器可能会伪造此代码,而只是将Safari关键字放在userAgent中。
    // 为了更安全地使用Safari,每个Safari浏览器还应该使用Webkit作为其布局引擎。
    /** 当前浏览器是否为 Safari. */
    isSafari = /safari/i.test(navigator.userAgent) && this.isWebKit;
}

以上代码整理自 Angular CDK

你可能感兴趣的:(JavaScript 判断浏览器类型/系统平台/渲染引擎)