基于js判断浏览器是否支持webGL


Posted in Javascript onApril 18, 2020

起因是我之前开发的网页,用到了three.js制作了一个3d的旋转球体效果。

在各种浏览器上运行都没问题,在IE上也做了兼容代码。

但是今天接电话,老板说你这网页在xp上不显示啊。IE上好使。google浏览器不好使。

于是开始解决问题,不禁陷入了沉思。what?网页显示难道还与操作系统有关?google竟然不好使?

于是搭建一个xp虚拟机。

于是下载一个chorme。

惊奇的发现并不能安装最新版本的chrome。

哦?一定是xp上安装的低版本chrome而那时候的chrome还不支持webGL。这个坑啊。

于是机智的我打算获取谷歌版本,低版本的话不执行那段js。于是如下代码:

function getChromeVersion() {
    var arr = navigator.userAgent.split(' '); 
    var chromeVersion = '';
    for(var i=0;i < arr.length;i++){
      if(/chrome/i.test(arr[i]))
      chromeVersion = arr[i]
    }
    if(chromeVersion){
      return Number(chromeVersion.split('/')[1].split('.')[0]);
    } else {
      return false;
    }
  }

这个可以返回谷歌浏览器的前两个号码。由此判断低版本,49为支持xp的最高版本。

本想美滋滋解决。又想起。我也不确定50以上全支持啊!!!

于是继续搞起,找一个让浏览器自己判断是否支持webGL的东西。

于是如下;

var Detector = {
  canvas: !!window.CanvasRenderingContext2D,
  webgl: (function() {
    try {
      var canvas = document.createElement('canvas');
      return !!(window.WebGLRenderingContext && (canvas.getContext('webgl') || canvas.getContext('experimental-webgl')));
    } catch(e) {
      return false;
    }
  })(),
  workers: !!window.Worker,
  fileapi: window.File && window.FileReader && window.FileList && window.Blob,
  getWebGLErrorMessage: function() {
    var element = document.createElement('div');
    element.id = 'webgl-error-message';
    element.style.fontFamily = 'monospace';
    element.style.fontSize = '13px';
    element.style.fontWeight = 'normal';
    element.style.textAlign = 'center';
    element.style.background = '#fff';
    element.style.color = '#000';
    element.style.padding = '1.5em';
    element.style.width = '400px';
    element.style.margin = '5em auto 0';
    if(!this.webgl) {
      element.innerHTML = window.WebGLRenderingContext ? [
        'Your graphics card does not seem to support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation" rel="external nofollow" rel="external nofollow"  style="color:#000">WebGL</a>.<br />',
        'Find out how to get it <a href="http://get.webgl.org/" rel="external nofollow" rel="external nofollow"  style="color:#000">here</a>.'
      ].join('\n') : [
        'Your browser does not seem to support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation" rel="external nofollow" rel="external nofollow"  style="color:#000">WebGL</a>.<br/>',
        'Find out how to get it <a href="http://get.webgl.org/" rel="external nofollow" rel="external nofollow"  style="color:#000">here</a>.'
      ].join('\n');
    }
    return element;
  },
  addGetWebGLMessage: function(parameters) {
    var parent, id, element;
    parameters = parameters || {};
    parent = parameters.parent !== undefined ? parameters.parent : document.body;
    id = parameters.id !== undefined ? parameters.id : 'oldie';
    element = Detector.getWebGLErrorMessage();
    element.id = id;
    parent.appendChild(element);
  }
};
if(typeof module === 'object') {
  module.exports = Detector;
}

通过调用Detector.webgl,如果返回true为支持,false为不支持。

