Created
April 19, 2013 16:53
-
-
Save rgrove/5421625 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var addClass, hasClass, removeClass; | |
// Some old browers don't support classList, fallbacks use className property | |
var _hasClassList = Y2.config.doc && 'classList' in Y2.config.doc.body; | |
Y2.mix(Y2.DOM, { | |
/** | |
* Determines whether a DOM element has the given className. | |
* @method hasClass | |
* @for DOM | |
* @param {HTMLElement} element The DOM element. | |
* @param {String} className the class name to search for | |
* @return {Boolean} Whether or not the element has the given class. | |
*/ | |
hasClass: _hasClassList ? function (node, className) { | |
var re = Y2.DOM._getRegExp('[^\\s]+(?:\\s+|$)','g'); | |
if (className && re.test(className)){ | |
re.lastIndex = 0; | |
var classes = className.match(re); | |
for (var i=0; i < classes.length; i++){ | |
if (!node.classList.contains(classes[i].trim())){ | |
return false; | |
} | |
} | |
return true; | |
} | |
return false | |
} : function (node, className) { | |
var re = Y2.DOM._getRegExp('(?:^|\\s+)' + className + '(?:\\s+|$)'); | |
return re.test(node.className); | |
}, | |
/** | |
* Adds a class name to a given DOM element. | |
* @method addClass | |
* @for DOM | |
* @param {HTMLElement} element The DOM element. | |
* @param {String} className the class name to add to the class attribute | |
*/ | |
addClass: _hasClassList ? function (node, className) { | |
var re = Y2.DOM._getRegExp('[^\\s]+(?:\\s+|$)','g'); | |
if (className && re.test(className)){ | |
re.lastIndex = 0; | |
var classes = className.match(re); | |
for (var i=0; i < classes.length; i++){ | |
classes[i] = classes[i].trim(); | |
if (!Y2.DOM.hasClass(node, classes[i])){ // skip if already present | |
node.classList.add(classes[i]); | |
} | |
} | |
} | |
} : function (node, className) { | |
if (!Y2.DOM.hasClass(node, className)){ // skip if already present | |
node.className = Y2.Lang.trim([node.className, className].join(' ')); | |
} | |
}, | |
/** | |
* Removes a class name from a given element. | |
* @method removeClass | |
* @for DOM | |
* @param {HTMLElement} element The DOM element. | |
* @param {String} className the class name to remove from the class attribute | |
*/ | |
removeClass: _hasClassList ? function (node, className) { | |
var re = Y2.DOM._getRegExp('[^\\s]+(?:\\s+|$)','g'); | |
if (className && re.test(className)){ | |
re.lastIndex = 0; | |
var classes = className.match(re); | |
for (var i=0; i < classes.length; i++){ | |
classes[i] = classes[i].trim(); | |
if (classes[i] && hasClass(node, classes[i])) { | |
node.classList.remove(classes[i]); | |
} | |
} | |
} | |
} : function (node, className) { | |
if (className && hasClass(node, className)) { | |
node.className = Y2.Lang.trim(node.className.replace(Y2.DOM._getRegExp('(?:^|\\s+)' + className + '(?:\\s+|$)'), ' ')); | |
} | |
if ( hasClass(node, className) ) { // in case of multiple adjacent | |
removeClass(node, className); | |
} | |
}, | |
/** | |
* Replace a class with another class for a given element. | |
* If no oldClassName is present, the newClassName is simply added. | |
* @method replaceClass | |
* @for DOM | |
* @param {HTMLElement} element The DOM element | |
* @param {String} oldClassName the class name to be replaced | |
* @param {String} newClassName the class name that will be replacing the old class name | |
*/ | |
replaceClass: function(node, oldC, newC) { | |
//Y2.log('replaceClass replacing ' + oldC + ' with ' + newC, 'info', 'Node'); | |
removeClass(node, oldC); // remove first in case oldC === newC | |
addClass(node, newC); | |
}, | |
/** | |
* If the className exists on the node it is removed, if it doesn't exist it is added. | |
* @method toggleClass | |
* @for DOM | |
* @param {HTMLElement} element The DOM element | |
* @param {String} className the class name to be toggled | |
* @param {Boolean} addClass optional boolean to indicate whether class | |
* should be added or removed regardless of current state | |
*/ | |
toggleClass: function(node, className, force) { | |
var add = (force !== undefined) ? force : | |
!(hasClass(node, className)); | |
if (add) { | |
addClass(node, className); | |
} else { | |
removeClass(node, className); | |
} | |
} | |
}, true); | |
hasClass = Y2.DOM.hasClass; | |
removeClass = Y2.DOM.removeClass; | |
addClass = Y2.DOM.addClass; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment