IE下canvas使用问题归集
来源:互联网 发布:qq飞车淘宝网商城 编辑:程序博客网 时间:2024/05/17 05:56
1.同一页HTML要兼容低版本IE,需要在HTML header里包括:
<!--[if lt IE 9]>
<script type="text/javascript" src="html5shiv.js"></script>
<script type="text/javascript" src="canvas.text.js"></script>
<script type="text/javascript" src="excanvas.js"></script>
<![endif]-->
2.动态生成的Canvas对象将不支持getContext方法,
要使IE中的Canvas对象支持getContext等方法需要调用excanvas中的G_vmlCanvasManager_.initElement方法,由于最后的
G_vmlCanvasManager = G_vmlCanvasManager_;
使得G_vmlCanvasManager的作用域是当前window,所以在需要初始化Canvas的时候可以采用如下的方法:
var cav = document.createElement("canvas");
if(!cav.getContext) { G_vmlCanvasManager.initElement(cav); }
var ctx = cav.getContext("2d");
....
3.drawImage方法不能用Canvas对象作为第一个参数,
excanvas中的drawImage方法只接受Image对象为第一个参数,为了使其支持Canvas对象的绘制,可修改如下代码(在excanvas.js中检索到"contextPrototype.drawImage"所在行):
contextPrototype.drawImage = function(image, var_args) {
if (image.getContext) { // draw canvas
this.element_.innerHTML += image.getContext("2d").element_.innerHTML;
}
var dx, dy, dw, dh, sx, sy, sw, sh;
..
4.不支持fillText等方法.
fillText,measureText也已成为CanvasRenderingContext2D对象的标准方法,为了使IE也能支持,在excanvas.js中添加以下代码:
contextPrototype.measureText = function(textToDraw) {
var hiddenSpan = document.createElement('span');
hiddenSpan.style.font = this.font;
hiddenSpan.innerHTML = textToDraw;
var bodyNode = document.getElementsByTagName("body")[0];
bodyNode.appendChild(hiddenSpan);
var width = hiddenSpan.offsetWidth;
bodyNode.removeChild(hiddenSpan);
return {"width" : width + 1};
}
contextPrototype.fillText = function(textToDraw, x, y) {
var vmlStr = [];
var textHeightStr = this.font.split("px")[0].replace(/(^\s+)|(\s+$)/g,"");
var textHeight = /^\d+$/.test(textHeightStr) ? parseInt(textHeightStr) : 0;
vmlStr.push('<g_vml_:shape style="font:' +this.font +';',
' color:' + this.fillStyle + ';',
' position:absolute;',
' left:' + x + 'px;',
' top:' + (y - textHeight) +'px;',
' width:' + this.measureText(textToDraw).width + 'px;',
' height:' + textHeight +'px;"',
' ><g_vml_:textbox inset="0,0,0,0">' + textToDraw,
' </g_vml_:textbox>',
'</g_vml_:shape>');
this.element_.insertAdjacentHTML('BeforeEnd', vmlStr.join(''));
}
其中measureText是通过在页面上添加一个隐藏的临时文字容器并获得其宽度来实现.
另外在属性声明的地方要添加默认字体:
// Canvas context properties
this.strokeStyle = '#000';
this.fillStyle = '#000';
this.font = '12px sans-serif';
...
5.IE与其他浏览器的不同处理
下面的部分包括在HTML的BODY里, canvas元素的后面:
<!--[if ! IE]>--> <script type="text/javascript" src="javascript/mycode.js"></script> <!--<![endif]-->
<!--[if IE]> <script type="text/javascript" src="javascript/mycode.ie.js"></script> <![endif]-->
下面是mycode.ie.js不同于mycode.js的部分.
1) addEventListener -> attachEvent
别的浏览器用addEventListener. IE用attachEvent. 对于事件名, IE要多加一个"on". 比如IE用"onmousedown", 别的浏览器用"mousedown".
2)为了兼容手机, 鼠标事件为触屏事件取代, 所以mousedown/mouseup/mousemove改用如下的事件: touchstart/touchend/touchmove.
3)event.pageX -> pageX(event)
别的浏览器直接用event.pageX. IE完全不同, 所以另外自定义一个函数pageX(event)来达到相同效果:
function pageX(e) {
if (e.pageX) return e.pageX;
else if (e.clientX)
return e.clientX + (document.documentElement.scrollLeft ?
document.documentElement.scrollLeft : document.body.scrollLeft);
else return null;
}
4)in event handlers, this.offsetLeft/Top -> vCanvas.offsetLeft/Top
别的浏览器this指代事件发生的元素, 这里是canvas. IE的this指代window, 所以要专门指明vCanvas.offsetLeft/Top.
5)onmouseout在IE里行为不稳定, 所以应避免使用, 或者改用onmouseleave.
6)辨认鼠标的左右键, 别的浏览器用event.which, IE用event.button.
7)DIV元素的半透明效果,别的浏览器用 style="background-color:rgba(255,255,255,0.75);", IE用style="background-color: white; opacity:0.75;filter:alpha(opacity=75);"
8)定义元素高度和宽度时,IE常要指明单位px,别的浏览器不用. 比如:
<!--[if ! IE]>-->
<table id="Toolbar" border="0" cellpadding="2" cellspacing="0" bgcolor="#ffffff" style="font-size:12px; width:320;">
<!--<![endif]-->
<!--[if IE]>
<table id="Toolbar" border="0" cellpadding="2" cellspacing="0" bgcolor="#ffffff" style="font-size:12px; width:320px;">
<![endif]-->
转自:
http://ck-2036.iteye.com/blog/800897
http://bbs.csdn.net/topics/370103016
- IE下canvas使用问题归集
- canvas学习网址归集
- ie下使用扩展canvas的javascript图形编程
- JavaWeb问题归集
- ie下使用ajax缓存问题
- IE下使用 parseInt函数问题
- 在IE下动态创建canvas使用excanvas时失效解决方法
- Mac(10.10) 下编译Android4.0源码问题归集
- 在ie及firefox下DOM使用问题!
- IE下jquery使用submit方法时,提示下载问题
- IE浏览器下使用localhost域名保存cookie的问题
- IE下无法使用半透明rgba的问题及解决方案
- IE 下使用firebug
- Linux下使用IE
- IE 下使用firebug
- IE下使用firebug
- jquery使用canvas的问题
- ie 下使用firebug ie firebug
- 开启从Lotus 邮件系统到Exchange 系统的转移篇章-POC过程-迁移前准备工作!
- 查看mysql当前连接数
- 使用 rapidxml 做配置文件
- android Application Component研究之Activity(二)
- 《毛巾之战2:单片眼镜的命运 Towelfight 2: The Monocle of Destiny》游戏试玩测评
- IE下canvas使用问题归集
- 从JAVA多线程理解到集群分布式和网络设计的浅析
- MySQL数thread_cache和table_cache详解 [
- 常用c语言算法
- for pooled tables,cluster tables,and projection views,join is not allowed:"KONV"
- HOME按下或返回程序时几种方法
- js操作dom对象
- Ubuntu的使用技巧-如何在Ubuntu下安装rpm格式的安装包
- PHP开发者常犯的10个MySQL错误