/*
selectivizr v1.0.0 - (c) Keith Clark, freely distributable under the terms
of the MIT license.
selectivizr.com
*/
/*
References:
-----------
* CSS Syntax :
http://www.w3.org/TR/2003/WD-css3-syntax-20030813/#style
* Selectors :
http://www.w3.org/TR/css3-selectors/#selectors
* IE Compatability : http://msdn.microsoft.com/en-us/library/cc351024(VS.85).aspx
* W3C Selector Tests :
http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/tests/
*/
(function(win) {
// If browser isn't IE, then stop execution! This handles the script
// being loaded by non IE browsers because the developer didn't use
// conditional comments.
if (/*@cc_on!@*/true) return;
// =========================== Init Objects ============================
var doc = document
var root = doc.documentElement
var xhr = getXHRObject()
var ieVersion = /MSIE ([\d])/.exec(navigator.userAgent)[1];
// If were not in standards mode, IE is too old / new or we can't create
// an XMLHttpRequest object then we should get out now.
if (doc.compatMode != 'CSS1Compat' || ieVersion<6 || ieVersion>8 || !xhr) {
return
}
// ========================= Common Objects ============================
// compatiable selector engines in order of CSS3 support
var selectorEngines = {
"NW" : "*.Dom.select",
"DOMAssistant" : "*.$",
"Prototype" : "$$",
"YAHOO" : "*.util.Selector.query",
"MooTools" : "$$",
"Sizzle" : "*",
"jQuery" : "*",
"dojo" : "*.query"
}
var selectorMethod
var enabledWatchers = []; // array of :enabled/:dsiabled elements to poll
var ie6PatchID = 0; // used to solve ie6's multiple class bug
var patchIE6MultipleClasses = true; // if true adds class bloat to ie6
var namespace = "slvzr"
var domReadyScriptID = namespace + "DOMReady"
// Stylesheet parsing regexp's
var RE_COMMENT = /(\/\*[^*]*\*+([^\/][^*]*\*+)*\/)\s*/g
var RE_IMPORT = /@import\s*url\(\s*(["'])?(.*?)\1\s*\)[\w\W]*?;/g
var RE_PSEUDO_STRUCTURAL = /^:(empty|(first|last|only|nth(-last)?)-(child|of-type))$/
var RE_PSEUDO_ELEMENTS = /:(:first-(?:line|letter))/g
var RE_SELECTOR_GROUP = /(^|})\s*([^\{]*?[\[:][^{]+)/g
var RE_SELECTOR_PARSE = /([ +~>])|(:[a-z-]+(?:\(.*?\)+)?)|(\[.*?\])/g;
var RE_LIBRARY_INCOMPATIBLE_PSEUDOS = /(:not\()?:(hover|enabled|disabled|focus|checked|target|active|visited|first-line|first-letter)\)?/g
var RE_PATCH_CLASS_NAME_REPLACE = /[^\w-]/g
// HTML UI element regexp's
var RE_INPUT_ELEMENTS = /^(INPUT|SELECT|TEXTAREA|BUTTON)$/
var RE_INPUT_CHECKABLE_TYPES = /^(checkbox|radio)$/
// Broken attribute selector implementations
// fixes IE7 native implementation of [^=""], [$=""] and [=""]
// fixes IE8 native implementation of [^=""] and [$=""]
var BROKEN_ATTR_IMPLEMENTATIONS = ieVersion==8 ? /[\$\^]=(['"])\1/ : ieVersion==7 ? /[\$\^*]=(['"])\1/ : null
// Whitespace normalization regexp's
var RE_TIDY_TRAILING_WHITESPACE = /([(\[+~])\s+/g
var RE_TIDY_LEADING_WHITESPACE = /\s+([)\]+~])/g
var RE_TIDY_CONSECUTIVE_WHITESPACE = /\s+/g
var RE_TIDY_TRIM_WHITESPACE = /^\s*((?:[\S\s]*\S)?)\s*$/
// String constants
var EMPTY_STRING = ""
var SPACE_STRING = " "
var PLACEHOLDER_STRING = "$1"
// =========================== Patching ================================
// --[ patchStyleSheet() ]----------------------------------------------
// Scans the passed cssText for selectors that require emulation and
// creates one or more patches for each matched selector.
function patchStyleSheet( cssText ) {
return cssText.replace(RE_PSEUDO_ELEMENTS, PLACEHOLDER_STRING)
.replace(RE_SELECTOR_GROUP, function(m, prefix, selectorText) {
var selectorGroups = selectorText.split(",")
for (var c=0, cs=selectorGroups.length; c0) {
applyPatches( selector.substring(0, index), patches )
patches = []
}
return combinator
}
else {
var patch = (pseudo) ? patchPseudoClass( pseudo ) : patchAttribute( attribute );
if (patch) {
patches.push(patch);
return "." + patch.className
}
return match
}
}
)
}
return prefix + selectorGroups.join(",");
})
}
// --[ patchAttribute() ]-----------------------------------------------
// returns a patch for an attribute selector.
function patchAttribute( attr ) {
return (!BROKEN_ATTR_IMPLEMENTATIONS || BROKEN_ATTR_IMPLEMENTATIONS.test(attr)) ?
{ className: createClassName(attr), applyClass: true } : null
}
// --[ patchPseudoClass() ]---------------------------------------------
// returns a patch for a pseudo-class
function patchPseudoClass( pseudo ) {
var applyClass = true;
var className =
Читать далее...