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 相关文章推荐
Jquery实现侧边栏跟随滚动条固定(兼容IE6)
Apr 02 Javascript
JS通过ajax动态读取xml文件内容的方法
Mar 24 Javascript
jQuery实现TAB选项卡切换特效简单演示
Mar 04 Javascript
jQ处理xml文件和xml字符串的方法(详解)
Nov 22 Javascript
Angular实现跨域(搜索框的下拉列表)
Feb 16 Javascript
jQuery插件HighCharts绘制的基本折线图效果示例【附demo源码下载】
Mar 07 Javascript
AngularJs每天学习之总体介绍
Aug 07 Javascript
解决select2在bootstrap modal中不能正常使用的问题
Aug 09 Javascript
详解关于Vue版本不匹配问题(Vue packages version mismatch)
Sep 17 Javascript
vue中tab选项卡的实现思路
Nov 25 Javascript
使用puppeteer爬取网站并抓出404无效链接
Dec 20 Javascript
微信小程序换肤功能实现代码(思路详解)
Aug 25 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提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
2014/08/28 PHP
thinkphp循环结构用法实例
2014/11/24 PHP
php实现图片添加描边字和马赛克的方法
2014/12/10 PHP
php+ajax实现商品对比功能示例
2019/04/13 PHP
jquery 插件 人性化的消息显示
2008/01/21 Javascript
Javascript 遮罩层和加载效果代码
2013/08/01 Javascript
JS JQUERY实现滚动条自动滚到底的方法
2015/01/09 Javascript
javascript三元运算符用法实例
2015/04/16 Javascript
js类式继承与原型式继承详解
2016/04/07 Javascript
jQuery使用中可能被XSS攻击的一些危险环节提醒
2016/05/24 Javascript
jquery-mobile表单的创建方法详解
2016/11/23 Javascript
bootstrap模态框消失问题的解决方法
2016/12/02 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
vue-music关于Player播放器组件详解
2017/11/28 Javascript
Vue axios设置访问基础路径方法
2018/09/19 Javascript
vue的列表交错过渡实现代码示例
2019/05/05 Javascript
微信小程序实现日期格式化和倒计时
2020/11/01 Javascript
vue webpack build资源相对路径的问题及解决方法
2020/06/04 Javascript
如何在selenium中使用js实现定位
2020/08/18 Javascript
vue中使用echarts的示例
2021/01/03 Vue.js
Python中用Descriptor实现类级属性(Property)详解
2014/09/18 Python
Python利用递归和walk()遍历目录文件的方法示例
2017/07/14 Python
Python中xrange与yield的用法实例分析
2017/12/26 Python
tensorflow实现KNN识别MNIST
2018/03/12 Python
pandas 使用apply同时处理两列数据的方法
2018/04/20 Python
django rest framework vue 实现用户登录详解
2019/07/29 Python
python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py
2019/10/06 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
2021/03/02 Python
草船借箭教学反思
2014/02/03 职场文书
社区健康教育实施方案
2014/03/18 职场文书
党员“四风”方面存在问题及整改措施
2014/09/24 职场文书
初三语文教学计划
2015/01/22 职场文书
销售会议开幕词
2015/01/28 职场文书
入党转正申请自我鉴定
2019/06/25 职场文书
JavaScript实现贪吃蛇游戏
2021/06/16 Javascript