Диалоговое окно открытия файла в JavaScript - PullRequest
89 голосов
/ 12 января 2010

Мне нужно решение для отображения диалогового окна открытия файла в HTML при нажатии div. Диалоговое окно открытия файла должно открываться при нажатии div.

Я не хочу отображать поле входного файла как часть HTML-страницы. Он должен отображаться в отдельном диалоговом окне, которое не является частью веб-страницы.

Ответы [ 12 ]

72 голосов
/ 15 сентября 2012

    $("#logo").css('opacity','0');
    
    $("#select_logo").click(function(e){
       e.preventDefault();
       $("#logo").trigger('click');
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a href="#" id="select_logo">Select Logo</a> <input type="file" id="logo">

для IE добавить это:

$("#logo").css('filter','alpha(opacity = 0');
47 голосов
/ 21 января 2015

Я не знаю, почему никто не указал на это, но вот способ сделать это без Javascript, и он также совместим с любым браузером.


РЕДАКТИРОВАТЬ: В Safari, input отключается при скрытии с display: none. Лучшим подходом было бы использовать position: fixed; top: -100em.


<label>
  Open file dialog
  <input type="file" style="position: fixed; top: -100em">
</label>

Если вы предпочитаете, вы можете пойти по «1011 *« правильному пути », используя for в label, указывая на id ввода следующим образом:

<label for="inputId">file dialog</label>
<input id="inputId" type="file" style="position: fixed; top: -100em">
47 голосов
/ 12 января 2010

Вот хороший

Демонстрация Fine Uploader

Это <input type='file' /> элемент управления. Но div помещается поверх этого, и стили CSS применяются, чтобы получить такое ощущение. Непрозрачность элемента управления файлом установлена ​​на 0, поэтому при нажатии на div открывается диалоговое окно.

35 голосов
/ 16 июля 2014

На самом деле, вам не нужны все эти вещи с непрозрачностью, видимостью, <input> стилем и т. Д. Просто посмотрите:

<a href="#">Just click me.</a>
<script type="text/javascript">
    $("a").click(function() {
        // creating input on-the-fly
        var input = $(document.createElement("input"));
        input.attr("type", "file");
        // add onchange handler if you wish to get the file :)
        input.trigger("click"); // opening dialog
        return false; // avoiding navigation
    });
</script>

Демонстрация по jsFiddle . Протестировано в Chrome 30.0 и Firefox 24.0. Однако в Opera 12.16 не работал.

14 голосов
/ 19 июня 2015

Это то, что лучше всего сработало для меня (протестировано на IE8, FF, Chrome, Safari).

#file-input {
  cursor: pointer;
  outline: none;
  position: absolute;
  top: 0;
  left: 0;
  width: 0;
  height: 0;
  overflow: hidden;
  filter: alpha(opacity=0); /* IE < 9 */
  opacity: 0;
}
.input-label {
  cursor: pointer;
  position: relative;
  display: inline-block;
}
<label for="file-input" class="input-label">
  Click Me <!-- Replace with whatever text or icon you wish to use -->
  <input type="file" id="file-input">
</label>

Пояснение: Я поместил файл ввода непосредственно над элементом, по которому нужно щелкнуть, поэтому любые щелчки будут либо попадать на него, либо на его ярлык (который вызывает диалог загрузки, как если бы вы щелкнули сам ярлык). У меня были некоторые проблемы с тем, что часть кнопки ввода по умолчанию торчала из боковой части метки, поэтому overflow: hidden на входе и display: inline-block на метке были необходимы.

12 голосов
/ 13 марта 2015

Что если javascript выключен на клиентском компьютере? Используйте следующее решение для всех сценариев. Вам даже не нужен javascript / jQuery. :

HTML

<label for="fileInput"><img src="File_upload_Img"><label>
<input type="file" id="fileInput"></label>

CSS

#fileInput{opacity:0}  
body{
    background:cadetblue;
}

Объяснение: for="Your input Id". Запускает событие клика по умолчанию по HTML. Таким образом, по умолчанию запускается событие click, нет необходимости в jQuery / javascript. Если это просто сделано HTML, зачем использовать jQuery / jScript? И вы не можете сказать, если клиент отключил JS. Ваша функция должна работать, даже если JS выключен.

Рабочая jsFiddle (Вам не нужен JS, jquery)

10 голосов
/ 20 апреля 2014

Сначала добавьте в заголовок теги:

<script>
   function showDialog(openFileDialog) {
       document.getElementById(openFileDialog).click();
   }
   function fileName(openFileDialog) {
       return document.getElementById(openFileDialog).value;
   }
   function hasFile(openFileDialog) {
       return document.getElementById(openFileDialog).value != "";
   }
   function fileNameWithoutFakePath(openFileDialog) {
       var fileName = document.getElementById(openFileDialog).value;
       return fileName.substr(fileName.lastIndexOf('\\') + 1);
   }
   function fakePathWithoutFileName(openFileDialog) {
       var fileName = document.getElementById(openFileDialog).value;
       return fileName.substr(0, fileName.lastIndexOf('\\'));
   }
</script>

если у вас уже есть теги script , просто добавьте эти функции выше.

В вашем теле или форме добавление тегов:

<input type="file" style="display:none" id="yourDesiredOrFavoriteNameForTheNewOpenFileDialogInstance"/>

Неважно, где в вашем html просто похоже на , вы создали новый экземпляр класса OpenFileDialog типа как глобальная переменная, имя которой - id элемента, независимо от того, где в вашем коде или xaml, , но в вашем скрипте или коде, вы не можете ввести его имя, а затем прочитать свойство или вызвать функция, потому что есть глобальные функции, которые выполняют те, которые не определены в элементе input type = "file". Вам просто нужно дать этим функциям идентификатор скрытого ввода type = "file", который является именем экземпляра OpenFileDialog в виде строки.

Чтобы упростить свою жизнь при создании экземпляров открытых файловых диалогов в html, вы можете сделать функцию, которая это делает:

function createAndAddNewOpenFileDialog(name) {
     document.getElementById("yourBodyOrFormId").innerHtml += "<input type='file' style='display:none' id='" + name + "'/>"
}

и если вы хотите удалить диалог открытия файла, то вы можете создать и использовать следующую функцию:

function removeOpenFileDialog(name) {
    var html = document.getElementById("yourBodyOrFormId").innerHtml;
    html = html.replace("<input type='file' style='display:none' id='" + name + "'/>", "");
    document.getElementById("yourBodyOrFormId").innerHtml = html;
}

но перед тем как удалить диалоговое окно открытия файла, убедитесь, что он существует, выполнив и используя следующую функцию:

function doesOpenFileDialogExist(name) {
    return document.getElementById("yourBodyOrFormId").innerHtml.indexOf("<input type='file' style='display:none' id='" + name + "'/>") != -1
}

и если вы не хотите создавать и добавлять диалоговые окна открытия файлов в тегах body или form в html, потому что это добавляет скрытый файл ввода type = "file "s, то вы можете сделать это в скрипте, используя вышеописанную функцию создания:

function yourBodyOrFormId_onload() {
    createAndAddNewOpenFileDialog("openFileDialog1");
    createAndAddNewOpenFileDialog("openFileDialog2");
    createAndAddNewOpenFileDialog("openFileDialog3");
    createAndAddNewOpenFileDialog("File Upload");
    createAndAddNewOpenFileDialog("Image Upload");
    createAndAddNewOpenFileDialog("bla");
    //etc and rest of your code
}

Убедитесь, что рядом с тегами тела или формы вы добавили:

onload="yourBodyOrFormId_onload()"

Вам не нужно делать эту строку выше, если вы уже сделали это.

СОВЕТ: Вы можете добавить в свой проект или веб-сайт новый JScript-файл, если у вас его еще нет, и в этом файле вы можете убрать все функции диалога открытия файла из Сценарий теги и HTML-страницу или страницу веб-формы, и используйте их на своей HTML-странице или странице веб-формы из этого файла JScript, но не забудьте прежде связать страницу HTML или веб-формы с файлом JScript, конечно. Вы можете сделать это, просто перетащив файл JScript на свою HTML-страницу в тегах head . Если ваша страница представляет собой веб-форму, а не простой HTML, и у вас нет заголовков, то поместите ее где угодно, чтобы она могла работать. Не забудьте определить глобальную переменную в этом файле JScript, значением которой будет ваше тело или идентификатор формы в виде строки. После того, как вы связали JScript-файл со своей HTML-страницей или страницей веб-формы, вы можете загрузить событие вашего тела формы, установить значение этой переменной для своего тела или идентификатора формы. Затем в файле JScript вам больше не нужно присваивать документу идентификатор тела или формы одной страницы, просто присвойте ему значение этой переменной. Вы можете вызвать эту переменную bodyId или formId или bodyOrFormId или любое другое имя по вашему желанию.

Удачи, мужик!

4 голосов
/ 24 октября 2010

Может быть, вас это заинтересует: http://code.google.com/p/upload-at-click/

При нажатии на элемент откроется диалоговое окно «Открыть файл» и

запустить пользовательскую функцию.

3 голосов
/ 03 ноября 2017

Самый простой способ:

#fileInput {
  display: none;
}
<label for="fileInput">
  <div>Click this div and select a file</div>
</label>
<input type="file" id="fileInput"/>

Что важно, использование display: none гарантирует, что никакие места не будут заняты скрытым вводом файла (что происходит при использовании opacity: 0).

3 голосов
/ 12 января 2010

AFAIK, вам все еще нужен элемент <input type="file">, тогда вы можете использовать некоторые вещи из quirksmode , чтобы придать ему стиль

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...