Я срываю волосы с этой проблемой селектора jQuery. Я написал некоторый код, чтобы пользователь перетащил файл на страницу, в нем появилось диалоговое окно jQuery, в котором отображается список файлов, которые были перетащены с помощью некоторых кнопок для управления списком. Если этот диалог открыт, то следующий файл, который выпадает, должен обновить диалог (который в настоящее время открыт). Код выглядит следующим образом:
$(document).ready(function() {
var updateDialog = function () {
....
$("#my-selector").text(getMyString());
};
setDragDropHandler("#main-dropzone", function (f) {
doSomethingWithFiles(f);
$("#my-dialog").dialog("open");
});
$("#my-dialog").dialog({
...
open: function () {
updateDialog();
setDragDropHandler("#dialog-dropzone", function (f) {
doSomethingWithFiles(f);
updateDialog();
});
}
});
});
EDIT: Я забыл упомянуть, что мой setDragDropHandler
берет селектор для div, который он заменяет div, в котором говорится "Отбросьте файлы здесь" с помощью replaceWith
пока файлы перетаскиваются, но затем заменяет его при удалении файлов. #my-selector
- дочерний элемент #dialog-dropzone
, поэтому он заканчивается тем, что его заменяют.
Когда я перетаскиваю первый файл, диалоговое окно открывается отлично и помещает нужный текст в # my-selector. Когда я перетаскиваю следующий файл, в то время как диалог открыт, $("#my-selector")[0]
не определен, поэтому диалог не обновляется. Если я делаю следующее, он работает так, как ожидалось:
$(document).ready(function() {
var stupidHack = $("#my-selector");
var updateDialog = function () {
....
stupidHack.text(getMyString());
};
// rest is the same
});
Как вы можете сказать по моему имени переменной, я не являюсь поклонником этого решения. Может ли кто-нибудь объяснить, почему одна версия не удается?
Бла, мой обработчик перетаскивания вызывал обратный вызов перед заменой элементов DOM. К сожалению...