Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как ОТВЕЧАТЬ на событие щелчка по типу ввода = файлу в браузерах, отличных от IE

Автор вопроса: mhildrethОтветов: 3

Итак, вот сценарий-

В отличие от 3000 других вопросов на StackOverflow о том, как ВЫЗВАТЬ событие click для элемента input[type=file], я просто хочу ответить на него. Я ищу что-то вроде:

<input id="theFile" onclick="var that=this;setTimeout(function(){if(that.value){postTheForm();}}),0);" />

Я не пытаюсь вызвать click() для элемента, я просто хочу знать, когда кто-то выбрал файл, чтобы мы могли отправить форму. В IE это работает так, как ожидалось, потому что диалоговое окно файла приостанавливает поток javascript до тех пор, пока пользователь не нажмет "Открыть" или "Отмена" в диалоговом окне. В FireFox кажется, что диалог не спит поток, и анонимная функция срабатывает немедленно - даже когда диалог все еще активен.

Я подумал, могу ли я использовать событие onchange или что-то еще в FireFox для имитации поведения IE, но пока мне не повезло. Любые идеи относительно того, как я могу выполнить код ПОСЛЕ того, как пользователь нажимает "Открыть" или "Отмена" в диалоговом окне?

  • вы можете сфокусировать элемент управления, а затем, когда диалоговое окно будет закрыто, вы можете ответить на событие размытия элемента управления загрузкой файла. Смотрите мой ответ ниже. The Muffin Man 02.03.2011

javascriptfileinputfile-uploadfirefox

Ответы

Ответ 1 · Detect

используйте 1_

Ответ 2 · рейтинг 1 · The Muffin Man

Когда вы нажимаете на загрузку файла, скажите jQuery, чтобы сфокусировать его, когда вы выберете файл и нажмете открыть/отменить, он потеряет фокус, также известный как blur.

$(function() {
    $("#fileUpload").click(function() {
        $(this).focus();
    });
    $("#fileUpload").blur(function() {
        alert("blurred");
    });
});

Я тестировал это в хроме.

Ответ 3 · Pointy

Ну, вы можете запустить интервальный таймер, чтобы просто проверять каждые 100 миллисекунд или около того.

$('input:file').click(function() {
  var file = this, form = this.form, val = this.value, interval;
  function checkValue() {
    if (file.value !== val) {
      cancelInterval(interval);
      form.submit();
    }
  }
  interval = setInterval(checkValue, 100);
});

Дело в том, что это немного хрупко, потому что "значение" входного файла не является полным путем. Однако, поскольку вы все равно отправляете всю форму, у пользователя действительно нет возможности щелкнуть элемент файла более одного раза.

изменить это предполагает, что событие "изменить" действительно не работает для вас; У меня сейчас нет Firefox, чтобы посмотреть.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы