JavaScript 動(dòng)態(tài)創(chuàng)建VML的方法
要使用VML,我們首先要開(kāi)辟一個(gè)命名空間。以前動(dòng)態(tài)創(chuàng)建比較麻煩
document.namespaces.add('vml', 'urn:schemas-microsoft-com:vml', "#default#VML");
ie8出現(xiàn)后,微軟一口氣升級(jí)了IE6,IE7。創(chuàng)建方法更簡(jiǎn)單。
document.namespaces.add('vml', 'urn:schemas-microsoft-com:vml');
它們的作用相當(dāng)于把HTML標(biāo)簽搞成下面這個(gè)樣子:
<html xmlns:vml="urn:schemas-microsoft-com:vml">
接著就是在樣式中調(diào)用對(duì)應(yīng)的CSS hehavior。靜態(tài)代碼應(yīng)該是這個(gè)樣子:
<style type="text/css">
vml\:* { behavior: url(#default#VML) }
</style>
網(wǎng)上風(fēng)傳IE8對(duì)VML支持不友好,要放棄VML云云,主要原因在于“vml\:*”這個(gè)選擇器被IE8認(rèn)為不合法(反面證明IE在努力修正其 CSS bug)。由此,人們被迫利用v\:line, v\:rect, v\:roundrect, v\:oval這樣子的聯(lián)合選擇器來(lái)調(diào)用相關(guān)的CSS hehavior。不過(guò)只要是合法選擇器就可以調(diào)用CSS hehavior,因此這里用聯(lián)合選擇器實(shí)在太累贅了。我想換類(lèi)選擇器是否更合適點(diǎn)呢?試驗(yàn)一下,是無(wú)問(wèn)題的。但僅僅是這樣是渲染不出來(lái)的,由于IE8已 經(jīng)重寫(xiě)了內(nèi)核,因此此bug不是hasLayout可以解決的。官方給出答案是使用display:inline-block,這樣就可以強(qiáng)逼它繼續(xù)渲染了。后來(lái)我又發(fā)現(xiàn)display:block也有此功效,但考慮到內(nèi)聯(lián)元素的問(wèn)題,還是用官方的補(bǔ)丁吧 。至此,開(kāi)辟命名空與與渲染VML元素的問(wèn)題就告一段落。
再來(lái)看如何動(dòng)態(tài)創(chuàng)建VML元素,由于是非標(biāo)準(zhǔn),我們就用非標(biāo)準(zhǔn)的createElement方式來(lái)創(chuàng)建它。我們需要拼接一個(gè)字符串,作為createElement 的參數(shù),它應(yīng)該包含命名空間與類(lèi)名。
var createVML = function (tagName) {
return doc.createElement('<vml:' + tagName + ' class="vml">');
};
隨便做了一個(gè)小工具,看看后果如何:
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;
}
}
})()
最后附上三種創(chuàng)建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";//最后必須把命名空間當(dāng)作類(lèi)名加上
//最后必須把命名空間當(dāng)作類(lèi)名加上
- JavaScript動(dòng)態(tài)創(chuàng)建div屬性和樣式示例代碼
- javascript 動(dòng)態(tài)創(chuàng)建表格
- javascript動(dòng)態(tài)創(chuàng)建及刪除元素的方法
- JavaScript動(dòng)態(tài)創(chuàng)建link標(biāo)簽到head里的方法
- JavaScript實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建CSS樣式規(guī)則方案
- JavaScript與DOM組合動(dòng)態(tài)創(chuàng)建表格實(shí)例
- javascript轉(zhuǎn)換字符串為dom對(duì)象(字符串動(dòng)態(tài)創(chuàng)建dom)
- javascript 翻頁(yè)測(cè)試頁(yè)(動(dòng)態(tài)創(chuàng)建標(biāo)簽并自動(dòng)翻頁(yè))
- Javascript動(dòng)態(tài)創(chuàng)建div的方法
- javascript 動(dòng)態(tài)創(chuàng)建 Option選項(xiàng)
相關(guān)文章
JS+HTML5 Canvas實(shí)現(xiàn)簡(jiǎn)單的寫(xiě)字板功能示例
這篇文章主要介紹了JS+HTML5 Canvas實(shí)現(xiàn)簡(jiǎn)單的寫(xiě)字板功能,結(jié)合實(shí)例形式分析了js結(jié)合HTML5 canvas特性的圖形繪制相關(guān)操作技巧,需要的朋友可以參考下2018-08-08
下載網(wǎng)站打開(kāi)頁(yè)面后間隔多少時(shí)間才顯示下載鏈接地址的代碼
有時(shí)候可能為了一些更好的廣告效果等原因,需要讓用戶等待一段時(shí)間以后,再顯示真實(shí)下載地址代碼,有利于緩解服務(wù)器壓力。2010-04-04
原生JS實(shí)現(xiàn)非常好看的計(jì)數(shù)器
這篇文章主要為大家詳細(xì)介紹了原生JS實(shí)現(xiàn)非常好看的計(jì)數(shù)器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
BootStrap中關(guān)于Select下拉框選擇觸發(fā)事件及擴(kuò)展
Select下拉框的問(wèn)題,想在選擇一個(gè)選項(xiàng)后,前臺(tái)顯示做出變動(dòng),并且知道選擇的是第幾個(gè)選項(xiàng)。 怎么解決這個(gè)問(wèn)題呢?下面小編給大家?guī)?lái)了BootStrap中關(guān)于Select下拉框選擇觸發(fā)事件及擴(kuò)展,需要的朋友參考下吧2016-11-11
JavaScript toDataURL圖片轉(zhuǎn)換問(wèn)題解讀
這篇文章主要介紹了JavaScript toDataURL圖片轉(zhuǎn)換問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06

