// select all `` elements with the class `dropzone-input` and operate on each of them document.querySelectorAll(".dropzone-input").forEach((inputEl) => { // select the element's (closest) parent with the class name `dropzone` (the element with the actual "dropzone" functionality) const dropZoneEl = inputEl.closest(".dropzone"); // select the element's (closest) parent with the class name `dropzone-form` (the container of all "dropzone" functionality and the form action, in our case this is the same element) const dropZoneFormEl = inputEl.closest(".dropzone-form"); // select the info text element inside the container const dropZoneTextEl = dropZoneFormEl.querySelector(".dropzone-txt") // add a `click` event listener on the dropzone to trigger the input's click event dropZoneEl.addEventListener("click", (e) => { inputEl.click(); }); // add a `change` event listener inputEl.addEventListener("change", (e) => { e.preventDefault(); console.log("change") if (inputEl.files.length) { // change info text dropZoneTextEl.innerHTML = "Uploading file ..."; // submit form dropZoneFormEl.submit(); } }); // add to class list when we drag over the element dropZoneEl.addEventListener("dragover", (e) => { e.preventDefault(); dropZoneEl.classList.add("dropzone--over"); }); // remove from class list when we leave or stop dragging ["dragleave", "dragend"].forEach((type) => { dropZoneEl.addEventListener(type, (e) => { e.preventDefault(); dropZoneEl.classList.remove("dropzone--over"); }); }); dropZoneEl.addEventListener("drop", (e) => { e.preventDefault(); if (e.dataTransfer.files.length) { inputEl.files = e.dataTransfer.files; dropZoneTextEl.innerHTML = "Uploading file ..."; dropZoneFormEl.submit(); } dropZoneEl.classList.remove("dropzone--over"); }); });