Forum Webscript.Ru

Программирование => JavaScript & JScript => Тема начата: anterior от 01 Июля 2007, 19:26:59

Название: Upload при помощи iframe.
Отправлено: anterior от 01 Июля 2007, 19:26:59
Есть такой хтмль типа:


 
 
   
     
       
     
   
 
Прикрепленные файлы
         
       



И код на JavaScript:

function upload(form) {
  function addEvent(obj, evType, fn){
    if (obj.addEventListener) {
        obj.addEventListener(evType, fn, true);
    }
    if (obj.attachEvent) {
        obj.attachEvent(\'on\'+evType, fn);
    }
  }
  function removeEvent( obj, type, fn ) {
    if (obj.detachEvent) {
      obj.detachEvent(\'on\'+type, fn);
    }
    else {
      obj.removeEventListener(type, fn, false);
    }
  }
  function onfinish() {
    alert(window.frames[\'temp984\'].document); // вот это со 2й попытки возвращает null
    removeEvent(document.getElementById(\'temp984\'), \'load\', onfinish);
    cross = \'javascript:window.parent.onUploadSuccess(); void(0);\';
    document.getElementById(\'temp984\').src = cross;
    setTimeout(function() {
        alert(\'time!\');
        document.getElementById(\'temp984\').parentNode.removeChild(document.getElementById(\'temp984\'));
      }, 250
    );
  }

  iframe = document.createElement(\'iframe\');
  iframe.id = \'temp984\';
  iframe.name = \'temp984\';
  iframe.style.display = \'none\';
  form.parentNode.appendChild(iframe);
  window.frames[\'temp984\'].name = \'temp984\';
  form.target = \'temp984\';
  addEvent(iframe, \'load\', onfinish);
  form.submit();
}

CGI скрипт после того как загрузил файл, возвращает его размер, content-type, и т.д. или сообщение об ошибке. Вся эта информация будет лежать в window.frames[\'temp984\'].document которая описана первой строкой функции onfinish. И это работает но только для первой загрузки файла, все остальные попытки оканчиваются неудачно т.к. window.frames[\'temp984\'].document почему-то возвращает null в той самой первой строке ф-и onfinish. Почему так я не понимаю. А если например вместо удаления фрейма после загрузки файла переименовать его(iframe.id = \'\'; iframe.name = \'\') то повторные загрузки файла оканчиваются успешно но функция onfinish вызывается почему-то 2 раза и показывает информацию о последнем и предыдущем загруженном файле. Ошибок в CGI скрипте нет. Проверено! Браузер FF. Буду очень признателен если кто-нибудь скажет в чем моя ошибка.
Название: Upload при помощи iframe.
Отправлено: ondr от 01 Июля 2007, 20:59:50
imho: Данный вариант сложен и все ошибки трудно будет устранить.

Опиши, что хочется получить и для чего.
Название: Upload при помощи iframe.
Отправлено: anterior от 02 Июля 2007, 05:20:31
Хочется асинхронно загрузить файл (несколько файлов), затем после загрузки показать информацию о файле, его размере, имени, и т.д.
Название: Upload при помощи iframe.
Отправлено: ondr от 02 Июля 2007, 06:10:54
Убери событие onchange. Добавь кнопку, типа submit.
Создай iframe раз и навсегда (без javascript\'а). Параметр src обязателен. Направь в iframe выдачу ответа с помощью target в форме.

Вот и все, ответ будет загружаться в iframe.

Определи onload событие у элемента iframe: onload="alert(this.contentWindow.document.body.innerHTML)". Это пример.
Вообще, передавать можно любые данные, тщательно их экранировав (например преобразовав к формату, понимаемому методом decodeURIComponent).

ps: однако, данный способ угробит встроенную навигацию в браузере.
Название: Upload при помощи iframe.
Отправлено: anterior от 02 Июля 2007, 15:04:06
Пасибачки, разобрался