Skip to content

Instantly share code, notes, and snippets.

@greyd
Created June 11, 2012 15:45
Show Gist options
  • Save greyd/2910763 to your computer and use it in GitHub Desktop.
Save greyd/2910763 to your computer and use it in GitHub Desktop.
query
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