Я использую jQuery .on()
чтобы получить событие click для динамического элемента, например:
$("body").on("click", "#books tr", function() {
....
// generates a button
$("#result").append("<button class='upload'>Upload</button>"+
"<input type='file' class='hidden'><span></span>");
});
Затем я создаю другое .on()
которое обнаруживает щелчок на сгенерированной кнопке, используя:
$("body").on("click", ".upload", function() {
// which alters the element previously created by the .on() even before.
var input = $(this).next("input");
$(input).click();
var upload = $(input).val();
$(input).next("span").html(upload);
});
Хотя я пытаюсь обновить html
в теге span, процесс обновления происходит только один раз, когда я дважды .upload()
кнопку .upload()
.
Выбор элемента во input
теге в первый раз не обновляет span
который он должен. Повторное нажатие кнопки обновляет тег.
Проблема здесь в том, что jquery does not wait for you to finish the file selection here
Поэтому я добавил onChange method of your input type file
$('body').on("change", "#hidden", function (){
var upload = $(this).val();
$(this).next("span").html(upload);
});
У вас есть 2 события клика. Первая создает первую кнопку, а вторая - загрузку. Снимите событие on click для первого, вместо этого вы можете создать его, когда документ будет готов. Таким образом, кнопка загрузки уже будет там, и вам нужно будет только щелкнуть один раз.
Вот что я сделал бы:
$( document ).ready(function() { // <-- this is what I replaced!
// generates a button
$("#result").append("<button class='upload'>Upload</button>" +
"<input type='file' class='hidden'><span></span>");
});
$("body").on("click", ".upload", function () {
// which alters the element previously created by the .on() even before.
var input = $(this).next("input");
$(input).click();
var upload = $(input).val();
$(input).next("span").html(upload);
});