Created
June 11, 2012 15:45
-
-
Save greyd/2910763 to your computer and use it in GitHub Desktop.
query
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
function initPage() { | |
console.log(Q('div#wrapper.list[type="tset"][test="123"]')); | |
} | |
window.Q = function( selector, paren ) { | |
var Q = function ( selector, parent ) { | |
var regs = { | |
'id' : /\#[\w\d-]+/, | |
'classes' : /\.[\w\d-]+/g, | |
'tag' : /^[\w]+/, | |
'attr' : /\[([\w]+)\=("|')([\w\d-]+)("|')\]/g | |
}; | |
/*function parseSelector(selector) { | |
var token = selector; | |
}*/ | |
/** | |
* @param {String} selector | |
* @returns {Object} | |
* */ | |
function parseSelectorToken(selector) { | |
var key = null, | |
res = {}; | |
for(key in regs) { | |
var tokens = selector.match(regs[key]); | |
if (!tokens) continue; | |
if (key === 'id' || key === 'classes') { | |
res[key] = map(tokens, function(item, index) { | |
//removing first '.' and '#' char | |
return item.replace(/^\#|\./, ''); | |
}); | |
} else if (key === 'attr') { | |
res[key] = map(tokens, function(item, index) { | |
// Convert token '[type="test"]' to 'type=test' | |
var attrs = item.replace(/\[|\]|"|'/g, '').split('='); | |
return { | |
name : attrs[0], | |
value : attrs[1] | |
}; | |
}); | |
} else { | |
res[key] = tokens; | |
} | |
} | |
return res; | |
} | |
/** | |
* @param {Object} selectorObj | |
* */ | |
function getElement(selectorObj) { | |
if (isEmptyObj(selectorObj)) return false; | |
if (!selectorObj.id) { | |
return byId(selectorObj.id[0]); | |
} else if (!selectorObj.classes) { | |
return byClass(selectorObj.classes.join(' ')); | |
} else if (!selectorObj.tag) { | |
return byTag(selectorObj.tag[0]); | |
} else { | |
var attrs = selectorObj.attr, | |
elems = document.getElementsByTagName('*'), | |
attrsLen = attrs.length, | |
elemsLen = elems.length, | |
i = 0, | |
j = 0, | |
counter = 0, | |
res = []; | |
for (i; i < elemsLen; i++) { | |
for (j = 0; j < attrsLen; j++) { | |
if (elems[i].getAttribute(attrs[j].name) === attrs[j].value ) { | |
counter++; | |
} | |
} | |
if (counter === attrsLen) { | |
res.push(elems[i]); | |
} | |
counter = 0; | |
} | |
console.log(res); | |
return res; | |
} | |
} | |
console.log(getElement(parseSelectorToken(selector))); | |
/** | |
* @param {Array} item | |
* @returns {Boolean} | |
* */ | |
function isArray(item) { | |
return item instanceof Array; | |
} | |
/** | |
* @param {String} node | |
* @returns {Node} | |
* */ | |
function byId(node) { | |
return document.getElementById(node); | |
} | |
/** | |
* @param {String} classList | |
* @returns {Array | NodeList} | |
* */ | |
function byClass(classList) { | |
if (document.getElementsByClassName) { | |
return document.getElementsByClassName(classList); | |
} | |
var list = document.getElementsByTagName('*'), | |
length = list.length, | |
classArray = classList.split(/\s+/), | |
classes = classArray.length, | |
result = [], i,j; | |
for (i = 0; i < length; i++) { | |
for (j = 0; j < classes; j++) { | |
if(list[i].className.search('\\b' + classArray[j] + '\\b') != -1) { | |
result.push(list[i]); | |
break; | |
}; | |
}; | |
} | |
return result; | |
} | |
/** | |
* @param {String} tagName | |
* @returns {NodeList} | |
* */ | |
function byTag(tagName) { | |
return document.getElementsByTagName(tagName); | |
} | |
/** | |
* @param {Array} items | |
* @param {Function} handler | |
* @returns {Array} | |
* */ | |
function map(items, handler) { | |
var i = 0, | |
len = items.length, | |
res = []; | |
for (i; i < len; i++) { | |
res.push(handler(items[i], i)); | |
} | |
return res; | |
} | |
/** | |
* @param {Array} items | |
* @param {Function} handler | |
* @returns {Array} | |
* */ | |
function grep(items, handler) { | |
var i = 0, | |
len = items.length, | |
res = []; | |
for(i; i < len; i++) { | |
if (handler(items[i], i)) { | |
res.push(items[i]); | |
}; | |
} | |
return res; | |
}; | |
/** | |
* @param {Array} items | |
* @param {Function} handler | |
* @returns {Boolean} | |
* */ | |
function every(items, handler) { | |
var len = items.length, | |
arr = null; | |
arr = grep(items, handler); | |
return arr.length === len; | |
} | |
/** | |
* @param {String} str | |
* @returns {String} | |
* */ | |
function trim(str) { | |
console.log(str) | |
return str.replace(/^[\s]|[\s]$/, ''); | |
} | |
/** | |
* @param {String} str | |
* @returns {String} | |
* */ | |
function normalizeSpaces(str) { | |
return str.replace(/\s+/g, ' '); | |
} | |
/** | |
* @param {Object} obj | |
* @returns {Boolean} | |
* */ | |
function isEmptyObj(obj) { | |
var key = null, | |
len = 0; | |
for (key in obj) { | |
len+=1; | |
} | |
return !len; | |
} | |
/**@param {HTMLElement} | |
* @param {String} classList | |
* @returns {Boolean} | |
* */ | |
function hasClass(elem, classList) { | |
var classes = normalizeSpaces(trim(classList)).split(' '); | |
classes | |
} | |
hasClass(null,'wer dv sdf ') | |
}; | |
return new Q( selector, parent ); | |
}; | |
if (window.addEventListener) { | |
window.addEventListener('load', initPage, false); | |
} else if (window.attachEvent) { | |
window.attachEvent('load', initPage); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment