Почему событие не вызвало бесконечного цикла?

var domInner = document.querySelector('#inner')
var domWrapper = document.querySelector('#wrapper')
domInner.onclick = innerHandler
function innerHandler () {
  console.log('inner')
}
domWrapper.onclick = wrapperHandler
function wrapperHandler () {
  // setTimeout(() => {
    console.log('wrapper')
    domInner.click()
  // }, 1000)
}
domInner.click()
<div id="wrapper">
  wrapper
  <div id="inner">
    inner
  </div>
</div>

Как мы видим, domInner.click() в функции wrapperHandler не срабатывает событие нажатия domInner.

Раньше я думал, что так и будет, и событие click domInner будет распространяться на domWrapper, так что это может вызвать бесконечный цикл.

Но это не так. Итак, в чем причина?

После того, как я открыл setTimeout, это произойдет.

Почему domInner.click() в функции wrapperHandler снова не запускается событие click domInner? А почему событие не вызывает бесконечный цикл?

Спасибо.

1 ответ

Если вы вручную нажмете на свой внутренний элемент, вы заметите, что он заставляет ваши журналы дважды срабатывать. Один раз для фактического элемента click, затем снова для "смоделированного" элемента, с которым вы сработали element.click(),

Почему он не зацикливается? Что ж, похоже, что "симулированный" щелчок может быть выдан только один раз за элемент за итерацию цикла события. Попытки испустить его снова из того же элемента в той же итерации будут игнорироваться. Причина, по которой это позволяет, когда вы ставите setTimeout там, потому что setTimeout ставит его на более позднюю итерацию цикла событий.

Это, кажется, функция, встроенная в element.click метод, вероятно, с явной целью предотвращения таких бесконечных циклов. К сожалению, документация по MDN не особенно детализирована, и я не уверен, где еще копать, чтобы подтвердить.

Другие вопросы по тегам