Как грамотно задать элементу событие onclick

Обратите внимание на html разметку, меня интересует как правильно задать onclick элементу. Сделал три варианта, они все работают. В силу того, что я недавно начал изучение JS, я не могу понять какой из этих вариантов более грамотный.

function one(){
alert('Do you like, what you see?')
}

function two(){
alert('1000-7')
}

let three = document.querySelector('.block3');

three.onclick = function (){
alert('It gets bigger, when i pull on it');
}
.block1{
margin-top:10px;
padding:10px;
border: 3px solid black;
}

.block2{
margin-top:10px;
padding:10px;
border: 3px solid black;
}

.block3{
margin-top:10px;
padding:10px;
border: 3px solid black;
}
<div class ="block1" onclick ="one()"> 1 вариант </div>  <!-- 1 вариант  -->
<div class ="block2" onclick = two() > 2 вариант </div>  <!-- 2 вариант  -->
<div class ="block3"> 3 вариант </div>                   <!-- 3 вариант  -->


Ответы (2 шт):

Автор решения: nazarpunk

Используйте всплытие, чтоб событие могло срабатывать на динамически созданных элементах.

const message = msg => {
  switch (msg) {
    case `one`:
      return `Do you like, what you see?`;
    case `two`:
      return `1000-7`;
    case `three`:
      return `It gets bigger, when i pull on it`;
    default:
      return `Ошибка`;
  }
}

addEventListener(`click`, e => {
  const $target = e.target.closest(`.block`);
  if (!$target) return;

  alert(message($target.dataset.alert));
})
.block {
  margin-top: 10px;
  padding: 10px;
  border: 3px solid black;
  cursor: pointer;
}
<div class="block" data-alert="one"> 1 вариант </div>
<div class="block" data-alert="two"> 2 вариант </div>
<div class="block" data-alert="three"> 3 вариант </div>
<div class="block"> неопознанный вариант </div>

→ Ссылка
Автор решения: WalkMess

По клику был дан ответ, но я объясню.

Инициализация переменной: const переменная = document.функцияВыборки(Вызов с нужным параметром); 


init: const buttonRight = document.querySelector('.buttonRight'); 

Следующим шагом мы должны подписаться на событие у нашего элемента.

:exp: элемент.функцияПодпискиНаСобытие(нужный параметр-событие () => вызов функции, которая отработает в момент события);  


:exp: buttonRight.addEventListener('event', (e) => main(e)); 

Уточню, что в данном случае мы слушаем событие у фрагмента типа element.

Сейчас при нажатии на нашу кнопку, которую мы получили ранее сработает event, когда он будет выполнен, мы вызываем анонимную функцию, которая в свою очередь вернет главную функцию, она же в свою очередь сначала вызывается.

Есть более устаревшая/ситуативная вариация с записью.

:exp: buttonRight.addEventListener('click', (e) => {console.log(e);}); 
:exp: buttonRight.addEventListener('click', fc);  
:exp: buttonRight.addEventListener('click', function() {}); 
  1. Пишем функцию внутри обработчика.
  2. Вызываем функцию внутри обработчика без параметров.
  3. Пишем не стрелочную функцию внутри обработчика.

Теперь решим вашу задачу:

const DATAONE = "one";
const DATATWO = "two";
const DATATHEREE = "three";

addEventListener(`click`, e => {
  const block = e.target.closest(`.block`);

  if (!block) {
    return alert("Error");
  }

  const { alert: dataset } = block.dataset;
  if (DATAONE === dataset) {
    return alert(DATAONE);
  } else if (DATATWO === dataset) {
    return alert(DATATWO);
  } else if (DATATHEREE === dataset) {
    return alert(DATATHEREE);
  }
});
<div class="block" data-alert="one"> 1 вариант </div>
<div class="block" data-alert="two"> 2 вариант </div>
<div class="block" data-alert="three"> 3 вариант </div> 

→ Ссылка