Znając DOM Traversal i napisawszy własny querySelector oraz querySelectorAll, piszemy funkcje byId oraz byClassname.
Oto querySelector z poprzedniej lekcji:
Document.prototype.myQuerySelector = function(selector) {
var result = null;
function traverse(node) {
if(node == null)
return;
if(isMatch(node, selector)) {
result = node;
return;
}
for(var child of node.children)
traverse(child);
}
traverse(this.documentElement);
return result;
}
Ten sam traversal, ta sama logika funkcji głównej, tylko inny warunek wyrwania z funkcji wewnętrznej i inny argument:
Document.prototype.myGetElementById = function(id) {
var result = null;
function traverse(node) {
if(node == null)
return;
if(node.id === id) {
result = node;
return;
}
for(var child of node.children)
traverse(child);
}
traverse(this.documentElement);
return result;
}
Teraz poprzedni querySelectorAll:
Document.prototype.myQuerySelectorAll = function(selector) {
var result = [];
function traverse(node) {
if(node == null)
return;
if(isMatch(node, selector))
result.push(node);
for(var child of node.children)
traverse(child);
}
traverse(this.documentElement);
return result;
}
Aplikujemy te samą logikę, tylko sprawdzamy czy dany element posiada klasę zamiast match z selektorem:
Document.prototype.myGetElementsByClassname = function(classname) {
var result = [];
function traverse(node) {
if(node == null)
return;
if(node.classList.contains(classname))
result.push(node);
for(var child of node.children)
traverse(child);
}
traverse(this.documentElement);
return result;
}