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 相关文章推荐
Javascript学习笔记8 用JSON做原型
Jan 11 Javascript
JavaScript中使用Substring删除字符串最后一个字符
Nov 03 Javascript
javascript静态页面传值的三种方法分享
Nov 12 Javascript
jquery中 $.expr使用实例介绍
Jun 09 Javascript
javascript页面倒计时实例
Jul 25 Javascript
jQuery实现磁力图片跟随效果完整示例
Sep 16 Javascript
JavaScript ES6中CLASS的使用详解
Nov 22 Javascript
jquery动态添加以及遍历option并获取特定样式名称的option方法
Jan 29 jQuery
在vue中v-bind使用三目运算符绑定class的实例
Sep 29 Javascript
angularJs中$scope数据序列化的实例
Sep 30 Javascript
vue项目或网页上实现文字转换成语音播放功能
Jun 09 Javascript
Threejs实现滴滴官网首页地球动画功能
Jul 13 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
跟我学Laravel之配置Laravel
2014/10/15 PHP
php计算指定目录下文件占用空间的方法
2015/03/13 PHP
PHP基于SMTP协议实现邮件发送实例代码
2017/04/27 PHP
在thinkphp5.0路径中实现去除index.php的方式
2019/10/16 PHP
jQuery实现表单input中提示文字value随鼠标焦点移进移出而显示或隐藏的代码
2010/03/21 Javascript
基于jquery的checkbox下拉框插件代码
2010/06/25 Javascript
你的 mixin 真的兼容 ECMAScript 5 吗?
2013/04/11 Javascript
用Jquery选择器计算table中的某一列某一行的合计
2014/08/13 Javascript
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
javascript对象的创建和访问
2016/03/08 Javascript
基于javascript bootstrap实现生日日期联动选择
2016/04/07 Javascript
Vue项目中quill-editor带样式编辑器的使用方法
2017/08/08 Javascript
开发Vue树形组件的示例代码
2017/12/21 Javascript
VUE搭建手机商城心得和遇到的坑
2019/02/21 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
2019/12/21 Javascript
vue-cli3单页构建大型项目方案
2020/04/07 Javascript
微信小程序实现滑动操作代码
2020/04/23 Javascript
Python中http请求方法库汇总
2016/01/06 Python
python list删除元素时要注意的坑点分享
2018/04/18 Python
Python 从subprocess运行的子进程中实时获取输出的例子
2019/08/14 Python
40个你可能不知道的Python技巧附代码
2020/01/29 Python
微信小程序之html5 canvas绘图并保存到系统相册
2019/06/20 HTML / CSS
海信商城:海信电视、科龙空调、容声冰箱官方专卖
2017/02/07 全球购物
大都会艺术博物馆商店:The Met Store
2018/06/22 全球购物
享受加州生活方式的时尚舒适:XCVI
2018/07/09 全球购物
Lime Crime官网:美国一家主打梦幻精灵系的彩妆品牌
2019/03/22 全球购物
日本必酷网络直营店:Biccamera
2019/03/23 全球购物
英国的一家创新礼品和小工具零售商:Menkind
2019/08/24 全球购物
vue 中 get / delete 传递数组参数方法
2021/03/23 Vue.js
气象学专业个人求职信
2014/03/15 职场文书
团结就是力量演讲稿
2014/05/21 职场文书
巾帼文明岗汇报材料
2014/12/24 职场文书
海上钢琴师的观后感
2015/06/11 职场文书
2015年信息化建设工作总结
2015/07/23 职场文书
运动会致辞稿
2015/07/29 职场文书
2015小学新教师个人工作总结
2015/10/14 职场文书