本文介绍在开发Three.js 3D应用时,针对Windows XP系统下Chrome浏览器不支持WebGL的问题,通过JavaScript获取浏览器版本号并调用Detector.webgl进行双重判断,确保低版本浏览器不执行相关代码,实现跨平台兼容。
问题背景与现象分析
此前开发的网页使用了three.js库来实现3D旋转球体特效。
该功能在多数浏览器中运行正常,且已针对IE浏览器编写了兼容代码。
近日接到反馈,指出该网页在Windows XP系统下无法显示,尽管IE浏览器表现正常,但Google Chrome浏览器却无法呈现效果。
面对这一现象,不禁令人疑惑:网页显示效果竟与操作系统存在关联?为何在主流浏览器中会出现异常?
为排查问题,搭建了一个Windows XP虚拟机环境。
随后尝试下载并安装Chrome浏览器。
发现无法安装最新版本的Chrome浏览器。
推测原因可能是Windows XP仅支持较低版本的Chrome,而当时的Chrome版本尚未集成WebGL支持。
基于Chrome版本的初步处理
为此,计划通过JavaScript获取Chrome版本号,若为低版本则跳过执行相关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;
}
}
该代码可提取Chrome版本号的前两位数字,以此判断是否为低版本,其中49为支持Windows XP的最高Chrome版本。
虽然看似解决了问题,但考虑到不确定50以上版本是否完全支持WebGL,仍需进一步验证。
因此,继续探索一种让浏览器自行判断是否支持WebGL的方法。
基于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表示支持WebGL,返回false则表示不支持。
最终将three.js相关代码嵌入该判断逻辑中,由浏览器自动决定是否执行支持WebGL的代码,不支持则跳过。
以上即为本文的全部内容,希望对读者有所帮助,欢迎继续支持本站。