Это в основном и упрощено то, что я имею сейчас:
<style>
form.noshow { height: 0; overflow: hidden; }
</style>
<form class=noshow target="SomeIframeThatExists">
<input type=file id=uf>
</form>
<a id=uflink href="/user/photo">Upload photo</a>
<script>
$('uf').addEvent('change', function(e) {
// alert('oele'); // this would work fine
this.form.submit(); // auch in IE > "Access denied" exception
});
$('uflink').addEvent('click', function(e) {
$('uf').click(); // opens file dialog in all browsers inc IE
return false;
});
</script>
Что он делает (отлично) в Chrome 11 и FF 4:
- Форма скрыта.
- Вы нажимаете на ссылку
- Откроется диалоговое окно выбора файла
- Вы выбираете файл
- Диалог закрывается
- Форма отправлена
- Выполнен скрипт в iframe и заменена фотография
Очень высокотехнологичный и сладкий.
В IE все это работает, кроме [6]. Форма не отправлена. Ошибка JavaScript: «Доступ запрещен». Неважно, как форма невидима, если диалог был открыт с input.click()
, форма не может быть отправлена при изменении. (Функция onchange выполняется нормально. Ошибка возникает только при вызове form.submit()
.)
Теперь все это я могу принять. IE отстой. Я живу с этим.
Мое решение до сих пор заключалось в проверке navigator
для «MSIE» и затем при нажатии на ссылку вместо открытия диалогового окна, показывая форму (с вводом файла). Затем пользователь должен нажать на фактический, уродливый файл ввода, и тогда все работает нормально. Но некрасиво.
Вопрос двоякий:
- Есть ли способ сделать это в IE так же круто, как в Chrome? БЕЗ противного флеша / ява хрень. Только элементы HTML и JavaScript.
- Если нет: есть ли способ проверить поддержку form.submit () после открытия диалога по ссылке (кроме
!navigator.contains("MSIE")
)?
[2] может перехватывать исключение «Отказано в доступе», сгенерированное в IE, но тогда уже слишком поздно: пользователь уже открыл диалоговое окно и перешел к фотографии. Ты не хочешь заставить его сделать это снова. (Даже пользователи IE не заслуживают этого.)
PS. Меня интересуют только Chrome 10+, Firefox 3.6+ и IE8 +.
PS. Может быть важно: элемент ввода файла не может находиться рядом со ссылкой, потому что ссылка находится внутри формы, и эта форма (должна быть) отделена от формы загрузки файла.
UPDATE
Второе лучшее: обнаружение поддержки этого высокотехнологичного поведения, которое не работает только в IE. Я не хочу использовать navigator.appName.contains('MSIE')
, потому что это не гибко и не обязательно верно.