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 相关文章推荐
JQuery文本框高亮显示插件代码
Apr 02 Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
Apr 16 Javascript
浅谈JavaScript中的string拥有方法的原因
Aug 28 Javascript
30分钟快速掌握Bootstrap框架
May 24 Javascript
AngularJS基础 ng-srcset 指令简单示例
Aug 03 Javascript
jQuery插件echarts去掉垂直网格线用法示例
Mar 03 Javascript
AngularJS实现的2048小游戏功能【附源码下载】
Jan 03 Javascript
在Vue中使用highCharts绘制3d饼图的方法
Feb 08 Javascript
从零开始实现Vue简单的Toast插件
Dec 03 Javascript
vue中轮训器的使用
Jan 27 Javascript
JavaScript实现预览本地上传图片功能完整示例
Mar 08 Javascript
node.js ws模块搭建websocket服务端的方法示例
Apr 25 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 短链接算法收集与分析
2011/12/30 PHP
探讨捕获php错误信息方法的详解
2013/06/09 PHP
thinkphp3.2.2前后台公用类架构问题分析
2014/11/25 PHP
php开发微信支付获取用户地址
2015/10/04 PHP
微信支付开发告警通知实例
2016/07/12 PHP
Javascript与vbscript数据共享
2007/01/09 Javascript
Add Formatted Text to a Word Document
2007/06/15 Javascript
Javascript入门学习资料收集整理篇
2008/07/06 Javascript
Prototype Object对象 学习
2009/07/12 Javascript
JavaScript中的异常捕捉介绍
2014/12/31 Javascript
浅谈jQuery中的事件
2015/03/23 Javascript
iframe里使用JavaScript控制主页转向的方法
2015/04/03 Javascript
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
BootStrap无限级分类(无限极分类封装版)
2016/08/26 Javascript
Vue.js仿微信聊天窗口展示组件功能
2017/08/11 Javascript
JavaScript enum枚举类型定义及使用方法
2020/05/15 Javascript
uniapp实现可滑动选项卡
2020/10/21 Javascript
[04:27]2014DOTA2国际邀请赛 NAVI战队官方纪录片
2014/07/21 DOTA
python使用cookielib库示例分享
2014/03/03 Python
Python中处理时间的几种方法小结
2015/04/09 Python
python实现从网络下载文件并获得文件大小及类型的方法
2015/04/28 Python
python中尾递归用法实例详解
2015/04/28 Python
Python中Numpy mat的使用详解
2019/05/24 Python
python获取百度热榜链接的实例方法
2020/08/25 Python
CSS3控制HTML元素动画效果
2014/02/08 HTML / CSS
几个CSS3的flex弹性盒模型布局的简单例子演示
2016/05/12 HTML / CSS
Jeep牧马人、切诺基和自由人零配件:4 Wheel Drive Hardware
2017/07/02 全球购物
印度化妆品购物网站:Nykaa
2018/07/22 全球购物
创联软件面试题笔试题
2012/10/07 面试题
廉洁自律个人总结
2015/02/14 职场文书
2016新年慰问信范文
2015/03/25 职场文书
教你使用Python pypinyin库实现汉字转拼音
2021/05/27 Python
Python如何识别银行卡卡号?
2021/06/10 Python
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis
漫画「狩龙人拉格纳」公开TV动画预告图
2022/03/22 日漫
Android自定义ScrollView实现阻尼回弹
2022/04/01 Java/Android