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 相关文章推荐
共享自己写一个框架DreamScript
Jan 20 Javascript
JS.GetAllChild(element,deep,condition)使用介绍
Sep 21 Javascript
IE浏览器不支持getElementsByClassName的解决方法
Aug 27 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
Dec 29 Javascript
javaScript如何跳出多重循环break、continue
Sep 01 Javascript
使用jquery.qrcode.js生成二维码插件
Oct 17 Javascript
浅谈JS读取DOM对象(标签)的自定义属性
Nov 21 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
Dec 14 Javascript
bootstrap table 数据表格行内修改的实现代码
Feb 13 Javascript
详解vue-cli + webpack 多页面实例应用
Apr 25 Javascript
使用Electron构建React+Webpack桌面应用的方法
Dec 15 Javascript
JS获取表格视图所选行号的ids过程解析
Feb 21 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/04/18 PHP
php计算一个文件大小的方法
2015/03/30 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
2017/02/15 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
2017/02/20 PHP
JavaScript DOM 学习第三章 内容表格
2010/02/19 Javascript
拖动布局之保存布局页面cookies篇
2010/10/29 Javascript
关于ExtJS4.1:快捷键支持的问题
2013/04/24 Javascript
一个JavaScript变量声明的知识点
2013/10/28 Javascript
javascript event在FF和IE的兼容传参心得(绝对好用)
2014/07/10 Javascript
浅谈JS正则表达式的RegExp对象和括号的使用
2016/07/28 Javascript
手机端实现Bootstrap简单图片轮播效果
2016/10/13 Javascript
使用Ajax与服务器(JSON)通信实例
2016/11/04 Javascript
关于不同页面之间实现参数传递的几种方式讨论
2017/02/13 Javascript
JavaScript实现的简单加密解密操作示例
2018/06/01 Javascript
[02:41]DOTA2亚洲邀请赛小组赛第三日 赛事回顾
2015/02/01 DOTA
python中使用OpenCV进行人脸检测的例子
2014/04/18 Python
Python 3.x 新特性及10大变化
2015/06/12 Python
Python实现的多线程http压力测试代码
2017/02/08 Python
python 如何快速找出两个电子表中数据的差异
2017/05/26 Python
python库lxml在linux和WIN系统下的安装
2018/06/24 Python
python requests 测试代理ip是否生效
2018/07/25 Python
pycharm运行出现ImportError:No module named的解决方法
2018/10/13 Python
Django csrf 两种方法设置form的实例
2019/02/03 Python
Python为何不支持switch语句原理详解
2020/10/21 Python
高校毕业生自我鉴定
2013/10/27 职场文书
创业计划书中要认真思考的问题
2013/12/28 职场文书
市场营销职业生涯规划书范文
2014/01/12 职场文书
教师节促销活动方案
2014/02/14 职场文书
酒店总经理职务说明书
2014/02/26 职场文书
军训教官感言
2014/03/02 职场文书
消防安全员岗位职责
2014/03/10 职场文书
2014党员学习习主席讲话思想汇报
2014/09/15 职场文书
2014购房个人委托书范本
2014/10/12 职场文书
重阳节慰问信
2015/02/15 职场文书
Alexa停服!网站排名将何去何从?目前还没有替代品。
2022/04/15 杂记
CSS中float高度塌陷问题的四种解决方案
2022/04/18 HTML / CSS