Skip to content

zakaratcha/bem-dom-queries

Repository files navigation

Это концепт инструмента для i-bem. Не готов к реальному применению.

Продолжение разработки не имеет особого смысла без принятия bem/bem-core#1571


Набор методов для экземпляров BemDomEntity для поиска блоков и элементов в DOM дереве:

  • .queryChild
  • .queryChilds
  • .queryParent
  • .queryParents
  • .queryMix
  • .queryMixes

Примеры синтаксиса:

Описание классический синтаксис bem-dom-queries
Дочерний элемент el
this.findChildElem('el');
this.queryChild('el');
Родительский блок Form
this.findParentBlock(Form);
this.queryParent(Form);
Блок Form на той же DOM-node
this.findMixedBlock(Form);
this.queryMix(Form);
Дочерний элемент el с модификатором mod1 в значении val1
this.findChildElem({
    elem: 'el',
    modName: 'mod1',
    modVal: 'val1'
});
this.queryChild({
    elem: 'el',
    mods: {mod1: 'val1'}
});
Дочерний элемент el без модификатора mod1
this.findChildElems('el').find(function (el) {
    return !el.hasMod('mod1');
});
this.queryChild({
    elem: 'el',
    mods: {mod1: ''}
});
или
this.queryChild({
    elem: 'el',
    mods: {mod1: false}
});
Дочерний элемент el с модификатором mod1 в любом значении
this.findChildElems('el').find(function (el) {
    return el.hasMod('mod1');
});
this.queryChild({
    elem: 'el',
    mods: {mod1: '*'}
});
Дочерние элементы el с модификатором mod1 в значении val1 либо в значении val2
this.findChildElems('el').filter(function (el) {
    return el.getMod('mod1') === 'val1' ||
            el.getMod('mod1') === 'val2';
});
this.queryChilds({
    elem: 'el',
    mods: {
        mod1: ['val1', 'val2']
    }
});
Дочерний элемент el с модификатором mod1 в значении val1 либо в значении val2, с модификатором mod2 в значении true, с модификатором mod3 в любом значении и без модификатора mod4
this.findChildElems({
    elem: 'el',
    modName: 'mod2',
    modVal: true
}).find(function (el) {
    return (el.getMod('mod1') === 'val1' ||
                el.getMod('mod1') === 'mod2') &&
            el.hasMod('mod3') &&
            !el.hasMod('mod4');
});
this.queryChild({
    elem: 'el',
    mods: {
        mod1: ['val1', 'val2'],
        mod2: true,
        mod3: '*',
        mod4: false
    }
});
Дочерний блок Button, находящийся на одной DOM-ноде с элементом control текущего блока
this.findChildElem('control')
    .findMixedBlock(Button);
this.queryChild({
    block: Button,
    mix: {elem: 'control'}
});
Дочерние элементы control текущего блока с модификатором type в значении button, находящийся на одной DOM-node с блоком Button без модификатора disabled и с блоком Widget
this.findChildElems({
    elem: 'control',
    modName: 'type',
    modVal: 'button'
}).filter(function (controlEl) {
    return !controlEl.findMixedBlock(Button) ||
            controlEl.findMixedBlock(Button)
                        .hasMod('disabled') ||
            controlEl.findMixedBlock(Widget)
})
this.queryChilds({
    elem: 'control',
    mods: {type: 'button'},
    mix: [
        {
            block: Button,
            mods: {
                disabled: false
            },
        },
        Widget
    ]
});

Примеры довольно синтетические, но из видно, что bem-dom-queries позволяет выражать даже довольно сложные запросы к DOM в простой и наглядной декларативной форме.

Демо: https://zakaratcha.github.io/bem-dom-queries/

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published