Piszemy kolejny polyfill, tym razem dla funkcji querySelector. Do dzieła.
Polyfill isMatch:
function isMatch(node, selector) {
if(node.matches) {
return node.matches(selector);
} else {
var matches = Element.prototype.matchesSelector ||
Element.prototype.mozMatchesSelector ||
Element.prototype.msMatchesSelector ||
Element.prototype.oMatchesSelector ||
Element.prototype.webkitMatchesSelector;
return matches.call(node, selector);
}
}
Kod z poprzedniej lekcji:
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;
}
Przerabiamy tak, aby zwracał pierwszy napotkany wynik albo null zamiast tablicy wyników/pustej tablicy:
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;
}
Pusty return wywala nas z funkcji traverse wcześniej, gdy znajdziemy coś. Gdy nie, zwrócimy null. DOM traversal taki sam, jak zawsze.