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和JQUERY获取页面大小,滚动条位置,元素位置(示例代码)
Dec 14 Javascript
为jquery的ajaxfileupload增加附加参数的方法
Mar 04 Javascript
基于jQuery实现文本框缩放以及上下移动功能
Nov 24 Javascript
JS在onclientclick里如何控制onclick的执行
May 30 Javascript
jQuery插件dataTables添加序号列的方法
Jul 06 Javascript
微信小程序如何获知用户运行小程序的场景教程
May 17 Javascript
Angularjs中使用轮播图指令swiper
May 30 Javascript
看看“疫苗查询”小程序有温度的代码
Jul 31 Javascript
解决vue 引入子组件报错的问题
Sep 06 Javascript
Vue 后台管理类项目兼容IE9+的方法示例
Feb 20 Javascript
微信小程序tabBar 返回tabBar不刷新页面
Jul 25 Javascript
vue-autoui自匹配webapi的UI控件的实现
Mar 20 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
Smarty模板学习笔记之Smarty简介
2014/05/20 PHP
调试PHP程序的多种方法介绍
2014/11/06 PHP
php实现通用的从数据库表读取数据到数组的函数实例
2015/03/21 PHP
php获取英文姓名首字母的方法
2015/07/13 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
tp5.1 框架join方法用法实例分析
2020/05/26 PHP
javascript add event remove event
2008/04/07 Javascript
javascript自适应宽度的瀑布流实现思路
2013/02/20 Javascript
jquery中选择块并改变属性值的方法
2013/07/31 Javascript
BootStrap中Datetimepicker和uploadify插件应用实例小结
2016/05/26 Javascript
JavaScript提高加载和执行效率的方法
2017/02/03 Javascript
自定义PC微信扫码登录样式写法
2017/12/12 Javascript
代码详解Vuejs响应式原理
2017/12/20 Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
2017/12/22 Javascript
JS简单获得节点元素的方法示例
2018/02/10 Javascript
vue项目中使用lib-flexible解决移动端适配的问题解决
2018/08/23 Javascript
Layui table field初始化加载时进行隐藏的方法
2019/09/19 Javascript
Python正则表达式匹配ip地址实例
2014/10/09 Python
详解python 发送邮件实例代码
2016/12/22 Python
使用memory_profiler监测python代码运行时内存消耗方法
2018/12/03 Python
对python中词典的values值的修改或新增KEY详解
2019/01/20 Python
大家都说好用的Python命令行库click的使用
2019/11/07 Python
Visual Studio Code搭建django项目的方法步骤
2020/09/17 Python
python 实现数据库中数据添加、查询与更新的示例代码
2020/12/07 Python
pycharm 如何取消连按两下shift出现的全局搜索
2021/01/15 Python
html5 button autofocus 属性介绍及应用
2013/01/04 HTML / CSS
香港化妆品经销商:我的公主
2016/08/05 全球购物
企业统计员岗位职责
2013/12/13 职场文书
幼儿园运动会加油词
2014/02/14 职场文书
坚定理想信念心得体会
2014/03/11 职场文书
幼儿园六一亲子活动方案
2014/08/26 职场文书
2015大学自主招生自荐信范文
2015/03/04 职场文书
考生诚信考试承诺书
2015/04/29 职场文书
法律服务所工作总结
2015/08/10 职场文书
教师素质教育心得体会
2016/01/19 职场文书