admin管理员组

文章数量:1535100

在实际开发中,会碰到部分业务场景需要判断浏览器类型做不同处理,例如处理下载文件的二进制流,获取到文件名后进行解密,由于火狐浏览器的处理与其他的不一样,所以需要进行判断是否为火狐浏览器,去做不同的解密处理
一、封装方法
目前只做浏览器判断,不做版本判断

const kUserAgent = {
  Opera: 'Opera',
  FF: 'FF',
  Chrome: 'Chrome',
  Safari: 'Safari',
  IE: 'IE',
};

const getUserAgent = () => {
  const { userAgent } = navigator; // 取得浏览器的userAgent字符串
  if (userAgent.indexOf('Opera') > -1) {
    // 判断是否Opera浏览器
    return kUserAgent.Opera;
  }
  if (userAgent.indexOf('Firefox') > -1) {
    // 判断是否Firefox浏览器
    return kUserAgent.FF;
  }
  if (userAgent.indexOf('Chrome') > -1) {
    // 判断是否为谷歌浏览器
    return kUserAgent.Chrome;
  }
  if (userAgent.indexOf('Safari') > -1) {
    // 判断是否Safari浏览器
    return kUserAgent.Safari;
  }
  if (
    userAgent.indexOf('compatible') > -1 &&
    userAgent.indexOf('MSIE') > -1 &&
    userAgent.indexOf('Opera') > -1
  ) {
    // 判断是否IE浏览器
    return kUserAgent.IE;
  }
  return '';
};

二、引入方法

import { getUserAgent, kUserAgent } from './util';

三、使用方法

// 处理下载文件的二进制流
const handleDownloadBlob = (res, fileName) => {
  let filename = fileName;
  if (!filename && res && res.headers && res.headers.get) {
    const contentDisposition = res.headers.get('content-disposition');
    if (contentDisposition) {
      const cdArr = contentDisposition.split('filename=');
      if (cdArr && cdArr.length > 0) {
        filename = cdArr[cdArr.length - 1];
        // 获取到文件名后 进行解密 (火狐浏览器的处理与其他的不一样)
        filename =
          getUserAgent() === kUserAgent.FF
            ? decodeURI(escape(filename))
            : decodeURI(filename);
      }
    }
  }
  if (res && res.blob) {
    res.blob().then(blob => {
      let a = document.createElement('a');
      const url = window.URL.createObjectURL(blob);
      if (filename) {
        a.href = url;
        a.download = filename;
        a.click();
        window.URL.revokeObjectURL(url);
        a = null;
      }
    });
  }
};

本文标签: 浏览器类型js