Предполагая, что FORM содержит INPUT, есть следующие слушатели:
Javascript
function formFirst(e) { ... }
function formLast(e) { ... }
function inputFirst(e) { ... }
function inputLast(e) { ... }
function middle(e) { ... }
document.getElementById('form').addEventListener('change',formFirst,true);
document.getElementById('form').addEventListener('change',formLast,false);
document.getElementById('input').addEventListener('change',inputFirst,true);
document.getElementById('input').addEventListener('change',inputLast,false);
желаемый порядок стрельбы
formFirst() // normal - outer element, useCapture = true
inputFirst() // normal - triggering element, declared first
middle() // -- how to do this?
inputLast() // normal - triggering element, declared second
formLast() // normal - outer element, useCapture = false
характер проблемы и попытки решения
Собственный код на уровне FORM, formFirst
, formLast
и middle
, но не имеет доступа к коду INPUT, inputFirst
и inputLast
- хотя может добавить собственных слушателей на входе.
Попытка 1 изменить formFirst()
для создания и отправки нового change Event
(будет игнорироваться в formFirst
), который будет вызывать inputFirst()
, но не сможет остановить распространение для предотвращения inputLast()
вызывается впоследствии.
Попытка 2 add middle
добавлена как слушатель INPUT, но не может гарантировать порядок запуска двух слушателей одного типа и одного и того же useCapture.
<ч />
Предпосылка попытки 2 неверна - порядок стрельбы определяется порядком объявления в целевом элементе.
Вот правила
нецелевой элемент срабатывает с useCapture=false
, начиная с самого дальнего элемента и двигаясь к целевому элементу
а) если более одного useCapture=true
срабатывает для одного и того же элемента, то порядок объявления.
у целевого элемента, порядок объявления, независимо от useCapture
нецелевой элемент срабатывает с useCapture=false
, начиная с самого внутреннего элемента и удаляясь от целевого элемента
a) если более одного useCapture=false
запускает один и тот же элемент, то порядок объявления.