Предположим, что 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
, хотя может добавлять собственных слушателей на INPUT.
Попытка 1 изменить formFirst()
для создания и отправки нового change Event
(будет игнорироваться в formFirst
), который будет вызывать inputFirst()
, но не имеет возможности остановить распространение, чтобы предотвратить последующий вызов inputLast()
.
Попытка 2 добавить middle
в качестве слушателя к INPUT, но не может гарантировать порядок срабатывания двух слушателей одного типа и одного и того же useCapture.
Предпосылка Попытки 2 неверна - порядок срабатывания определяется порядком объявления в целевом элементе.
Вот правила
нецелевой элемент срабатывает с
useCapture=false
, начиная с самого внешнего элемента и работая в направлении целевого элементаа) если для одного и того же элемента срабатывает более одного
useCapture=true
, то порядок объявления.в целевом элементе, порядок объявления, независимо от
useCapture
нецелевой элемент срабатывает с
useCapture=false
, начиная с самого внутреннего элемента и работая дальше от целевого элементаа) если для одного и того же Элемента срабатывает более одного
useCapture=false
, то порядок объявления.