I figured I'd give this a stab. Feel free to use, modify (or fix) this code as you see fit. I can't promise it's correct, but the examples they give on the w3c spec all produce the same results.
function specificity(selector, isStyleAttribute) {
selector = selector || "";
function numMatches(regex) {
return (selector.match(regex)||[]).length;
}
var numClasses = numMatches(/\.[\w-_]+\b/g);
var numIds = numMatches(/#[\w-_]+\b/g);
var numNamesInBraces = 0;
var namesInBraces = selector.match(/\[[^\]]*\b[\w-_]+\b[^\]]*\]/g) || [];
for (var idx = 0; idx < namesInBraces.length; ++idx) {
numNamesInBraces += (namesInBraces[idx].match(/\b[\w-_]+\b/g)||[]).length;
}
var results = [0,0,0,0];
results[0] = isStyleAttribute ? 1 : 0;
results[1] = numIds;
results[2] = numMatches(/\[[^\]]+\]/g) + numClasses;
results[3] = numMatches(/\b[\w-_]+\b/g) - numIds - numClasses - numNamesInBraces;
return results.join(',');
}
If you want to sort an array with it, it can be used like this:
selectors.sort(function(a,b) { return specificity(a) > specificity(b); });