Skip to content

Instantly share code, notes, and snippets.

@Witiko
Created September 6, 2013 11:03
Show Gist options
  • Save Witiko/6462398 to your computer and use it in GitHub Desktop.
Save Witiko/6462398 to your computer and use it in GitHub Desktop.
A simple DOM query library with some added complexity
/*
SexyDollar Extended library by Witiko
Function $()
1st argument: "tagName", "#id", ".className", "tagName.className", "@name", "tagName@name"
2nd argument: Array / NodeList / Element parentElement (optional)
*/
var $ = (function(getElementsByClassName, arrayIndexOf, undefined) {
return function collect(query, element) {
if(typeof query === "string" && query.indexOf(" ") > -1) {
func = query.split(" ");
result = [];
for(i = 0; i < func.length; i++) {
if(!tempArray) {
tempArray = collect(func[i], element);
if(tempArray.length !== undefined) {
tempArray = tempArray === null?result:[tempArray];
}
}
else {
result.length = 0;
for(j = 0; j < tempArray.length; j++) {
result.push(collect(func[i], tempArray[j]))
}
tempArray.length = 0;
for(j = 0; j < result.length; j++) {
if(result[j].length !== undefined) {
for(var k = 0; k < result[j].length; k++) {
tempArray.push(result[j][k]);
}
} else if(result[j] !== null)
tempArray.push(result[j]);
}
result.length = 0;
}
if(!tempArray.length) return tempArray;
for(j = 0; j < tempArray.length; j++) {
if((Array.prototype.indexOf?result.indexOf(tempArray[j]):arrayIndexOf(result, tempArray[j])) === -1)
result.push(tempArray[j]);
}
tempArray = result.slice(0);
}
return result;
} else {
var func = query?(/#|\.|@/.exec(query) || [])[0]:null,
index = query?query.indexOf(func):-1,
tempArray, tempString, result = [], i, j;
if(!query || !query.length) query = "*";
if(!element) element = document;
else if(!(element.length || (typeof window.HTMLElement === "object"?element instanceof HTMLElement:typeof element === "object" && (element.nodeType === 1 || element.nodeType === 9) && typeof element.nodeName === "string" && element.hasChildNodes())))
return func==="#"?null:result;
switch(func) {
case ".":
if(index === 0) {
if(element.length) {
result = element[0].getElementsByClassName?
element[0].getElementsByClassName(query.substr(1)):
getElementsByClassName(query.substr(1), false, element[0]);
for(i = 1; a < element.length; i++) {
tempArray = element[i].getElementsByClassName?
element[i].getElementsByClassName(query.substr(1)):
getElementsByClassName(query.substr(1), false, element[i]);
for(j = 0; tempArray[j]; j++) {
if((Array.prototype.indexOf?result.indexOf(tempArray[j]):arrayIndexOf(result, tempArray[j])) === -1)
result.push(tempArray[j]);
}
}
return result;
} else return element.getElementsByClassName?
element.getElementsByClassName(query.substr(1)):
getElementsByClassName(query.substr(1), false, element);
} else {
tempString = new RegExp(query.substr(0,index), "i");
if(element.length) {
for(i = 0; i < element.length; i++) {
tempArray = element[i].getElementsByClassName?
element[i].getElementsByClassName(query.substr(index + 1)):
getElementsByClassName(query.substr(index + 1), query.substr(0,index), element[i]);
for(j = 0; tempArray[j]; j++) {
if((!element[i].getElementsByClassName || tempString.test(tempArray[i].tagName)) &&
(Array.prototype.indexOf?result.indexOf(tempArray[j]):arrayIndexOf(result, tempArray[j])) === -1)
result.push(tempArray[j]);
}
}
return result;
} else {
if(element.getElementsByClassName) {
tempArray = element.getElementsByClassName(query.substr(index + 1));
for(i = 0; tempArray[i]; i++) {
if(tempString.test(tempArray[i].tagName)) result.push(tempArray[i]);
}
return result;
} else
return getElementsByClassName(query.substr(index + 1), query.substr(0,index), element);
}
}
case "@":
if(index === 0) {
if(element.length) {
for(i = 0; i < element.length; i++) {
tempArray = result.concat(element[i].getElementsByName(query.substr(1)));
for(j = 0; tempArray[j]; j++) {
if((Array.prototype.indexOf?result.indexOf(tempArray[j]):arrayIndexOf(result, tempArray[j])) === -1)
result.push(tempArray[j]);
}
}
return result;
} else
return element.getElementsByName(query.substr(1));
} else {
tempString = new RegExp(query.substr(0,index), "i");
if(element.length) {
for(i = 0; i < element.length; i++) {
tempArray = element[i].getElementsByName(query.substr(index + 1));
for(j = 0; tempArray[j]; j++) {
if(tempString.test(tempArray[j].tagName)) result.push(tempArray[j]);
}
}
return result;
} else {
tempArray = element.getElementsByName(query.substr(index + 1));
for(var i = 0; tempArray[i]; i++) {
if(tempString.test(tempArray[i].tagName)) result.push(tempArray[i]);
}
return result;
}
}
case "#":
if(index !== 0) tempString = new RegExp(query.substr(0,index), "i");
if(element.length) {
for(i = 0; i < element.length; i++) {
tempArray = result.concat((element[i].getElementById?element[i]:document).getElementById(query.substr(index + 1)));
for(j = 0; tempArray[j]; j++) {
if((Array.prototype.indexOf?result.indexOf(tempArray[j]):arrayIndexOf(result, tempArray[j])) === -1 &&
(index !== 0?tempString.test(tempArray[j].tagName):true)) {
result.push(tempArray[j]);
}
}
}
return result;
} else {
tempArray = (element.getElementById?element:document).getElementById(query.substr(index + 1));
return index !== 0?(tempString.test(tempArray.tagName)?tempArray:null):tempArray;
}
default:
if(element.length) {
for(i = 0; i < element.length; i++) {
tempArray = element[i].getElementsByTagName(query);
for(j = 0; tempArray[j]; j++) {
if((Array.prototype.indexOf?result.indexOf(tempArray[j]):arrayIndexOf(result, tempArray[j])) === -1)
result.push(tempArray[j]);
}
}
return result;
} else
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;
}, function(n,o){
for(var j=n.length,i=0;i<j&&n[i]!==o;i++);return j<=i?-1:i
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment