前端最佳实践 之 能力检测

发布于 2022-05-11 10:57:34 字数 1833 浏览 1042 评论 1

能力检测,又可以称为特性检测,它的目标是识别浏览器的能力,它的基本模式如下:

  if (object.property) {
    // 使用 object.property
  }

例子

在浏览器中可以采用 JavaScript 检测是否支持 WebP ,对支持 WebP 的用户输出 WebP 图片,否则输出其他格式的图片。

  // 简化写法
  function isSupportWebp() {
    var isSupportWebp = false;

    try {
      isSupportWebp = document.createElement('canvas').toDataURL('image/webp').indexOf('data:image/webp') == 0;
    } catch(err) {
      console.log(err);
    }

    return isSupportWebp;
  }

上面代码的问题在于我们每当使用一次 isSupportWebp 时都会进行一次判断。
为了防止每次调用都判断的问题,我们可以用一个变量来作缓存。

  function isSupportWebp() {
    var isSupportWebp = false;

    try {
      isSupportWebp = document.createElement('canvas').toDataURL('image/webp').indexOf('data:image/webp') == 0;
    } catch(err) {
      console.log(err);
    }

    return isSupportWebp;
  }
  var isSupportWebpTmp = isSupportWebp();

这样我们可以使用 isSupportWebpTmp 来判定浏览器是否支持 WebP 格式的图片,但缺点是多了一个变量来做缓存,代码有点冗余。

我们也可以使用立即执行的匿名函数的形式来进行判断。

  var isSupportWebp = (function () {
    var isSupportWebp = false;

    try {
      isSupportWebp = document.createElement('canvas').toDataURL('image/webp').indexOf('data:image/webp') == 0;
    } catch(err) {
      console.log(err);
    }

    return isSupportWebp;
  })();

以上代码缺点是多了一个立即执行的匿名函数,当我在声明的时候,这个函数已经执行过一遍了。那有没有一种方法是在运行时才执行呢?
答案是肯定的。这时候可以利用惰性函数,代码如下:

  // 惰性函数
  function isSupportWebp() {
    var isSupportWebpTmp = false;

    try {
      isSupportWebpTmp = document.createElement('canvas').toDataURL('image/webp').indexOf('data:image/webp') == 0;
    } catch(err) {
      console.log(err);
    }

    isSupportWebp = function () { 
      return isSupportWebpTmp;
    }

    return isSupportWebp();
  };

当我们每次都需要进行条件判断,其实只需要判断一次,接下来的使用方式都不会发生改变的时候,想想是否可以考虑使用惰性函数,能力检测只是其中一种类型。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

╭摇划花蜜的午后 2022-05-04 07:34:46

函数内部了重写方法名会报错,"isSupportWebp" is read-only

~没有更多了~

关于作者

清旖

暂无简介

文章
评论
26 人气
更多

推荐作者

卷耳

文章 0 评论 0

佚名

文章 0 评论 0

℉服软

文章 0 评论 0

qq_2gSKZM

文章 0 评论 0

凉宸

文章 0 评论 0

gyhjy

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文