Обработка событий диалога FileChooserDialog
Ранее обработка событий была необязательной для диалога FileChooserDialog (вызываемый браузером Gnome диалог GtkFileChooserDialog), так как метод input.click() блокировал исполнение скрипта до нажатия одной из управляющих кнопок в диалоге, таких как "Открыть" или "Отмена". Поэтому ниже представленный код в листинге 1 был актуальным.
Листинг 1 /*Форма управления для вызова диалога выбора файла */ <form id="form-filedialog-id" > <input type="button" onclick="showFileDialogVariantOne()"> <input id="input-text-id" type="text"> . . . </form> . . . showFileDialogVariantOne = function() { var inputText = document.getElementById("input-text-id"); /* Создание элемента INPUT, а тип "file" позволит вызвать FileChooserDialog */ var input = document.createElement("input"); input.type = "file"; input.style.margin = "5px"; input.style.visibility="hidden"; document.getElementById("form-filedialog-id").appendChild(input); /* Создание элемента INPUT, вызов FileChooserDialog */ input.click(); /* включение обработки события OnChange */ if( checkbox.checked == true ) { input.onchange = function() { /* Эта проверка на первый взгляд излишняя, но необходима в случае изменения правил обработки события OnChange после нажатия кнопки "Отмена" в FileChooserDialog */ if( this.value.length ) { filename.value = this.files[0].name; } } } /* определение отмены выбора файла и его ввода */ if( input.value.length == 0 ) { inputText.value = "Файл не выбран!"; inputText.disabled = false; }else{ inputText.value = this.files[0].name; inputText.disabled = false; } } |
Форма 1 |
Сегодня, если не включать обработку события ОnСhange результат работы Формы 1 будет очевидным. При нажатии любой кнопки в диалоге FileChooserDialog в её текстовом поле будет напечатано: "Файл не выбран!". В обратном случае, после нажатия в нем кнопки "Открыть" в текстовом поле Формы 1 будет напечатан выбранный файл.
Перехват нажатия кнопки Отмена во-многих браузерах не реализовано. Поэтому необходимо ввести кнопку "Submit", которая будет появляться в форме 2 после фактического выбора файла в FileChooserDialog, тем самым будем квитировать событие ОnСhange, как показано в листинге 2
Листинг 2 <form id="form-filedialog-id" > <input type="button" onclick="showFileDialogVariantTwo()"> <input id="input-text-id" type="text" > . . . </form> . . . function showFileDialogVariantTwo() { var now = new Date(); var filename = document.getElementById("input-text-two-id"); var pSubmit = document.getElementById("p-submit-two-id"); var status = document.getElementById("status-submit-two-id"); /* Создание элемента INPUT, а тип "file" позволит вызвать FileChooserDialog */ var input = document.createElement("input"); input.type = "file"; input.style.margin = "0px"; input.style.height = "0px"; input.style.display = "none"; document.getElementById("form-filedialog-two-id").appendChild(input); /* после нажатия кнопки "Открыть" в FileChooserDialog наступит событие OnChange */ input.onchange = function() { /* определение отмены выбора файла и его ввода */ if ( this.value.length > 0 ) { filename.value = this.files[0].name; pSubmit.style.display = "inline"; if( status ) status.style.display = "inline"; /* При нажатии кнопки "Submit" печатаем в форме сообщение, что идет загрузка файла. */ pSubmit.click ( function() { this.style.display = "none"; status.innerHTML = "Идет загрузка файла..."; }) } document.getElementById("button-openfile-id").style.visibility = "hidden"; }; /* При вызове диалога в текстовом поле печатем, что файл не выбран после нажатия пользователем кнопки "Отмена" в FileChooserDialog */ input.onclick = function() { filename.value = "Файл не выбран!"; }; /* Вызов FileChooserDialog */ input.click(); } |
Форма 2 |
- Библиография
- MDN.FileList
- MDN.Element Input