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 相关文章推荐
不错的JS中变量相关的细节分析
Aug 13 Javascript
Date对象格式化函数代码
Jul 17 Javascript
js中scrollHeight,scrollWidth,scrollLeft,scrolltop等差别介绍
May 16 Javascript
jQuery CSS3自定义美化Checkbox实现代码
May 12 Javascript
AngularJS过滤器filter用法实例分析
Nov 04 Javascript
jquery操作select取值赋值与设置选中实例
Feb 28 Javascript
js事件委托和事件代理案例分享
Jul 25 Javascript
JS轮播图实现简单代码
Feb 19 Javascript
layui框架table 数据表格的方法级渲染详解
Aug 19 Javascript
Echart折线图手柄触发事件示例详解
Dec 16 Javascript
js回文数的4种判断方法示例
Jun 04 Javascript
微信小程序在text文本实现多种字体样式
Nov 08 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封装的page分页类完整实例
2016/10/18 PHP
php微信公众号开发模式详解
2016/11/28 PHP
PHP+RabbitMQ实现消息队列的完整代码
2019/03/20 PHP
利用JS判断鼠标移入元素的方向
2016/12/11 Javascript
微信小程序tabBar模板用法实例分析【附demo源码下载】
2017/11/28 Javascript
vue移动端UI框架实现QQ侧边菜单组件
2018/03/09 Javascript
基于vue1和vue2获取dom元素的方法
2018/03/17 Javascript
vue-devtools的安装步骤
2018/04/23 Javascript
微信小程序chooseImage的用法(从本地相册选择图片或使用相机拍照)
2018/08/22 Javascript
checkbox在vue中的用法小结
2018/11/13 Javascript
使用webpack构建应用的方法步骤
2019/03/04 Javascript
浅析vue-router实现原理及两种模式
2020/02/11 Javascript
Vue组件间的通信pubsub-js实现步骤解析
2020/03/11 Javascript
浏览器JavaScript调试功能无法使用解决方案
2020/09/18 Javascript
Python实现字符串反转的常用方法分析【4种方法】
2017/09/30 Python
基于Python实现的ID3决策树功能示例
2018/01/02 Python
Python通用循环的构造方法实例分析
2018/12/19 Python
python+openCV调用摄像头拍摄和处理图片的实现
2019/08/06 Python
Python字典添加,删除,查询等相关操作方法详解
2020/02/07 Python
Python高并发和多线程有什么关系
2020/11/14 Python
ghd澳大利亚官方网站:英国最受欢迎的美发工具品牌
2018/05/21 全球购物
美国第二大连锁药店:Rite Aid
2019/04/03 全球购物
会计专业自我鉴定范文
2013/10/06 职场文书
诉讼授权委托书范本
2014/10/05 职场文书
云冈石窟导游词
2015/02/04 职场文书
统计员岗位职责
2015/02/11 职场文书
民事起诉书范本
2015/05/19 职场文书
幼儿园家长反馈意见
2015/06/03 职场文书
安全教育培训制度
2015/08/06 职场文书
2015年六年级班主任工作总结
2015/10/15 职场文书
初中政治教学反思
2016/02/23 职场文书
创业计划书之餐饮
2019/09/02 职场文书
2019年共青团工作条例最新版
2019/11/12 职场文书
nginx反向代理配置去除前缀案例教程
2021/07/26 Servers
MySQL 计算连续登录天数
2022/05/11 MySQL
MySQL如何修改字段类型和字段长度
2022/06/10 MySQL