2011-10-21 66 views
2

在回答此问题时DOM parser: remove certain attributes only我注意到一些属性在element.style属性中展开并转换。例如:使用DOM元素获取原始样式名称。样式

<div style="font-weight: bold"></div> 

这个div的style包含一个属性,font-weight,正如人们所预料。但是:

<div style="font-decoration: underline"></div> 

对于这个div的style属性,在Firefox中,包含四个属性:-moz-text-blink-moz-text-decoration-color-moz-text-decoration-line-moz-text-decoration-style

是获得原始font-decoration来解析style属性的唯一方法吗?或者有更好的方法吗?我是否应该自己解析它,还是有一个“标准”的方式来做到这一点?

+0

我觉得没有办法处理这个,Firefox添加自己的规则,如果你在safari中测试它也会有这些。 – Pluda

回答

0

嗯,我做了一些更多的研究,找到了更好的解决方案。您可以通过以下方式获得HTML中定义的样式:

if(document.getElementById('foo').attributes['style'])  
    style = document.getElementById('foo').attributes['style'].value; 

这适用于FF,Chrome和IE(仅在IE9中测试过)。

+0

因此,“样式”属性仍然需要手动解析为组件... –

+0

是的,这将不得不手动解析。 'parsed'对象的浏览器版本(即obj.style)将只包含从HTML传入的样式的浏览器特定版本(即只包含那些在特定浏览器中工作的变体)。 – techfoobar

1

您可以使用元素(see this question for a discussion on outerHTML)的outerHTML财产并解析它的样式值:

检查此琴:http://jsfiddle.net/DRx88/

全码:

function outerHTML(node){ 
    return node.outerHTML || new XMLSerializer().serializeToString(node); 
} 
function trimString(s) { 
    var l = 0, r = s.length - 1; 
    while(l < s.length && s[l] == ' ') l++; 
    while(r > l && s[r] == ' ') r -= 1; 
    return s.substring(l, r + 1); 
} 
function getStyleAsInHTML(node) { 
    var parts, part, sIndex = -1, i, style = '', delim; 
    parts = outerHTML(node); 
    parts = parts.replace(/\s/g," "); 
    parts = parts.split('='); 

    for(i=0; i<parts.length; i++) { 
    part = trimString(parts[i]); 
    if(part.length >= 5 && part.substring(part.length-5).toLowerCase()=='style') { 
     sIndex = i+1; 
     break; 
    } 
    } 
    if(sIndex!=-1 && sIndex<parts.length) { 
    style = parts[sIndex]; 
    delim = style.charAt(0); 
    for(i=style.length-1; i>0; i--) { 
     if(style.charAt(i)==delim) { 
     style = style.substring(1, i); 
     break; 
     } 
    } 
    } 
    return style; 
} 
document.getElementById('result').innerHTML = 'Style as in HTML [' + getStyleAsInHTML(document.getElementById('d2')) + ']'; 
+0

换句话说,“不,自己解析它没有更好的办法”。感谢您发布代码,但在它真正可用之前,它还需要将style属性解析为组件。这是一个巨大的耻辱,因为浏览器已经测试了完成该操作的代码。 –