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编程起步(第二课)
Jan 10 Javascript
基于jquery的代码显示区域自动拉长效果
Dec 07 Javascript
JS实现多物体缓冲运动实例代码
Nov 29 Javascript
js快速排序的实现代码
Dec 08 Javascript
js去除输入框中所有的空格和禁止输入空格的方法
Jun 09 Javascript
JS+CSS实现带关闭按钮DIV弹出窗口的方法
Feb 27 Javascript
Jquery网页内滑动缓冲导航的实现代码
Apr 05 Javascript
jQuery随手笔记之常用的jQuery操作DOM事件
Nov 29 Javascript
JavaScript中cookie工具函数封装的示例代码
Oct 11 Javascript
JavaScript中闭包的详解
Apr 01 Javascript
vue仿淘宝订单状态的tab切换效果
Jun 23 Javascript
Element Input输入框的使用方法
Jul 26 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模板技术原理【一】
2008/01/10 PHP
PHP实现阿里大鱼短信验证的实例代码
2017/07/10 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
2018/06/13 PHP
用js+xml自动生成表格的东西
2006/12/21 Javascript
基于jQuery的输入框在光标位置插入内容, 并选中
2011/10/29 Javascript
JS获取整个页面文档的实现代码
2011/12/15 Javascript
jquery子元素过滤选择器使用示例
2013/06/24 Javascript
jquery提交form表单时禁止重复提交的方法
2014/02/13 Javascript
如何防止回车(enter)键提交表单
2014/05/11 Javascript
javascript强制点击广告的方法
2015/02/06 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
2015/02/20 Javascript
javascript字符串与数组转换汇总
2015/05/26 Javascript
开启BootStrap学习之旅
2016/05/04 Javascript
JavaScript程序中的流程控制语句用法总结
2016/05/23 Javascript
Bootstrap3.0学习教程之JS折叠插件
2016/05/27 Javascript
JS冒泡事件与事件捕获实例详解
2016/11/25 Javascript
nodejs基于WS模块实现WebSocket聊天功能的方法
2018/01/12 NodeJs
vue.js将时间戳转化为日期格式的实现代码
2018/06/05 Javascript
浅谈Vue.use的使用
2018/08/29 Javascript
使用Javascript简单计算器
2018/11/17 Javascript
基于js Canvas实现二次贝塞尔曲线
2018/12/25 Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
2019/05/30 Javascript
微信公众号生成新浪短网址的实现(快速生成)
2019/08/18 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
2019/10/10 jQuery
解决removeEventListener 无法清除监听的问题
2020/10/30 Javascript
讲解Python中的递归函数
2015/04/27 Python
Python数据结构与算法之二叉树结构定义与遍历方法详解
2017/12/12 Python
利用Python将数值型特征进行离散化操作的方法
2018/11/06 Python
python3 map函数和filter函数详解
2019/08/26 Python
在canvas上实现元素图片镜像翻转动画效果的方法
2018/03/20 HTML / CSS
美国高端婴童品牌:Hanna Andersson
2016/10/30 全球购物
当当网官方旗舰店:中国图书销售夺金品牌
2018/04/02 全球购物
香蕉共和国加拿大官网:Banana Republic加拿大
2018/08/06 全球购物
联片教研活动总结
2014/07/01 职场文书
党员个人对照检查材料范文
2014/09/24 职场文书
导游词之蜀山胜景瓦屋山
2019/11/29 职场文书