我有一个代码:
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
问题出在哪里?
答案 0 :(得分:2)
您没有说明您在IE中实际得到的结果< 9(你认为失败的一些示例输入和结果字符串会特别有用)所以我所能做的只是猜测:
您正在使用parseInt()
,并且在IE9中更改了parseInt()
的实现。 (实际上,它在ECMAScript5中发生了变化,但在版本9之前IE还没有赶上它。)
如此处所示: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值不包含前导零,那么,您如何更新问题以包含所有信息?
答案 1 :(得分:0)
我有一个更快更通用的解决方案:)你可以打电话:
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"