JavaScript 动态创建VML的方法
作者:bea
要使用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标签搞成下面这个样子: <h
要使用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";//最后必须把命名空间当作类名加上
//最后必须把命名空间当作类名加上
有用 | 无用
代码如下:
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 定义function的三种方式小结
- JavaScript 函数式编程的原理
- 实现JavaScript中继承的三种方式
- 显示js对象所有属性和方法的函数
- 半角全角相互转换的js函数
- JavaScript 三种创建对象的方法
- JQuery困惑—包装集 DOM节点
- JavaScript 对象成员的可见性说明
- js 获取网络图片的高度和宽度的实现方法(变通了下)
- Javascript 圆角div的实现代码
- IE Firefox 使用自定义标签的区别
- JavaScript 基础知识 被自己遗忘的
- javascript 操作cookies及正确使用cookies的属性
- 滑动门式菜单 实现代码
- javascript 线性渐变三
- javascript 线性渐变二
- javascript线性渐变一
- JavaScript Array扩展实现代码