var node = this; // в ноду кладем текущий элемент Element;
// начинаем примерять селектор, двигаясь от текущего элемента к его родителям
while (node) // пока есть элемент (не null) (или на предыдущей итерации провалили матч и есть родитель)
{
if (node.matches(css)) // подходит селектор элементу ?
return node; // возвращаем этот элемент, цикл останавливается
else
node = node.parentElement; // не подошло, устанавливаем на node родительский элемент, идем на следующую итерацию.
}
return null; // цикл прошелся по всем родителям - ничего не нашли
----------
Подставляем свой "велосипед" closest в прототип элемента:
Element.prototype.closest = function (css)
-------------
Подставляем в прототип элемента метод matches любую доступную из перечисленных через || реализацию, если этот метод в разных браузерах называется по-разному, чтобы сгладить этот досадное недоразумение.
Element.prototype.matches = Element.prototype.matchesSelector || <подставьте любой метод, чтобы делал матч, но назывался не как у всех>