camsong/You-Dont-Need-jQuery

Missing prevUntil - $('#demo').prev('a');

Closed this issue · 4 comments

Having:

<a href="#">Text</a>
<b>Text 2</b>
<a id="demo" href="#">Text 3</a>

We want to return the prev a, not the <b> element:

$('#demo').prev('a'); // <a href="#">Text</a>

In jQuery they call it internally prevUntil:

nextUntil: function(elem, i, until) {
    return dir(elem, "nextSibling", until);
},
prevUntil: function(elem, i, until) {
   return dir(elem, "previousSibling", until);
},

I would suggest something on these lines:

function prevUntil(item, selector){
	var prev = item.previousElementSibling
	while(prev && !prev.matches(selector)){
    	    prev = prev.previousElementSibling;
        }
    
    return prev;
}

Perhaps something like:

function until(item, selector, fn){
        var sibling = item[fn]
        while(sibling && !sibling.matches(selector)){
            sibling = sibling[fn];
        }
        
        return sibling;
    }

    function prevUntil(item, selector){
        return until(item, selector, 'previousElementSibling')
    }

    function nextUntil(item, selector){
        return until(item, selector, 'nextElementSibling')
    }

@alvarotrigo Since you are already proposing code solutions, I think you can directly open some pull requests.

@alvarotrigo looks good to me, can you raise a PR?