【问题标题】:Obtain original style names using DOM's element.style使用 DOM 的 element.style 获取原始样式名称
【发布时间】:2011-12-12 14:15:11
【问题描述】:

在回答这个问题DOM parser: remove certain attributes only 时,我注意到一些属性在element.style 属性中进行了扩展和转换。例如:

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

这个 div 的 style 包含一个属性,font-weight,正如人们所期望的那样。然而:

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

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

只有获取原始font-decoration才能自己解析style属性,还是有更好的方法?我应该自己解析它,还是有一个“标准”的方式来做这个?

【问题讨论】:

  • 我觉得没办法解决这个问题,firefox 自己加了规则,如果你在 safari 中测试它也会有。

标签: javascript dom


【解决方案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')) + ']';

【讨论】:

  • 换句话说,“不,没有比自己解析更好的方法了”。感谢您发布代码,尽管在它真正可用之前,它还需要将样式属性解析为组件。这是一个巨大的耻辱,因为浏览器已经测试了这样做的代码。
【解决方案2】:

好吧,我对此进行了更多研究,并找到了一种更好的方法来满足您的要求。只需使用以下命令即可获得 HTML 中定义的样式:

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

这在 FF、Chrome 和 IE 中运行良好(仅在 IE9 中测试)。

【讨论】:

  • 是的,必须手动解析。 'parsed' 对象的浏览器版本(即 obj.style)将仅包含从 HTML 传入的特定于浏览器的样式版本(即仅适用于该特定浏览器的那些变体)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
  • 2014-07-26
  • 2022-10-15
相关资源
最近更新 更多