基于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 相关文章推荐
JavaScript 学习笔记(六)
Dec 31 Javascript
JQuery 绑定select标签的onchange事件,弹出选择的值,并实现跳转、传参
Jan 06 Javascript
js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度实现代码
Dec 17 Javascript
js中prototype用法详细介绍
Nov 14 Javascript
JQuery结合CSS操作打印样式的方法
Dec 24 Javascript
点击button获取text内容并改变样式的js实现
Sep 09 Javascript
javascript继承机制实例详解
Nov 20 Javascript
js 判断所选时间(或者当前时间)是否在某一时间段的实现代码
Sep 05 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
Jul 17 Javascript
create-react-app构建项目慢的解决方法
Mar 14 Javascript
Vue动态修改网页标题的方法及遇到问题
Jun 09 Javascript
layui对工具条进行选择性的显示方法
Sep 19 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
第4章 数据处理-php字符串的处理-郑阿奇(续)
2011/07/04 PHP
PHP人民币金额数字转中文大写的函数代码
2013/02/27 PHP
测试php函数的方法
2013/11/13 PHP
文件上传之SWFUpload插件(代码)
2015/07/30 PHP
yii2使用ajax返回json的实现方法
2016/05/14 PHP
JavaScript 自动分号插入(JavaScript synat:auto semicolon insertion)
2009/11/04 Javascript
javascript中checkbox使用方法简单实例演示
2015/11/17 Javascript
原生JS封装animate运动框架的实例
2017/10/12 Javascript
JavaScript实现树的遍历算法示例【广度优先与深度优先】
2017/10/26 Javascript
fetch 使用及如何接收JS传值
2017/11/11 Javascript
详解React之key的使用和实践
2018/09/29 Javascript
Vue axios全局拦截 get请求、post请求、配置请求的实例代码
2018/11/28 Javascript
layer ui 导入文件之前传入数据的实例
2019/09/23 Javascript
Python实现简单的文件传输与MySQL备份的脚本分享
2016/01/03 Python
python 异常处理总结
2016/10/18 Python
python 表达式和语句及for、while循环练习实例
2017/07/07 Python
python如何压缩新文件到已有ZIP文件
2018/03/14 Python
TensorFlow Session会话控制&amp;Variable变量详解
2018/07/30 Python
pytorch使用指定GPU训练的实例
2019/08/19 Python
python3中替换python2中cmp函数的实现
2019/08/20 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
2019/09/04 Python
Python3常见函数range()用法详解
2019/12/30 Python
浅谈django 重载str 方法
2020/05/19 Python
python实现时间序列自相关图(acf)、偏自相关图(pacf)教程
2020/06/03 Python
python爬虫可以爬什么
2020/06/16 Python
介绍一下grep命令的使用
2015/06/12 面试题
项目合作计划书
2014/01/09 职场文书
《宋庆龄故居的樟树》教学反思
2014/04/07 职场文书
校长个人总结
2015/03/03 职场文书
2015年七夕情人节活动方案
2015/05/06 职场文书
工作态度检讨书范文
2015/05/06 职场文书
家长会主持词开场白
2015/05/29 职场文书
上帝也疯狂观后感
2015/06/09 职场文书
学困生帮扶工作总结
2015/08/13 职场文书
干货干货!2019最新优秀创业计划书
2019/03/21 职场文书
mysql中varchar类型的日期进行比较、排序等操作的实现
2021/11/17 MySQL