Forum Webscript.Ru
Программирование => JavaScript & JScript => Тема начата: 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. Буду очень признателен если кто-нибудь скажет в чем моя ошибка.
-
imho: Данный вариант сложен и все ошибки трудно будет устранить.
Опиши, что хочется получить и для чего.
-
Хочется асинхронно загрузить файл (несколько файлов), затем после загрузки показать информацию о файле, его размере, имени, и т.д.
-
Убери событие onchange. Добавь кнопку, типа submit.
Создай iframe раз и навсегда (без javascript\'а). Параметр src обязателен. Направь в iframe выдачу ответа с помощью target в форме.
Вот и все, ответ будет загружаться в iframe.
Определи onload событие у элемента iframe: onload="alert(this.contentWindow.document.body.innerHTML)". Это пример.
Вообще, передавать можно любые данные, тщательно их экранировав (например преобразовав к формату, понимаемому методом decodeURIComponent).
ps: однако, данный способ угробит встроенную навигацию в браузере.
-
Пасибачки, разобрался