Подтвердить что ты не робот

Открыть диалог ввода файлов и загрузить 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'), потому что это не гибко и не обязательно верно.

4b9b3361

Ответ 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.