IE下使用excanvas.js以後,動態建立的canvas不支持getContext的解決方法
引入excanvas.js之後,在ie下,文檔中的canvas就能夠用了,可是若是是經過createElement方法建立的就不行了
var canvas=document.createElement(」canvas」);
if(canvas.getContext){
alert(」support getContext()」);
}
這 段代碼在ie下不工做,因而把google搞的這個讓ie支持canvas的代碼大概地讀了一遍,知道了是怎麼回事。將代碼放到aptana裏面看,10 分鐘不到,785行代碼,還不錯,我想,這得益於以前仔細看過犀牛書前面js core部分7遍以及對canvas和vml的瞭解吧。html
原來,加載並執行excanvas.js這個腳本代碼的時候,G_vmlCanvasManager_.init();這句語句遍歷了頁面中全部的canvas元素,而後初始化這些元素,亦便是將標準canvas的那些個方法賦予ie下的canvas:
var els = doc.getElementsByTagName(」canvas」);
for (var i = 0; i < els.length; i++) {
if (!els[i].getContext) {
this.initElement(els[i]);
}
}
如 果是文檔原來就有的canvas標籤,那就沒有問題,這段腳本將找到的canvas元素做爲參數傳遞給 G_vmlCanvasManager_.initElement()這個方法。可是經過createElement方法建立的canvas就不行了,因 爲調用這段腳本的時候,後來新建立的canvas元素尚未被它找到。
那麼,解決辦法就是新建立了一個canvas元素就調用G_vmlCanvasManager_.initElement()方法來初始化。jquery
可是,G_vmlCanvasManager_是在一個匿名函數function(){}裏面定義的,我在全局範圍下就沒有辦法引用到,還好,在excanvas.js文件的後面,有一句語句,
G_vmlCanvasManager = G_vmlCanvasManager_;
因爲js的函數中,若是一個變量不經過var來定義,那麼就會把這個變量看成一個全局變量,好啦,如今有一個全局變量來引用它了。
那麼,下面是解決問題的代碼:
$(function(){
var canvas=document.createElement(」canvas」);
document.body.appendChild(canvas);
if($.browser.msie){
canvas=window.G_vmlCanvasManager.initElement(canvas);
}
if(canvas.getContext){alert(」support」);}
});
這裏我用了jquery,在DOM ready之後才執行這段腳本。
另外,記得canvas=window.G_vmlCanvasManager.initElement(canvas);以前要將新建立好的canvas追加到文檔流中:document.body.appendChild(canvas);canvas