Javascript 验证css颜色名称
我已经编写了一个jQuery插件,它接受css颜色作为一些参数 我想验证它们。如果它只是一个十六进制或rgb值,我可以用正则表达式来验证它,但是如何在不使插件膨胀的情况下验证所有147个有效的颜色名称呢 我想知道是否有某种方法可以尝试应用样式(可能使用jquery),然后在无效时从浏览器中捕获错误 编辑:powtac和Pantelis提出了一个解决方案,但他们都错过了边缘案例,所以我在这里提供了一个完整的解决方案:Javascript 验证css颜色名称,javascript,jquery,css,Javascript,Jquery,Css,我已经编写了一个jQuery插件,它接受css颜色作为一些参数 我想验证它们。如果它只是一个十六进制或rgb值,我可以用正则表达式来验证它,但是如何在不使插件膨胀的情况下验证所有147个有效的颜色名称呢 我想知道是否有某种方法可以尝试应用样式(可能使用jquery),然后在无效时从浏览器中捕获错误 编辑:powtac和Pantelis提出了一个解决方案,但他们都错过了边缘案例,所以我在这里提供了一个完整的解决方案: var validateCssColour = function(colour)
var validateCssColour = function(colour){
var rgb = $('<div style="color:#28e32a">'); // Use a non standard dummy colour to ease checking for edge cases
var valid_rgb = "rgb(40, 227, 42)";
rgb.css("color", colour);
if(rgb.css('color') == valid_rgb && colour != ':#28e32a' && colour.replace(/ /g,"") != valid_rgb.replace(/ /g,""))
return false;
else
return true;
};
var validatecscolour=函数(颜色){
var rgb=$('');//使用非标准虚拟颜色以便于检查边缘情况
var valid_rgb=“rgb(40227,42)”;
rgb.css(“颜色”,颜色);
如果(rgb.css('color')==valid_rgb&&color!=':#28e32a'&&color.replace(//g,“”)!=valid_rgb.replace(//g,“”)
返回false;
其他的
返回true;
};
我认为您可以使用下面的脚本,它完全满足您的需要:您向它传递一个字符串并尝试计算颜色。好吧,这并不完全是你想要做的,但它应该会起作用
我认为在任何情况下,您都应该进行名称查找(我不认为有什么神奇的方法可以从字符串“浅蓝色”确定十六进制值),因此只需抓取其他人所做的工作即可(这个脚本是由斯托扬·斯特凡诺夫编写的,他非常擅长javascript,我从他那里读过一些好书,如果他进行查找,我想没有其他解决方案了)
功能测试(myColor){
var valid=$('#test').css('color');
$('#test').css('color',myColor);
if(valid==$('#test').css('color'))警报(“无效颜色”);
否则{
警报(“有效”);
$('测试').css('颜色',有效);
}
}
测试(“如来”);
测试(“白色”);
asdasdasd
您只需将颜色设置为虚拟元素,然后检查该元素的值是否不是白色
colorToTest = 'lime'; // 'lightgray' does not work for IE
$('#dummy').css('backgroundColor', 'white');
$('#dummy').css('backgroundColor', colorToTest);
if ($('#dummy').css('backgroundColor') != 'rgb(255, 255, 255)' || colorToTest == 'white') {
alert(colorToTest+' is valid');
}
当问题字符串的颜色与测试颜色相同时,此页面上发布的所有解决方案都是不正确的。当然,您可以使用一种不太可能的颜色选择,但我更愿意选择100%的成功率 OP的代码中只有一个输入错误(请参见冒号条件),并且没有测试“#28e32a”,因此颜色将失败,正则表达式将压缩颜色中的空白,因此“#28e 32a”将(错误地)通过 在普通JavaScript中,这应该100%成功:
function validTextColour(stringToTest) {
//Alter the following conditions according to your need.
if (stringToTest === "") { return false; }
if (stringToTest === "inherit") { return false; }
if (stringToTest === "transparent") { return false; }
var image = document.createElement("img");
image.style.color = "rgb(0, 0, 0)";
image.style.color = stringToTest;
if (image.style.color !== "rgb(0, 0, 0)") { return true; }
image.style.color = "rgb(255, 255, 255)";
image.style.color = stringToTest;
return image.style.color !== "rgb(255, 255, 255)";
}
JSFiddle:我知道这个问题已经很老了,但我提出了一个纯javascript解决方案来检查颜色,它似乎在每个浏览器中都能工作,并希望与大家分享 此函数使用浏览器将任何输入字符串转换为CSS颜色字符串(如果可能) 让我们看看基于不同输入的函数输出 无效输入 基本上,任何时候浏览器都不知道如何将输入字符串呈现为颜色,就会返回一个
空字符串
,这使得这个小函数非常适合检测无效的颜色字符串
,redd
,f0gf0g
,1234
,f00
,rgb(1,2)
,rgb(1,2,3.0)
,rgb(1,2,3,4)
rgba(100150200)
…铬合金
…firefox
…internet explorer
aqua
…chromeaqua
…firefoxaqua
…internet exploreraqua
pink
…chrome将所有有效的html颜色名称转换为rgb格式,以下17种除外,我不确定为什么rgb(255192203)
[“aqua”、“black”、“blue”、“fuchsia”、“gray”、“green”、“lime”、“maroon”、“navy”、“olive”、“orange”、“purple”、“red”、“silver”、“teal”、“white”、“yellow”]
…firefoxpink
…internet explorerpink
,#f00
,#ff0000
rgb(255,0,0)
…chromergb(255,0,0)
…firefoxrgb(255,0,0)
…internet explorerrgb(255,0,0)
,rgba(255,0,0,1.0)
rgba(255,0,0100)
…chrome在alpha为rgb(255,0,0)
或更大时将1.0
转换为rgba
,因为它完全不透明(可能是为了性能)rgb
…firefox与chrome做同样的事情rgb(255,0,0)
..internet explorer将alpha参数从rgba(255,0,0,1)
或更高版本转换为1.0
1
rgba(0255,0,0.5)
…chrome返回与其他浏览器不同的内容(可能以精度换取性能)rgba(0255,0,0.498039)
…firefoxrgba(0255,0,0.5)
…internet explorerrgba(0255,0,0.5)
,rgba(0,0255,0.0)
rgba(0,0255,-100)
..chrome将alpha参数从rgba(0,0255,0)
或更低转换为0.0
0
…firefox也这么做rgba(0,0255,0)
…internetexplorerrgba(0,0255,0)
function getColorCSS(c) { var ele = document.createElement("div"); ele.style.color = c; return ele.style.color.replace(/\s+/,'').toLowerCase(); }
function isValidCssColor(c){ // put !! to normalize to boolean return [ document.head.style.color = c, document.head.style.color, document.head.style.color = null ][1]; // split it in 3 lines is fine, see snippet }
v=c=>((s=document.head.style).color=c,q=s.color,s.color='',!!q); // v('red') => true // v('reeeed') => false