Лучшая ненавязчивая альтернатива не сделать такой псевдоним. Это еще одна вещь, о которой нужно помнить. Другое дело, что люди, смотрящие на ваш код, изучают, вероятно, нарушают функции автозаполнения и синтаксиса IDE, а также загрязняют прототипы.
Однако, если вы хотите перейти по этому пути, тем не менее, это займет специальную технику, чтобы связать что-либо от $$
и Element.$$
, так как они возвращают списки узлов. Во-первых, мы сделаем $$
возвращать массив:
window.$$ = function(sel) {
return Array.prototype.slice.call(document.querySelector(sel));
}
И то же самое для Element.$$
. Теперь мы можем увеличить в Array
прототип:
Array.prototype.$ = function(sel) {
var result = [];
for (var i = 0; i < this.length; i++) {
var sub = this[i].querySelector(sel);
if (sub) result.push(sub);
}
return result;
};
идти вперед и переписать это с помощью map
и/или filter
и т.д., если это подходит для вашей фантазии.
Теперь вы можете сделать:
$$('.class1').$('span')
Кроме того, вы можете определить версию $$
на Array
, следующим образом:
Array.prototype.$$ = function(sel) {
var result = [];
for (var i = 0; i < this.length; i++) {
var elts = this[i].querySelectorAll(sel);
for (var j = 0; j < elts.length; j++) {
result.push(elts[j]);
}
}
return result;
;
Это объединяет все нодлисто в результате querySelectorAll
вызовов на каждый члене входного нодлиста в один массив.
Если вы хотите цепи что-то вроде setAttribute
, вам необходимо определить версии для обоих Element
и Array
:
Element.prototype.setAttributeChainable = function() {
this.setAttribute.apply(this, arguments);
return this;
}
Array.prototype.setAttributeChainable = function() {
for (var i = 0; i < this.length; i++) {
this[i].setAttribute.apply(this[i], arguments);
}
return this;
}
Чтобы сделать это не в состоянии молча, когда $
не находит ничего, организовать для того, чтобы вернуть пустой массив в этом случае:
window.$ = function(sel) {
return document.querySelector(sel) || [];
};
и то же самое для Element.$
.
Теперь вы можете сделать
$$('.class1') .
$$('span') .
setAttributeChainable('style', 'color:blue') .
$('a') .
setAttributeChainable('href', 'google.com');
Теперь продолжайте это упражнение с другим API, которые вы хотите сделать змеевидное и/или применимый к узлу списка.
Если у вас есть возражения против добавления прототипа Array
, вам нужно будет найти другой подход.
* как функция return всегда ссылается на документ * Что это значит? * нам разрешено делать предыдущий неудачный селектор, * Что это значит? Во всяком случае, что вы пытаетесь достичь? Сохранить несколько нажатий клавиш? –
«поскольку функция return всегда ссылается на документ» - означает, что в первом примере, когда мы возвращаем функцию с document.qs, результат, очевидно, всегда ссылается на документ. «нам разрешено делать предыдущий неудачный селектор» - означает, что предыдущий неудачный селектор ($ ('. Parent-class'). $$ ('. Child-classes')) работает прикованным и с контекстом. Да, пытаясь сохранить нажатия клавиш и читаемость. – 0Ds0