× К оглавлению На главную Об авторе

Обработка событий диалога 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