Здесь мне нужно добавить прослушиватель событий щелчка к серии элементов span с миниатюрами изображений, чтобы сделать их доступными для выбора. Они создаются динамически, когда пользователь вводит файл, используя относительную форму.
До сих пор мне удавалось ссылаться на вновь созданные дочерние узлы выходного элемента, которые их содержат.
HTML:
<div id="imageBox"><output id="list"><!-- Newly created span elements here --></output></div>
Относительный скрипт с глобальной областью действия:
var father = document.getElementById('list');
var children = father.childNodes;
Затем я обрабатывал клики глобально в прослушивателе элемента body:
document.body.addEventListener('click', function( event ) {
if (children) {
for (var i = 0; i < children.length; i++) {
children[i].addEventListener("click", function(){
if(this.style.boxShadow === '') this.style.boxShadow ='0 0 1em blue';
else this.style.boxShadow = '';}, false);
}
}
}, false);
Но, как я и ожидал, он работает, просто дважды щелкнув новый элемент.
Я попытался добавить обратный вызов функции, которая оборачивает вышеперечисленное для цикла внутри функции, которая считывает и загружает выбранный входной файл, но это не работает.
function handleFileSelect(evt) {
var files = evt.target.files; // FileList object
// Loop through the FileList and render image files as thumbnails.
for (var i = 0, f; f = files[i]; i++) {
// Only process image files.
if (!f.type.match('image.*')) {
continue;
}
var reader = new FileReader();
// Closure to capture the file information.
reader.onload = (function(theFile) {
return function(e) {
// Render thumbnail.
var span = document.createElement('span');
span.innerHTML = ['<img class="thumb" src="', e.target.result,'" title="', escape(theFile.name), '"/>'].join('');
document.getElementById('list').insertBefore(span, null);
console.log(children.length);
clickable();
};
})(f);
// Read in the image file as a data URL.
reader.readAsDataURL(f);
}
}
function clickable(){
if (children) {
for (var i = 0; i < children.length; i++) {
children[i].addEventListener("click", function(){
if(this.style.boxShadow === '') this.style.boxShadow ='0 0 1em blue';
else this.style.boxShadow = '';}, false);
}
}
}
Любая идея о том, как справиться с этим, чтобы заставить его работать одним щелчком мыши?
Скрипка:
https://jsfiddle.net/b130p9tb/2/
ПРОГРЕСС ОБНОВЛЕНИЕ:
Теперь он работает как надо, корректно реагируя на одиночное нажатие, но при попытке выбрать более одного элемента работает только на парном или нечетном значении элементов, соответственно их количеству. Например. : с одним пунктом работает нормально, а с двумя выбирается только второй. С тремя вместо этого есть только первый и третий, и так далее.
Обновленная скрипта: https://jsfiddle.net/b130p9tb/3/