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 相关文章推荐
最新的10款jQuery内容滑块插件分享
Sep 18 Javascript
Javascript表格翻页效果实现思路及代码
Aug 23 Javascript
js的toUpperCase方法用法实例
Jan 27 Javascript
js淡入淡出的图片轮播效果代码分享
Aug 24 Javascript
jQuery中$原理实例分析
Aug 13 jQuery
微信小程序实现留言板(Storage)
Nov 02 Javascript
layui实现三级联动效果
Jul 26 Javascript
JavaScript页面加载事件实例讲解
Sep 01 Javascript
vue循环数组改变点击文字的颜色
Oct 14 Javascript
微信公众号服务器验证Token步骤图解
Dec 30 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
Jan 16 Javascript
vue中改变滚动条样式的方法
Mar 03 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 开发环境配置(Zend Studio)
2010/04/28 PHP
juqery 学习之六 CSS--css、位置、宽高
2011/02/11 Javascript
jQuery EasyUI API 中文文档 - Parser 解析器
2011/09/29 Javascript
suggestion开发小结以及对键盘事件的总结(针对中文输入法状态)
2011/12/20 Javascript
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
动态的创建一个元素createElement及删除一个元素
2014/01/24 Javascript
jquery form 隐藏的input 选择
2014/04/29 Javascript
JavaScript实现LI列表数据绑定的方法
2015/08/04 Javascript
javascript禁止访客复制网页内容的实现代码
2015/08/05 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
2016/05/24 Javascript
jQuery实现侧浮窗与中浮窗切换效果的方法
2016/09/05 Javascript
JavaScript实现图片懒加载(Lazyload)
2016/11/28 Javascript
JS获得一个对象的所有属性和方法实例
2017/02/21 Javascript
基于Vue实例生命周期(全面解析)
2017/08/16 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
基于vue 实现token验证的实例代码
2017/12/14 Javascript
通过实例解析JavaScript for in及for of区别
2020/06/15 Javascript
前端使用crypto.js进行加密的函数代码
2020/08/16 Javascript
javascript贪吃蛇游戏设计与实现
2020/09/17 Javascript
python内存管理分析
2015/04/08 Python
在Python的setuptools框架下生成egg的教程
2015/04/13 Python
利用Python中的mock库对Python代码进行模拟测试
2015/04/16 Python
python分析网页上所有超链接的方法
2015/05/08 Python
pygame实现俄罗斯方块游戏(AI篇1)
2019/10/29 Python
Python基于pygame实现单机版五子棋对战
2019/12/26 Python
Python基于pandas绘制散点图矩阵代码实例
2020/06/04 Python
深入分析python 排序
2020/08/24 Python
改变 Python 中线程执行顺序的方法
2020/09/24 Python
详解如何获取localStorage最大存储大小的方法
2020/05/21 HTML / CSS
Intersport西班牙:在线体育商店
2019/11/06 全球购物
航空大学应届生求职信
2013/11/10 职场文书
销售心得体会
2014/01/02 职场文书
致铅球运动员加油稿
2014/02/13 职场文书
2014三八妇女节活动总结范文四篇
2014/03/09 职场文书
党员十八大心得体会
2014/09/12 职场文书
整改通知书格式
2015/04/22 职场文书