Skip to content

Instantly share code, notes, and snippets.

@Witiko
Created September 6, 2013 11:02
Show Gist options
  • Save Witiko/6462390 to your computer and use it in GitHub Desktop.
Save Witiko/6462390 to your computer and use it in GitHub Desktop.
A simple DOM query library
/*
SexyDollar library by Witiko
Function $()
1st argument: "tagName", "#id", ".className", "tagName.className", "@name", "tagName@name"
2nd argument: parentElement (optional)
*/
var $ = (function(getElementsByClassName) {
return function(query, element) {
var func = query?(/#|\.|@/.exec(query) || [])[0]:null,
index = query?query.indexOf(func):-1,
tempArray, tempString, i;
if(!query || !query.length) query = "*";
if(!element) element = document;
else if(!(element.length || (typeof HTMLElement === "object"?element instanceof HTMLElement:typeof element === "object" && (element.nodeType === 1 || element.nodeType === 9) && typeof element.nodeName === "string" && element.hasChildNodes())))
return func==="#"?null:[];
switch(func) {
case ".":
if(index === 0) {
return element.getElementsByClassName?
element.getElementsByClassName(query.substr(1)):
getElementsByClassName(query.substr(1), false, element);
} else {
if(element.getElementsByClassName) {
tempArray = [element.getElementsByClassName(query.substr(index + 1)),[]];
tempString = new RegExp(query.substr(0,index), "i");
for(i = 0; tempArray[0][i]; i++) {
if(tempString.test(tempArray[0][i].tagName)) tempArray[1].push(tempArray[0][i]);
}
return tempArray[1];
} else {
return getElementsByClassName(query.substr(index + 1), query.substr(0,index), element);
}
}
case "@":
if(index === 0) {
return element.getElementsByName(query.substr(1));
} else {
tempArray = [element.getElementsByName(query.substr(index + 1)),[]];
tempString = new RegExp(query.substr(0,index), "i");
for(i = 0; tempArray[0][i]; i++) {
if(tempString.test(tempArray[0][i].tagName)) tempArray[1].push(tempArray[0][i]);
}
return tempArray[1];
}
case "#":
return (element.getElementById?element:document).getElementById(query.substr(index + 1));
default:
return element.getElementsByTagName(query);
}
}
})(function(className, tag, elm) {
var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)"),
tag = tag || "*",
elm = elm || document,
elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
returnElements = [],
current,
length = elements.length;
for(var i=0; i<length; i++){
current = elements[i];
if(testClass.test(current.className)){
returnElements.push(current);
}
}
return returnElements;
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment