Skip to content

Commit

Permalink
Batter faster stronger .has(contained) and .find(element)
Browse files Browse the repository at this point in the history
  • Loading branch information
Benjamin De Cock committed Dec 27, 2014
1 parent 745e2d0 commit 12ab99b
Showing 1 changed file with 32 additions and 28 deletions.
60 changes: 32 additions & 28 deletions sprint.js
@@ -1,5 +1,5 @@
/*
* Sprint JavaScript Library v0.7.1
* Sprint JavaScript Library v0.7.2
* http://sprintjs.com
*
* Copyright (c) 2014, 2015 Benjamin De Cock
Expand Down Expand Up @@ -227,31 +227,6 @@ var Sprint;
return Sprint(removeDuplicates(dom))
}

function findDomElements(elementsToFind, returnParent) {
elementsToFind = elementsToFind instanceof Init ? elementsToFind.get() : [elementsToFind]
var elementsToFindLen = elementsToFind.length
var dom = []

for (var i = 0; i < this.length; i++) {
var el = this.get(i)
if (el.nodeType > 1) return
var descendants = selectElements("*", el)
var descendantsLen = descendants.length
for (var j = 0; j < descendantsLen; j++) {
for (var k = 0; k < elementsToFindLen; k++) {
if (descendants[j] == elementsToFind[k]) {
var returnedElement = returnParent ? this.get(i) : elementsToFind[k]
if (elementsToFindLen < 2) {
return Sprint(returnedElement)
}
dom.push(returnedElement)
}
}
}
}
return Sprint(removeDuplicates(dom))
}

function getSetDimension(obj, prop, value) {
// get
if (value == null) {
Expand Down Expand Up @@ -765,7 +740,27 @@ var Sprint;
}

// .find(element)
return findDomElements.call(this, selector)
var elementsToFind = selector instanceof Init ? selector.get() : [selector]
var elementsToFindLen = elementsToFind.length
var elementsFound = []
var elementsFoundLen = 0

for (var i = 0; i < this.length; i++) {
var el = this.get(i)
if (el.nodeType > 1) continue
// check if each element in `this` contains the elements to find
for (var j = 0; j < elementsToFindLen; j++) {
var elementToFind = elementsToFind[j]
if (!el.contains(elementToFind)) continue
elementsFound[elementsFoundLen++] = elementToFind
if (elementsFoundLen < elementsToFindLen) continue
// everything has been found, return results
return Sprint(elementsFound)
}
}

// some elements in elementsToFind weren't descendants of `this`
return Sprint(elementsFound)
},
first: function() {
return this.eq(0)
Expand All @@ -787,8 +782,17 @@ var Sprint;
return this
}, false)
}

// .has(contained)
return findDomElements.call(this, selector, true)
var result = []
var i = this.length
while (i--) {
var el = this.get(i)
if (!el.contains(selector)) continue
result.push(el)
break
}
return Sprint(result)
},
hasClass: function(name) {
var i = this.length
Expand Down

0 comments on commit 12ab99b

Please sign in to comment.