Минимальный пример:
<title>a</title>
<body>
<script>
document.body.appendChild(
Object.assign(document.createElement('button'),{
textContent:'A',
onclick(){
// increase the failure rate
//let a=[...Array(1000000)]
let input=document.createElement('input')
Object.assign(input,{
type:'file',
oninput(){
console.log('input')
},
}).click()
// decrease the failure rate (can be considered as "to zero")
//console.log(input)
console.log('click')
},
})
)
</script>
При нажатии кнопки создается и щелкается <input type=file>
, в результате чего создается диалоговое окно файла.
КОНЕЦ ПРИМЕРА
Я думаю, что событие 'input' всегда должно запускаться после выбора файла в этом диалоговом окне; но иногда это не так.
Хром: иногда выделяется
Firefox: всегда излучаемый
Сафари: иногда выбрасывают
Предполагается, что это явление связано со сборкой мусора, поскольку let a=[...Array(1000000)]
, по-видимому, увеличивает вероятность того, что событие input не будет отправлено; в то время как console.log(input)
делает обратное.
Это определенное поведение для генерации события на DOM-узле, который не является потомком документа? Если он определен, и больше ничего не происходит, я бы рассматривал это явление как результат ошибки Chromium и Safari.