JavaScript 动态创建VML的方法


Posted in Javascript onOctober 14, 2009

要使用VML,我们首先要开辟一个命名空间。以前动态创建比较麻烦
document.namespaces.add('vml', 'urn:schemas-microsoft-com:vml', "#default#VML");
ie8出现后,微软一口气升级了IE6,IE7。创建方法更简单。
document.namespaces.add('vml', 'urn:schemas-microsoft-com:vml');
它们的作用相当于把HTML标签搞成下面这个样子:
<html xmlns:vml="urn:schemas-microsoft-com:vml">
接着就是在样式中调用对应的CSS hehavior。静态代码应该是这个样子:
<style type="text/css">
vml\:* { behavior: url(#default#VML) }
</style>
网上风传IE8对VML支持不友好,要放弃VML云云,主要原因在于“vml\:*”这个选择器被IE8认为不合法(反面证明IE在努力修正其 CSS bug)。由此,人们被迫利用v\:line, v\:rect, v\:roundrect, v\:oval这样子的联合选择器来调用相关的CSS hehavior。不过只要是合法选择器就可以调用CSS hehavior,因此这里用联合选择器实在太累赘了。我想换类选择器是否更合适点呢?试验一下,是无问题的。但仅仅是这样是渲染不出来的,由于IE8已 经重写了内核,因此此bug不是hasLayout可以解决的。官方给出答案是使用display:inline-block,这样就可以强逼它继续渲染了。后来我又发现display:block也有此功效,但考虑到内联元素的问题,还是用官方的补丁吧 。至此,开辟命名空与与渲染VML元素的问题就告一段落。
再来看如何动态创建VML元素,由于是非标准,我们就用非标准的createElement方式来创建它。我们需要拼接一个字符串,作为createElement 的参数,它应该包含命名空间与类名。
var createVML = function (tagName) {
return doc.createElement('<vml:' + tagName + ' class="vml">');
};
随便做了一个小工具,看看后果如何:

function(){ 
if(!window.vml){ 
window.vml = {}; 
document.createStyleSheet().addRule(".vml", "behavior:url(#default#VML);display:inline-block;"); 
if (!document.namespaces.vml && !+"\v1"){ 
document.namespaces.add("vml", "urn:schemas-microsoft-com:vml"); 
} 
} 
var vml = window.vml = function(name){ 
return vml.fn.create(name || "rect"); 
} 
vml.fn = vml.prototype = { 
create : function(name){ 
this.node = document.createElement('<vml:' + name + ' class="vml">'); 
return this; 
}, 
appendTo: function(parent){ 
if(typeof this.node !== "undefined" && parent.nodeType == 1){ 
parent.appendChild(this.node); 
} 
return this; 
}, 
attr : function(bag){ 
for(var i in bag){ 
if(bag.hasOwnProperty(i)){ 
this.node.setAttribute(i,bag[i]) 
} 
} 
return this; 
}, 
css: function(bag){ 
var str = ";" 
for(var i in bag){ 
if(bag.hasOwnProperty(i)) 
str += i == "opacity" ? ("filter:alpha(opacity="+ bag[i] * 100+");"):(i+":"+bag[i]+";") 
} 
this.node.style.cssText = str; 
return this; 
} 
} 
})()

最后附上三种创建VML元素的方法:
var VmlElement = document.createElement('<vml:' + tagName + ' class="vml">'); 
var VmlElement = document.createElement('<' + tagName + ' 
xmlns="urn:schemas-microsoft.com:vml" class="vml">') 
var VmlElement = document.createElement('vml:' + tagName ); 
VmlElement.className = "vml";//最后必须把命名空间当作类名加上

//最后必须把命名空间当作类名加上
Javascript 相关文章推荐
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
Feb 05 Javascript
Extjs列表详细信息窗口新建后自动加载解决方法
Apr 02 Javascript
选择复选框按钮置灰否则按钮可用
May 22 Javascript
使用jQuery不判断浏览器高度解决iframe自适应高度问题
Dec 16 Javascript
使用Javascript实现选择下拉菜单互移并排序
Feb 23 Javascript
Mac下使用charles遇到的问题以及解决办法
Jan 10 Javascript
基于Angular.js实现的触摸滑动动画实例代码
Feb 19 Javascript
vue模板语法-插值详解
Mar 06 Javascript
vue自定义过滤器创建和使用方法详解
Nov 06 Javascript
weebox弹出窗口不居中显示的解决方法
Nov 27 Javascript
原生JavaScript实现的简单放大镜效果示例
Feb 07 Javascript
uni-app实现获取验证码倒计时功能
Nov 01 Javascript
JavaScript读取中文cookie时的乱码问题的解决方法
Oct 14 #Javascript
jQuery 标题的自动翻转实现代码
Oct 14 #Javascript
JavaScript 替换Html标签实现代码
Oct 14 #Javascript
JavaScript null和undefined区别分析
Oct 14 #Javascript
JavaScript iframe的相互操作浅析
Oct 14 #Javascript
使用jQuery简化Ajax开发 Ajax开发入门
Oct 14 #Javascript
jQuery技巧大放送 学习jquery的朋友可以看下
Oct 14 #Javascript
You might like
php cli 方式 在crotab中运行解决
2010/02/08 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
Function.prototype.bind用法示例
2013/09/16 Javascript
jquery如何获取复选框的值
2013/12/12 Javascript
Js实现网页键盘控制翻页的方法
2014/10/30 Javascript
js 通过cookie实现刷新不变化树形菜单
2014/10/30 Javascript
微信中一些常用的js方法汇总
2015/03/12 Javascript
JavaScript仿微博输入框效果(案例分析)
2016/12/06 Javascript
JavaScript 栈的详解及实例代码
2017/01/22 Javascript
ES6新特性之模块Module用法详解
2017/04/01 Javascript
vue.js如何将echarts封装为组件一键使用详解
2017/10/10 Javascript
使用Vue制作图片轮播组件思路详解
2018/03/21 Javascript
微信小程序实现默认第一个选中变色效果
2018/07/17 Javascript
配置eslint规范项目代码风格
2019/03/11 Javascript
使用vue重构资讯页面的实例代码解析
2019/11/26 Javascript
vue 解决IOS10低版本白屏的问题
2020/11/17 Javascript
[03:57]DOTA2英雄梦之声_第03期_幻影刺客
2014/06/21 DOTA
[01:23:59]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 VP vs Secret
2018/04/03 DOTA
Python(Tornado)模拟登录小米抢手机
2013/11/12 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
2018/03/22 Python
python 用正则表达式筛选文本信息的实例
2018/06/05 Python
windows系统中Python多版本与jupyter notebook使用虚拟环境的过程
2019/05/15 Python
python导入pandas具体步骤方法
2019/06/23 Python
Pandas0.25来了千万别错过这10大好用的新功能
2019/08/07 Python
PYTHON发送邮件YAGMAIL的简单实现解析
2019/10/28 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
2020/03/23 Python
HTML5 Canvas中使用用路径描画圆弧
2015/01/01 HTML / CSS
使用HTML5 Canvas API控制字体的显示与渲染的方法
2016/03/24 HTML / CSS
英国最大的网上药品商店:Chemist Direct
2017/12/16 全球购物
采用冷却技术的超自然舒适度:GhostBed床垫
2018/09/18 全球购物
中国旅游网站:途牛旅游网
2019/09/29 全球购物
开展党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
派出所副所长四风问题个人整改措施思想汇报
2014/10/13 职场文书
党的群众路线教育实践活动个人对照检查材料(公安)
2014/11/05 职场文书
如何用JavaScript学习算法复杂度
2021/04/30 Javascript
eval(cmd)与eval($cmd)的区别与联系
2021/07/07 PHP