получить вычисленный цвет фона как rgb в IE - PullRequest
2 голосов
/ 16 марта 2010

Я пытаюсь получить цвет фона RGB в IE, используя следующий код:

function getStyle(elem, name) {
    // J/S Pro Techniques p136
    if (elem.style[name]) {
        return elem.style[name];
    } else if (elem.currentStyle) {
        return elem.currentStyle[name];
    }
    else if (document.defaultView && document.defaultView.getComputedStyle) {
        name = name.replace(/([A-Z])/g, "-$1");
        name = name.toLowerCase();
        s = document.defaultView.getComputedStyle(elem, "");
        return s && s.getPropertyValue(name);
    } else {
        return null;
    }
}

var $b = $("<button>");
$b.css("backgroundColor", "ButtonFace");
$("body").append($b);
alert("button bg color is: "+ getStyle($b[0],"backgroundColor"));
//alerts 'buttonface'

это не возвращает значение цвета rgb, как Firefox, оно возвращает 'buttonface', что для меня бесполезно.

1 Ответ

5 голосов
/ 16 марта 2010

Я работал над кросс-браузерной реализацией функции getStyle, Моя функция еще не завершена, но я могу помочь вам решить эту конкретную проблему с IE.

Для вычисленных backgroundColor я использую хак, предложенный на этой странице, он использует специфичный для IE метод queryCommandValue, чтобы получить BackColor выбора.

О реализации, которую вы публикуете, я бы рекомендовал сначала проверить, существует ли стандартный метод getComputedStyle через document.defaultView, потому что некоторые браузеры, такие как Opera, предоставляют специфичный для IE объект currentStyle для совместимости.

Итак, я изменил вашу функцию и включил IE взломать :

function getStyle(elem, name) {
  if (document.defaultView && document.defaultView.getComputedStyle) {
    name = name.replace(/([A-Z])/g, "-$1");
    name = name.toLowerCase();
    s = document.defaultView.getComputedStyle(elem, "");
    return s && s.getPropertyValue(name);
  } else if (elem.currentStyle) {
    if (/backgroundcolor/i.test(name)) {
      return (function (el) { // get a rgb based color on IE
        var oRG=document.body.createTextRange();
        oRG.moveToElementText(el);
        var iClr=oRG.queryCommandValue("BackColor");
          return "rgb("+(iClr & 0xFF)+","+((iClr & 0xFF00)>>8)+","+
                      ((iClr & 0xFF0000)>>16)+")";
      })(elem);
    }

    return elem.currentStyle[name];
  } else if (elem.style[name]) {
    return elem.style[name];
  } else  {
    return null;
  }
}

Надеюсь, скоро я опубликую более общую реализацию, но этого будет достаточно для решения вашей backgorundColor проблемы.

Вы можете проверить вышеуказанную функцию здесь .

...