How to open select file dialog via js?

前端 未结 9 1699
伪装坚强ぢ
伪装坚强ぢ 2021-01-30 06:16
$(\'#id\').click();

It doesn\'t work on Chrome 26 on Mac OS.

The problem actually is creation "upload" widget that can be integrated in

相关标签:
9条回答
  • 2021-01-30 06:55

    With jquery library

    <button onclick="$('.inputFile').click();">Select File ...</button>
    <input class="inputFile" type="file" style="display: none;">
    
    0 讨论(0)
  • 2021-01-30 06:59

    function promptFile(contentType, multiple) {
      var input = document.createElement("input");
      input.type = "file";
      input.multiple = multiple;
      input.accept = contentType;
      return new Promise(function(resolve) {
        document.activeElement.onfocus = function() {
          document.activeElement.onfocus = null;
          setTimeout(resolve, 500);
        };
        input.onchange = function() {
          var files = Array.from(input.files);
          if (multiple)
            return resolve(files);
          resolve(files[0]);
        };
        input.click();
      });
    }
    function promptFilename() {
      promptFile().then(function(file) {
        document.querySelector("span").innerText = file && file.name || "no file selected";
      });
    }
    <button onclick="promptFilename()">Open</button>
    <span></span>

    0 讨论(0)
  • 2021-01-30 07:09

    Using jQuery

    I would create a button and an invisible input like so:

    <button id="button">Open</button>
    <input id="file-input" type="file" name="name" style="display: none;" />
    

    and add some jQuery to trigger it:

    $('#button').on('click', function() {
        $('#file-input').trigger('click');
    });
    

    Using Vanilla JS

    Same idea, without jQuery (credits to @Pascale):

    <button onclick="document.getElementById('file-input').click();">Open</button>
    <input id="file-input" type="file" name="name" style="display: none;" />
    
    0 讨论(0)
  • 2021-01-30 07:09

    For the sake of completeness, Ron van der Heijden's solution in pure JavaScript:

    <button onclick="document.querySelector('.inputFile').click();">Select File ...</button>
    <input class="inputFile" type="file" style="display: none;">
    
    0 讨论(0)
  • 2021-01-30 07:16

    JS only - no need for jquery

    Simply create an input element and trigger the click.

    var input = document.createElement('input');
    input.type = 'file';
    input.click();
    

    This is the most basic, pop a select-a-file dialog, but its no use for anything without handling the selected file...

    Handling the files

    Adding an onchange event to the newly created input would allow us to do stuff once the user has selected the file.

    var input = document.createElement('input');
    input.type = 'file';
    
    input.onchange = e => { 
       var file = e.target.files[0]; 
    }
    
    input.click();
    

    At the moment we have the file variable storing various information :

    file.name // the file's name including extension
    file.size // the size in bytes
    file.type // file type ex. 'application/pdf'
    

    Great!

    But, what if we need the content of the file?

    In order to get to the actual content of the file, for various reasons. place an image, load into canvas, create a window with Base64 data url, etc. we would need to use the FileReader API

    We would create an instance of the FileReader, and load our user selected file reference to it.

    var input = document.createElement('input');
    input.type = 'file';
    
    input.onchange = e => { 
    
       // getting a hold of the file reference
       var file = e.target.files[0]; 
    
       // setting up the reader
       var reader = new FileReader();
       reader.readAsText(file,'UTF-8');
    
       // here we tell the reader what to do when it's done reading...
       reader.onload = readerEvent => {
          var content = readerEvent.target.result; // this is the content!
          console.log( content );
       }
    
    }
    
    input.click();
    

    Trying pasting the above code into your devtool's console window, it should produce a select-a-file dialog, after selecting the file, the console should now print the contents of the file.

    Example - "Stackoverflow's new background image!"

    Let's try to create a file select dialog to change stackoverflows background image to something more spicy...

    var input = document.createElement('input');
    input.type = 'file';
    
    input.onchange = e => { 
    
       // getting a hold of the file reference
       var file = e.target.files[0]; 
    
       // setting up the reader
       var reader = new FileReader();
       reader.readAsDataURL(file); // this is reading as data url
    
       // here we tell the reader what to do when it's done reading...
       reader.onload = readerEvent => {
          var content = readerEvent.target.result; // this is the content!
          document.querySelector('#content').style.backgroundImage = 'url('+ content +')';
       }
    
    }
    
    input.click();
    

    open devtools, and paste the above code into console window, this should pop a select-a-file dialog, upon selecting an image, stackoverflows content box background should change to the image selected.

    Cheers!

    0 讨论(0)
  • 2021-01-30 07:16

    READY TO USE FUNCTION (using Promise)

    /**
     * Select file(s).
     * @param {String} contentType The content type of files you wish to select. For instance "image/*" to select all kinds of images.
     * @param {Boolean} multiple Indicates if the user can select multiples file.
     * @returns {Promise<File|File[]>} A promise of a file or array of files in case the multiple parameter is true.
     */
    function (contentType, multiple){
        return new Promise(resolve => {
            let input = document.createElement('input');
            input.type = 'file';
            input.multiple = multiple;
            input.accept = contentType;
    
            input.onchange = _ => {
                let files = Array.from(input.files);
                if (multiple)
                    resolve(files);
                else
                    resolve(files[0]);
            };
    
            input.click();
        });
    }
    

    TEST IT

    // Content wrapper element
    let contentElement = document.getElementById("content");
    
    // Button callback
    async function onButtonClicked(){
        let files = await selectFile("image/*", true);
        contentElement.innerHTML = files.map(file => `<img src="${URL.createObjectURL(file)}" style="width: 100px; height: 100px;">`).join('');
    }
    
    // ---- function definition ----
    function selectFile (contentType, multiple){
        return new Promise(resolve => {
            let input = document.createElement('input');
            input.type = 'file';
            input.multiple = multiple;
            input.accept = contentType;
    
            input.onchange = _ => {
                let files = Array.from(input.files);
                if (multiple)
                    resolve(files);
                else
                    resolve(files[0]);
            };
    
            input.click();
        });
    }
    <button onclick="onButtonClicked()">Select images</button>
    <div id="content"></div>

    0 讨论(0)
提交回复
热议问题