Skip to content

Instantly share code, notes, and snippets.

@amiskov
Last active July 11, 2016 06:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save amiskov/c35a5d4d91e0108f076c0b359a189f48 to your computer and use it in GitHub Desktop.
Save amiskov/c35a5d4d91e0108f076c0b359a189f48 to your computer and use it in GitHub Desktop.
<ul class="products js-products">
<li class="product">
<img src="trousers.jpg" alt="" class="product__img">
<button class="product__buy" data-price="120">Купить</button>
</li>
</ul>
<script>
$('.js-products').on('click', '.product__buy', function(event) { // .product__buy или .js-product-buy?
// Нужно ли давать класс с префиксом `js-` кнопке, если обработчик
// навешивается на li? Или обращаться к ней по .product__buy?
var price = $(this).data('price');
buyProduct(price); // функционал покупки
});
</script>
@amiskov
Copy link
Author

amiskov commented Jun 5, 2016

Я думаю, что js- нужно ставить только тем элементам, которые непосредственно обрабатываются яваскриптом. Если делегируем событие на детей, то используем их БЭМ-классы без дополнительного js- префикса.

@shabanovtg
Copy link

я бы ставил префикс всем элементам, которые обрабатываются js. Потому как уже из разметки понятно, что элемент участвует в js. А так есть задача поменять верстку чуть-чуть и не понятно, можно трогать классы или на них навешано что-то, надо дополнительно тестить, лезть в код и т.д. С префиксом увидел, значит точно элемент используется в js.

@amiskov
Copy link
Author

amiskov commented Jun 6, 2016

Сейчас обычно ставится айдишник родителю, а кнопке js-класс.
Если нельзя айдишник (несколько блоков на странице), то обработчик ставится на <html>.

@anastasiast
Copy link

Я тоже за то, чтобы добавлять префикс всем элементам, которые обрабатываются js. На мой взгляд, так даже проще поддерживать код, к примеру, если нужно удалить элемент с префиксом js-, то сразу понятно, что этот элемент обрабатывается яваскриптом и можно удалить ненужный  js.

@amiskov
Copy link
Author

amiskov commented Jun 6, 2016

@anastasiast @shabanovtg, вы пишете, что:

нужно добавлять префикс всем элементам, которые обрабатываются js

Однако по факту при делегировании событий обработчик навешивается только на родителя, а кнопка выбирается логически, по event.target. То есть JS-ом кнопка не обрабатывается, JS за ней следит по классу.

Но нельзя не согласиться с тем, что при поддержке, когда есть префикс на кнопке, сразу становится понятно, что этот класс присутствует в js-файле. Именно, что он там есть и менять его не стоит, а не то, что на нем навешен обработчик.

Короче, я согласен с тем, что нужно ставить префикс на все классы, которые фигурируют в js-файлах, а не только на те, на которые навшиваются обработчики. Получается, что вопрос был именно в формулировке.

В итоге получим:

<ul class="products js-products">
    <li class="product">
        <img src="trousers.jpg" alt="" class="product__img">    
        <button class="product__buy js-buy-product" data-price="120">Купить</button>
    </li>
</ul>

<script>
$('.js-products').on('click', '.js-buy-product', function(event) {
    var price = $(this).data('price');
    buyProduct(price);
});
</script>

Такую формулировку я предлагаю и закрепить в качестве стандарта. Все правильно?

@amiskov
Copy link
Author

amiskov commented Jun 6, 2016

Еще про айдишники надо подумать... Просто если у элемента стоит id, точно не ясно, используется ли он в js или это на нем якорь навешен или просто так он там стоит. А с классом js-class-name все понятно — используется в js.

@shabanovtg
Copy link

Для поддержки, можем договориться ставить рядом с id (который используется в js) класс .js-use-id или что-то в этом роде

@amiskov
Copy link
Author

amiskov commented Jul 11, 2016

Нужно ли добавлять префикс js- для темплейтов? Например:

<script id="someTemplate" type="text/x-jsrender">
    {{if name}}<p class="nearest-salon-popup__name">{{:name}}</p> {{/if}}
</script>

Он используется в JS, но это мета-информация. Никаких обработчиков нет.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment