код regex не работает в Internet Explorer - PullRequest
1 голос
/ 02 января 2012

у меня есть такой код:

    function rgb2hex(rgb) {
        rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
        function hex(x) {
            return ("0" + parseInt(x).toString(16)).slice(-2);
        }
        return hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
    }

он просто получает код rgb и преобразует его в шестнадцатеричный код.Он работает во всех браузерах (также в IE9), но не в IE7 или IE8

В чем проблема?

Ответы [ 2 ]

2 голосов
/ 02 января 2012

Вы не указываете, какие результаты вы фактически получаете в IE <9 (некоторые примеры ввода и строки результатов, которые вы считаете неудачными, были бы особенно полезны), поэтому все, что я могу сделать, это сделать предположение: </p>

Вы используете parseInt(), а реализация parseInt() изменена в IE9. (На самом деле, это изменилось в ECMAScript5, но IE не догонял это до версии 9.)

Как указано здесь: http://msdn.microsoft.com/en-us/library/windows/apps/x53yedee(v=vs.94).aspx

Начиная со стандартного режима Internet Explorer 9, функция parseInt не обрабатывает строку с префиксом «0» как восьмеричную.

Очевидно, это означает, что если ваши значения rgb содержат начальные нули, вы получите разные результаты в зависимости от версии браузера. Предположительно, вы хотите рассматривать числа как основание 10; это легко исправить, изменив функцию hex():

return ("0" + parseInt(x, 10).toString(16)).slice(-2);
// add radix here --------^

Если ваши значения rgb не содержат начальных нулей, как насчет того, чтобы обновить свой вопрос, включив в него всю информацию?

0 голосов
/ 02 января 2012

У меня есть более быстрое и универсальное решение:)

function rgb2hex(rgb) {
      rgb = [].slice.call(arguments).join(",").match(/\d+/g);
      var hex,l;
      l=( hex = ( (rgb[0] << 16 ) + ( rgb[1] << 8 ) + +rgb[2] ).toString(16) ).length;
         while( l++ < 6 )
             hex="0"+hex
      return hex;
    }

Вы можете звонить с:

rgb2hex( "rgb(0,0,255)" ); // "0000ff"
rgb2hex( "55,32,255" ); // "3720ff"
rgb2hex( 255, 30, 40 ); // "ff1e28"

И

function hexToRgb( hex ) {

    var rgb = parseInt( hex.match(/[a-f\d]{6}/gi), 16);

       return[
           ( rgb >> 16 ) & 255,
           ( rgb >> 8 ) & 255,
           rgb & 255
       ]
}

hexToRgb( "#ffffff" ); // [ 255, 255, 255 ]
hexToRgb( "ffffff" ); // [ 255, 255, 255 ]

демо: http://jsfiddle.net/Ld5Gs/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...