Revision: 25395
Updated Code
at December 8, 2012 11:14 by freelancephp
Updated Code
/** * SimpleSelector ($$) * * @fileOverview * SimpleSelector is a small DOM selector object with support for the * most used selectors, like: * - By id: $$('#wrap') * - By class: $$('.special') * - By tag: $$('p') * - Mulitple: $$('#id, .cls') * - Give context: $$('a', '#wrap') or $$('#wrap a') * Released under MIT license. * @version 1.1.0 * @author Victor Villaverde Laan * @link http://www.freelancephp.net/simple-css-selector-function/ * @link https://github.com/freelancephp/SimpleSelector */ (function (window) { var SimpleSelector = window.SimpleSelector = { /** * Selector function * @param {String} selector * @param {String|DOMElement|DOMElement[]} [context=window.document] * @return {DOMElement[]} */ select: function (selector, context) { var s = selector, c = context, els = []; // prepare selector s = s.split(','); // prepare context c = isObjType(c, 'String') ? $$(c) : c && c.length ? c : window.document; // make array if (!isObjType(c, 'Array')) c = [c]; // loop through given contexts for (var i in c) { // loop through given selectors for ( var j in s) { var strim = s[j].replace(/\s+/g, ''), sp = s[j].split(' '), op = strim.substr(0, 1), name = strim.substr(1), tels = [], nextContext; if (sp.length > 1) { // make recursive call to handle f.e. "body div p strong" nextContext = $$(sp[0], c[i]); tels = $$(sp.slice(1).join(' '), nextContext); els = els.concat(tels); } else if (op == '#') { // by id tels[0] = c[i].getElementById ? c[i].getElementById(name) : window.document.getElementById(name); // check if founded array is part of context if (tels[0] && SimpleSelector.isDescendant(tels[0], c[i])) els.push(tels[0]); } else if (op == '.') { // by className var expr = new RegExp('(^|\\s)'+ name +'(\\s|$)'), all = c[i].getElementsByTagName('*'); // filter all elements that contain the given className for (var v = 0, w = all.length; v < w; v++) { if (expr.test(all[v].className)) els.push(all[v]); } } else { // by tagName tels = c[i].getElementsByTagName(strim); // add all founded elements for (var y = 0, z = tels.length; y < z; y++) els.push(tels[y]); } } } // return array of elements return SimpleSelector.clearDuplicates(els); }, /** * Check if node is part of root element * @param {DOMElement} descendant * @param {DOMElement} ancestor * @return {Boolean} */ isDescendant: function (descendant, ancestor) { return descendant.parentNode == ancestor || descendant.tagName.toUpperCase() != 'HTML' && SimpleSelector.isDescendant(descendant.parentNode, ancestor); }, /** * Check if item exists in array * @param {Array} arr * @param {Mixed} item * @return {Boolean} */ itemExists: function (arr, item) { for (var j = 0, max = arr.length; j < max; j++) { if (arr[j] === item) return true; } return false; }, /** * Clear duplicate items out of array * @param {Array} arr * @return {Array} Cleared array */ clearDuplicates: function (arr) { var a = []; for (var i = 0, max = arr.length; i < max; i++) { if (!SimpleSelector.itemExists(a, arr[i])) a.push(arr[i]); } return a; } }; /** * @private */ function isObjType (o, type) { return Object.prototype.toString.call(o) === '[object '+ type +']'; }; if (!window.$$) { /** * Add short name for SimpleSelector method * @function */ window.$$ = SimpleSelector.select; } })(window);
Revision: 25394
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at March 30, 2010 04:53 by freelancephp
Initial Code
/*! * $imple$elector * * Selector by id, className or tagName, f.e.: * $$( '#wrap' ) or $$( '.special' ) or $$( 'p' ) * * Mulitple selectors seperated by comma, f.e.: * $$( '#id, .cls' ) * * Give context as second param, f.e.: * $$( 'a', '#wrap' ) or $$( 'a', wrapNode ) or $$( 'a', [node1, node2] ) * * @version 0.2 * @author Victor Villaverde Laan * @link http://www.freelancephp.net/simpleselector-javascript-dom-selector/ * @license MIT license */ var SimpleSelector = { /** * Find elements with the given selector within the context * @param selector [string] * @param context [string | DOM node | array of DOM nodes] * @return [DOM node | array of DOM nodes | empty array] */ find: function ( selector, context ) { var selectors = selector.split( ',' ), elements = [], wrappers = []; // set wrappers if ( typeof context == 'string' ) { var wraps = SimpleSelector.find( context ); // set array to wrappers wrappers = ( wraps.constructor == Array ) ? wraps : [ wraps ]; } else if ( context && context.constructor == Array ) { wrappers = context; } else { // document is default context wrappers.push( context || document ); } // find matching elements within the wrappers (context) for ( var a = 0, b = wrappers.length; a < b; a++ ) { for ( var x = 0, y = selectors.length; x < y; x++ ) { // selector: trim spaces var s = selectors[x].replace( / /g, '' ), // get operator operator = s.substr( 0, 1 ), // get key key = s.substr( 1 ), els = []; // get matching elements if ( operator == '#' ) { // get element by id els[0] = document.getElementById( key ); // check if element is part of context if ( els[0] && SimpleSelector.isDescendant( els[0], wrappers[ a ] ) ) elements.push( els[0] ); } else if ( operator == '.' ) { // get element by className els = SimpleSelector.getByClass( key, wrappers[ a ] ); // convert type to array els = [].slice.call( els, 0 ); // add to elements collection elements = elements.concat( els ); } else { // get element by tagName els = wrappers[ a ].getElementsByTagName( s ); // add to elements collection // in this case [].slice.call( els, 0 ) does not work // in IE, says constructor is undefined?? for ( var i = 0, j = els.length; i < j; i++ ) elements.push( els[ i ] ); } } } // return single element or array of elements return ( elements.length == 1 ) ? elements[0] : elements; }, /** * Check wether an element is a descendant of the given ancestor * @param descendant [DOM node] * @param ancestor [DOM node] * @return [boolean] */ isDescendant: function ( descendant, ancestor ) { return ( ( descendant.parentNode == ancestor ) || ( descendant.parentNode != document ) && arguments.callee( descendant.parentNode, ancestor ) ); }, /** * Cross browser function for getting elements by className * @param className [string] * @param context [DOM node] * @return [array of DOM nodes] */ getByClass: function ( className, context ) { var elements = [], expr = new RegExp('\\b' + className + '\\b'), wrapper = context || document, allElements = wrapper.getElementsByTagName( '*' ); // filter all elements that contain the given className for ( var x = 0, y = allElements.length; x < y; x++ ) { if ( expr.test( allElements[ x ].className ) ) elements.push( allElements[ x ] ); } return elements; } }; // if global $$ is not set if ( ! window.$$ ) window.$$ = SimpleSelector.find;
Initial URL
http://www.freelancephp.net/simpleselector-javascript-dom-selector/
Initial Description
SimpleSelector is a small DOM selector object with support for the most used selectors. It's also the default selector for the jLim JavaScript framework. Why use SimpleSelector? - very small, less than 2kb minified - easy to use with $$() - no overhead, no functions you hardly ever use - ideal for smaller websites
Initial Title
SimpleSelector, Javascript DOM selector
Initial Tags
js, object, DOM
Initial Language
JavaScript