มีสองวิธียอดนิยมในการตรวจหาการสนับสนุน Canvas ในเบราว์เซอร์:
ข้อเสนอแนะของ Matt ในการตรวจสอบการมีอยู่ของgetContext
ยังใช้ในลักษณะที่คล้ายกันโดยห้องสมุด Modernizr:
var canvasSupported = !!document.createElement("canvas").getContext;
การตรวจสอบการดำรงอยู่ของHTMLCanvasElement
อินเตอร์เฟซที่กำหนดโดยWebIDLและHTMLข้อกำหนด วิธีการนี้ยังได้รับการแนะนำในบล็อกโพสต์จากทีม IE 9
var canvasSupported = !!window.HTMLCanvasElement;
คำแนะนำของฉันคือการเปลี่ยนแปลงในภายหลัง (ดูหมายเหตุเพิ่มเติม ) ด้วยเหตุผลหลายประการ:
- เบราว์เซอร์ทุกตัวที่รู้จักกันดีซึ่งสนับสนุนแคนวาส - รวมถึง IE 9 - ใช้ส่วนต่อประสานนี้
- มันกระชับและชัดเจนในทันทีว่าโค้ดกำลังทำอะไรอยู่
getContext
วิธีการเป็นอย่างช้าเบราว์เซอร์ทั้งหมดเพราะมันเกี่ยวข้องกับการสร้างองค์ประกอบ HTML สิ่งนี้ไม่เหมาะเมื่อคุณต้องการบีบประสิทธิภาพให้มากที่สุดเท่าที่จะทำได้ (ในไลบรารีเช่น Modernizr เป็นต้น)
ไม่มีประโยชน์ที่เห็นได้ชัดเจนในการใช้วิธีแรก ทั้งสองวิธีสามารถปลอมแปลงได้ แต่สิ่งนี้ไม่น่าจะเกิดขึ้นโดยบังเอิญ
หมายเหตุเพิ่มเติม
อาจยังจำเป็นต้องตรวจสอบว่าสามารถดึงบริบท 2D ได้ ข่าวบางเบราว์เซอร์มือถือสามารถกลับจริงสำหรับการตรวจสอบทั้งสองข้างต้น แต่กลับสำหรับnull
.getContext('2d')
นี่คือเหตุผลที่ Modernizr ตรวจสอบผลลัพธ์.getContext('2d')
ด้วย อย่างไรก็ตาม WebIDL & HTML - อีกครั้ง - ช่วยให้เรามีตัวเลือกที่ดีกว่าและเร็วกว่า :
var canvas2DSupported = !!window.CanvasRenderingContext2D;
โปรดสังเกตว่าเราสามารถข้ามการตรวจสอบองค์ประกอบ Canvas ทั้งหมดและตรงไปที่การตรวจสอบการสนับสนุนการเรนเดอร์ 2D CanvasRenderingContext2D
อินเตอร์เฟซที่เป็นส่วนหนึ่งของข้อกำหนด HTML
คุณต้องใช้getContext
วิธีการสำหรับการตรวจสอบ WebGLสนับสนุนเนื่องจากแม้ว่าเบราว์เซอร์อาจสนับสนุนWebGLRenderingContext
, getContext()
อาจจะกลับnullถ้าเบราว์เซอร์ไม่สามารถที่จะติดต่อกับ GPU เนื่องจากปัญหาคนขับและไม่มีการใช้งานซอฟต์แวร์ ในกรณีนี้การตรวจสอบอินเทอร์เฟซก่อนให้คุณข้ามการตรวจสอบสำหรับgetContext
:
var cvsEl, ctx;
if (!window.WebGLRenderingContext)
window.location = "http://get.webgl.org";
else {
cvsEl = document.createElement("canvas");
ctx = cvsEl.getContext("webgl") || cvsEl.getContext("experimental-webgl");
if (!ctx) {
// Browser supports WebGL, but cannot create the context
}
}
การเปรียบเทียบประสิทธิภาพ
ประสิทธิภาพของการ getContext
วิธีการนั้นช้ากว่า 85-90% ใน Firefox 11 และ Opera 11 และช้ากว่า 55% ใน Chromium 18