Открыть диалог ввода файлов и загрузить onchange в IE?
Это в основном и упрощено то, что у меня есть сейчас:
<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:
- Форма скрыта.
- Вы нажимаете ссылку
- Выберите диалог открытия файла
- Вы выбираете файл
- Диалог закрывается
- Форма отправлена
- Script в iframe выполняется и снижается фотография
Очень приветливый и сладкий.
В IE все работает, кроме [6]. Форма не отправляется. Ошибка Javascript: "Доступ запрещен". Неважно, как форма невидима, если диалог был открыт с помощью input.click()
, форма не может быть отправлена при изменении. (Функция onchange выполняется нормально. Ошибка возникает только при вызове form.submit()
.)
Теперь все это я могу принять. IE отстой. Я живу с ним.
Мое решение до сих пор заключалось в проверке navigator
для "MSIE", а затем при нажатии ссылки вместо открытия диалога, показывающего форму (с вводом файла). Затем пользователь должен щелкнуть фактический, уродливый ввод файла, а затем все будет работать нормально. Но уродливый.
Вопрос двоякий:
- Есть ли способ сделать это в IE так же круто, как в Chrome? БЕЗ неприятных флеш /java дерьма. Только элементы html и javascript.
- Если нет: существует ли способ проверить поддержку form.submit() после открытия диалога из ссылки (кроме
!navigator.contains("MSIE")
)?
[2] может улавливать исключение "Access denied", созданное в IE, но потом слишком поздно: пользователь уже открыл диалог и просмотрел фотографию. Ты не хочешь заставить его сделать это снова. (Даже пользователи IE этого не заслуживают.)
PS. Меня интересуют только Chrome 10+, Firefox 3.6+ и IE8 +.
PS. Может быть важно: элемент ввода файла не может находиться где-нибудь рядом с ссылкой, потому что ссылка находится внутри формы и эта форма (должна быть) отделена от формы загрузки файла.
UPDATE
Второе: обнаружите поддержку этого высокотехнологичного поведения, которое не работает в IE. Я не хочу использовать navigator.appName.contains('MSIE')
, потому что это не гибко и не обязательно верно.
Ответы
Ответ 1
Я сделал это!
http://jsfiddle.net/rudiedirkx/8hzjP/show/
<label for="picture">Upload picture</label>
<input type="file" id="picture" style="position: absolute; visibility: hidden" />
Работает IE8. Меня не волнуют другие.
Так просто =)
Ответ 2
@Rudie, здесь - Спасибо за этот код! Он отлично работает в IE и Chrome, но не в FireFox.
Мне удалось взять старый код (который работает в FF и Chrome) и объединил ваш код для MSIE.
Посмотрите здесь:
ИСПРАВЛЕНИЕ ДЛЯ IE, ХРОМА И FIREFOX
https://gist.github.com/4337047
Проблема:
Когда файл-ввод открывается через сценарий, принудительное нажатие(), IE не позволит вам отправить форму.
Если вы щелкнете файл-ввод через свою собственную мышь (чего мы не хотим), IE позволит вам отправить форму.
Обратите внимание, что IE11 на данный момент разрешает отправке формы, если поле ввода файла было изменено с помощью сценария 'click'.
Решение
(частично благодаря Rudie @Stackoverflow, https://stackoverflow.com/users/247372/rudie, http://hotblocks.nl/):
Сделайте метку для ввода в IE. Если вы нажмете на него, это заставит щелчок на поле ввода - и IE примет это (IE туманности думает, что пользователь щелкнул поле ввода, hah)
Итак, в этом ярлыке мы поместим наш собственный DIV.
Следующая проблема была, это не работает в FF. Поэтому мы сделали простую (возможную мерзкую) проверку браузера, и на основе браузера мы покажем другую кнопку.
Решение прямо здесь. Протестировано:
- Win 7 x64
- FireFox 13.01
- Chrome 23.0.1271.97 м
- IE9 в обычном режиме IE9
Другие тесты/дополнения к коду БОЛЬШЕ, чем приветствуются!
EDIT:
Процитировать Рой Маккензи
Теперь IE11 разрешает отправке формы, если поле ввода файла было изменено с помощью сценария 'click'.
Ответ 3
Странно, IE8 блокирует представление, только если там enctype="multipart/form-data"
в форме.
Один способ обхода, который работал у меня локально, заключается в добавлении "реальной" кнопки отправки, например.
<input type="submit" id="btnSubmit" value="Submit" />
Затем введите такой код:
$('btnSubmit').click();
Если это сработает, вы можете скрыть кнопку с помощью CSS, чтобы сделать ее прозрачной для пользователя.
Ответ 4
Хорошо, это ТОЧНАЯ проблема, с которой я столкнулся сейчас. И только (отвратительный) взлом, который решил решить, сделать вход [type = file] довольно большим с CSS, сделать его alpha = 0 и поместить его поверх вашего предполагаемого элемента пользовательского интерфейса.
Короче говоря, вы заставляете пользователя нажимать на уродливую кнопку "просмотр" без его/ее реализации.
Ответ 5
Попробуйте добавить тег enctype="multipart/form-data"
к элементу form
.