Created
September 6, 2013 11:03
-
-
Save Witiko/6462398 to your computer and use it in GitHub Desktop.
A simple DOM query library with some added complexity
This file contains hidden or 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
/* | |
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