虽然VML已经过气了,但有时我还不得不使用它,下面是我收集或研究得到的一些东西。
判定一个元素是否为VML元素
function isVML(el) { if (el && el.nodeType === 1) { var nodeName = el.nameName //VML元素的nodeName都是小写,并且存在命名空间,并且outerText总为空 return nodeName.toLowerCase() === nodeName && node.scopeName && node.outerText === "" } return false }
相对应判定一个SVG元素就简单多了
function isSVG(el) { return el && el.nodeType === 1 && (el instanceof window.SVGElement) }
判定浏览器是否支持SVG或VML
function supportsVml() { if (typeof supportsVml.supported == "undefined") { var a = document.body.appendChild(document.createElement(‘div‘)); a.innerHTML = ‘‘; var b = a.firstChild; b.style.behavior = "url(#default#VML)"; supportsVml.supported = b ? typeof b.adj == "object": true; a.parentNode.removeChild(a); } return supportsVml.supported } function supportsSvg() { return document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Shape", "1.0") }
VML的一级标签
shape, line, polyline, rect, roundrect, oval, arc, curve,background, image, shapetype, group
VML的二级标签
fill, stroke, shadow, extrusion, textbox, imagedata, textpath
IE8标准模式下VML不能显示问题可参见这里
IE下复制VML元素时,遗漏了它的某些属性见这里
//下面代码是从我的avalon抠出来的,结合了jQuery对cloneNode方法的修正以及我对VML元素的处理 function fixCloneNode(src) { var target = src.cloneNode(true) if (window.VBArray) {//只处理IE var srcAll = getAll(src) var destAll = getAll(target) for (var k = 0, src; src = srcAll[k]; k++) { if (src.nodeType === 1) { var nodeName = src.nodeName var dest = destAll[k] if (nodeName === "INPUT" && /radio|checkbox/.test(src.type)) { dest.defaultChecked = dest.checked = src.checked if (dest.value !== src.value) { dest.value = src.value//IE67复制后,value从on变成"" } } else if (nodeName === "OBJECT") { if (dest.parentNode) {//IE6-10拷贝子孙元素失败了 dest.outerHTML = src.outerHTML } } else if (nodeName === "OPTION") { dest.defaultSelected = dest.selected = src.defaultSelected } else if (nodeName === "INPUT" || nodeName === "TEXTAREA") { dest.defaultValue = src.defaultValue } else if (nodeName.toLowerCase() === nodeName && src.scopeName && src.outerText === "") { //src.tagUrn === "urn:schemas-microsoft-com:vml"//判定是否为VML元素 var props = {}//处理VML元素 src.outerHTML.replace(/\s*=\s*/g, "=").replace(/(\w+)="([^"]+)"/g, function(a, prop, val) { props[prop] = val }).replace(/(\w+)=‘([^‘]+)‘/g, function(a, prop, val) { props[prop] = val }) dest.outerHTML.replace(/\s*=\s*/g, "=").replace(/(\w+)="/g, function(a, prop) { delete props[prop] }).replace(/(\w+)=‘/g, function(a, prop) { delete props[prop] }) delete props.urn delete props.implementation for (var i in props) { dest.setAttribute(i, props[i]) } fixVML(dest) } } } } return target } function fixVML(node) { if (node.currentStyle.behavior !== "url(#default#VML)") { node.style.behavior = "url(#default#VML)" node.style.display = "inline-block" node.style.zoom = 1 //hasLayout } }
时间: 2024-10-26 15:19:48