至此将three.js的代码放入其中,即可由浏览器自己判断是否支持。如果支持就执行。不支持就不执行。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
IE8 下的Js错误HTML Parsing Error...
Aug 14 Javascript
extjs 学习笔记(二) Ext.Element类
Oct 13 Javascript
iframe 上下滚动条如何默认在下方实现原理
Dec 10 Javascript
jquery.cookie用法详细解析
Dec 18 Javascript
12306验证码破解思路分享
Mar 25 Javascript
原生JS实现响应式瀑布流布局
Apr 02 Javascript
基于javascript实现浏览器滚动条快到底部时自动加载数据
Nov 30 Javascript
js获取时间精确到秒(年月日)
Mar 16 Javascript
Bootstrap CSS组件之分页(pagination)和翻页(pager)
Dec 17 Javascript
jquery ajaxfileupload异步上传插件
Nov 21 jQuery
微信小程序swiper组件用法实例分析【附源码下载】
Dec 07 Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
Jul 22 Javascript
JavaScript对象字面量和构造函数原理与用法详解
Apr 18 #Javascript
javascript 内存模型实例详解
Apr 18 #Javascript
javascript-hashchange事件和历史状态管理实例分析
Apr 18 #Javascript
javascript使用Blob对象实现的下载文件操作示例
Apr 18 #Javascript
原生js实现的观察者和订阅者模式简单示例
Apr 18 #Javascript
es6函数name属性功能与用法实例分析
Apr 18 #Javascript
es6数组includes()用法实例分析
Apr 18 #Javascript
You might like
PHP MVC框架skymvc支持多文件上传
2016/05/26 PHP
Discuz论坛密码与密保加密规则
2016/12/19 PHP
php使用pecl方式安装扩展操作示例
2019/08/12 PHP
单独使用CKFinder选择图片的方法
2010/08/21 Javascript
jQuery源码分析-05异步队列 Deferred 使用介绍
2011/11/14 Javascript
ASP.NET jQuery 实例12 通过使用jQuery validation插件简单实现用户注册页面验证功能
2012/02/03 Javascript
增强用户体验友好性之jquery easyui window 窗口关闭时的提示
2012/06/22 Javascript
Knockoutjs快速入门(经典)
2012/12/24 Javascript
javascript窗口宽高,鼠标位置,滚动高度(详细解析)
2013/11/18 Javascript
NodeJS Web应用监听sock文件实例
2015/02/18 NodeJs
jQuery关键词说明插件cluetip使用指南
2015/04/21 Javascript
完美实现js焦点轮播效果(二)(图片可滚动)
2017/03/07 Javascript
详解AngularJS1.x学习directive 中‘&amp; ’‘=’ ‘@’符号的区别使用
2017/08/23 Javascript
JavaScript实现精美个性导航栏筋斗云效果
2017/10/29 Javascript
简单的Vue SSR的示例代码
2018/01/12 Javascript
浅谈Vue 数据响应式原理
2018/05/07 Javascript
js滚轮事件 js自定义滚动条的实现
2020/01/18 Javascript
解决echarts图表使用v-show控制图表显示不全的问题
2020/07/19 Javascript
原生js实现移动小球(碰撞检测)
2020/12/17 Javascript
[20:30]职业巡回赛回顾
2018/08/09 DOTA
机器学习10大经典算法详解
2017/12/07 Python
python如何使用unittest测试接口
2018/04/04 Python
python树莓派红外反射传感器
2019/01/21 Python
Python实现E-Mail收集插件实例教程
2019/02/06 Python
python代理工具mitmproxy使用指南
2019/07/04 Python
维也纳通行证:Vienna PASS
2019/07/18 全球购物
比较一下entity bean和session bean
2013/12/27 面试题
住房公积金接收函
2014/01/09 职场文书
女子职高个人自荐书
2014/02/01 职场文书
房屋租赁委托书范本
2014/10/04 职场文书
2014年乡镇个人工作总结
2014/12/03 职场文书
团组织推优材料
2014/12/29 职场文书
幼师辞职信怎么写
2015/02/27 职场文书
2015年学生会纪检部工作总结
2015/03/31 职场文书
详解Python常用的魔法方法
2021/06/03 Python
Python中的变量与常量
2021/11/11 Python