Я пытаюсь сделать виджет, который проще всего описать как интерактивный список медиа-объектов начальной загрузки. https://getbootstrap.com/docs/4.3/components/media-object/#media-list В исходном коде событие js click связано с самим элементом элемента списка.
Моей первой мыслью было обернуть все внутри элемента элемента списка в элемент кнопки и прикрепить мое событие нажатия к кнопке. Это дает фокус на элемент списка и действует так, как я бы этого хотел. Но потом я прочитал, что это плохая практика - иметь внутри тега кнопки такие вещи, как теги div или h.
<ul class="list-unstyled">
<li class="media" onclick="myFunction">
<img src="..." class="mr-3" alt="...">
<div class="media-body">
<h5 class="mt-0 mb-1">List-based media object</h5>
More info
</div>
</li>
</ul>
VS
<ul class="list-unstyled">
<li>
<button type="button" class="media" onclick="myFunction" disabled="isDisabled()">
<img src="..." class="mr-3" alt="...">
<div class="media-body">
<h5 class="mt-0 mb-1">List-based media object</h5>
More info
</div>
</button>
</li>
</ul>
Так что на данный момент есть еще один способ сделать всю строку элемента списка интерактивной с помощью семантического html, или мой лучший вариант - добавить роль role =, события onkeypress для пробела и ввода, настраиваемые активные / отключенные классы и установить tabIndex для тега li?
Редактировать: Возможно, еще один способ думать о дизайне - это с этим компонентом https://getbootstrap.com/docs/4.3/components/list-group/#links-and-buttons. По сути, дизайн, который я пытаюсь сохранить, - это набор кликабельных строк, где каждая строка содержит изображение и пару коротких строки текста.