getters.js 888 Bytes
function getAncestorByAttribute(elem, attr, val) {
	while (elem.getAttribute(attr) != val || elem == null) elem = elem.parentElement;
	return elem;
}

function getDescendantByAttribute(elem, attr, val) {
	if (elem == null || elem.getAttribute(attr) == val) return elem;
	return Array.from(elem.children).reduce((a, b) => {
		let x = getDescendantByAttribute(a, attr, val);
		let y = getDescendantByAttribute(b, attr, val);
		return x == null ? y : x;
	}, null);
}

function getAncestorByTag(elem, val) {
	while (elem.nodeName != val.toUpperCase() || elem == null) elem = elem.parentElement;
	return elem;
}

function getDescendantByTag(elem, val) {
	if (elem == null || elem.nodeName == val.toUpperCase()) return elem;
	return Array.from(elem.children).reduce((a, b) => {
		let x = getDescendantByTag(a, val);
		let y = getDescendantByTag(b, val);
		return x == null ? y : x;
	}, null);
}