프로그래밍 방식으로 "파일 선택"대화 상자 트리거


100

숨겨진 파일 입력 요소가 있습니다. 버튼의 클릭 이벤트에서 파일 선택 대화 상자 를 트리거 할 수 있습니까?

답변:


146

를 사용하는 대신 파일을 업로드 할 수있는 자체 버튼을 찾고 있다면 <input type="file" />다음과 같이 할 수 있습니다.

<input id="myInput" type="file" style="visibility:hidden" />
<input type="button" value="Show Dialog" onclick="$('#myInput').click();" />

내가 사용합니다 visibility: hidden대신, display: none. 표시되지 않는 파일 입력에 대해서는 클릭 이벤트를 호출 할 수 없습니다.


기본적인 경우에는 간단하지만 많은 브라우저와 호환되지 않습니다. Xeon06의 답변에서 언급했듯이 opacity : 0에서 버튼 위에 파일 입력 요소를 오버레이하는 것과이 솔루션을 결합하는 것이 훨씬 더 나은 아이디어입니다.
SquareCat 2013 년

10
업데이트 : 최신 브라우저에서는 DOM에도없는 입력을 클릭 할 수 있습니다. 대박!
Adria 2014 년

7
난 그냥 시도 click()A의 display:none입력과 일했다
다니엘 청

15
네, 여기 2015 년에 작품 click()요소에 대해 노래 display: none합니다! ;) 지난 4 년 동안 상황이 어떻게 변했는지.
ffxsam 2015

hidden대신 속성 을 사용할 수 있습니다 style="visibility:hidden". <input id="myInput" type="file" hidden>( w3schools.com/tags/att_global_hidden.asp )
cespon

113

여기에 대부분의 답변에는 유용한 정보가 없습니다.

예, jQuery / JavaScript를 사용하여 입력 요소를 프로그래밍 방식으로 클릭 할 수 있지만 사용자가 시작한 이벤트에 속하는 이벤트 처리기에서 클릭하는 경우에만 가능합니다!

예를 들어 스크립트가 프로그래밍 방식으로 ajax 콜백에서 버튼을 클릭하면 아무 일도 일어나지 않지만 사용자가 제기 한 이벤트 핸들러에 동일한 코드 줄을 넣으면 작동합니다.

추신 : debugger;키워드는 적어도 크롬 33에서 프로그래밍 방식으로 클릭하기 전에 검색 창을 방해합니다 ...


@LouisBataillard가 올바르게 언급했듯이 : 원래 이벤트 핸들러는 사용자가 시작해야 할뿐만 아니라; 특히 클릭 이벤트 여야합니다. 다음은 그가이 입증 제공 바이올린입니다 링크
Souhaieb 베스 베스

1
동적으로 생성되는 것을 클릭 할 수 있습니다. JQuery와에, 즉$(staticElementParent).on("click", "dynamicChild", function(){})
다니엘 청

1
감사합니다!!!! 나는 자바 스크립트 콘솔에서 이러한 모든 답변을 테스트했으며 미치광이였습니다!
jdkealy

8
프로그래밍 방식으로 파일 입력 창을 표시하면서 30 분 동안 고생했습니다. NOBODY ELSE는 사용자가 이벤트를 시작하지 않으면 불가능하다고 말했습니다 ... 당신은 많은 +1을받을 자격이 있습니다.
Umagon 2016-04-17

1
크롬 (62)의 이름으로 debugger;키워드는 더 이상 프로그램 클릭 방해하지
크리스 W.

62

기록을 위해 javascript가 필요하지 않은 대체 솔루션이 있습니다. 레이블을 클릭하면 관련 입력에 초점이 맞춰진다는 사실을 악용하는 것은 약간의 해킹입니다.

<label>적절한 for속성 (입력을 가리킴) 이 필요하며 , 선택적으로 버튼과 같은 스타일 (부트 스트랩과 함께 사용 btn btn-default)이 필요합니다. 사용자가 레이블을 클릭하면 대화 상자가 열립니다. 예 :

<!-- optionnal, to add a bit of style -->
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet"/>

<!-- minimal setup -->
<label for="exampleInput" class="btn btn-default">
  Click me
</label>
<input type="file" id="exampleInput" style="display: none" />


2
:) 좋은 작동 나는 이것처럼, 내 모난 프로젝트에 전체 jQuery를 포함하지 않습니다
Starscream1984

1
이 동작은 모든 최신 브라우저에서 신뢰할 수 있습니까?
JoshuaDavid jul.

이것은 기본 브라우저 동작을 사용하여 JS 없이도 작동합니다. onDrop 이벤트와 함께 기능이 풍부한 파일 업로드를 구현하면 훌륭하게 작동합니다!
Yanick Rochon 2018

CSS를 조작해야했지만 작동했습니다. 즉, "display : none"이있는 파일 입력 가시성이 모든 브라우저에서 정상이 아닙니다. (그러나 0의 불투명도 등을 사용할 수 있음)
driftcatcher

13

브라우저가 type="file"요소 (보안 문제 및 모든 사항)에 대한 클릭을 처리하는 방법을 잘 모르겠지만 작동합니다.

$('input[type="file"]').click();

이 JSFiddle 을 Chrome, Firefox 및 Opera에서 테스트 했으며 모두 파일 찾아보기 대화 상자를 표시합니다.


5
이것은 "호출"이벤트 자체가 클릭 이벤트 인 경우에만 작동하는 것 같습니다. 예를 들어 hover이벤트를 기반으로 파일 대화 상자를 열 수없는 것 같습니다 . jsfiddle.net/UQfaZ/1
Louis B.

입력이 DOM에없는 경우 Selenium으로 어떻게 테스트 할 수 있는지 알고 있습니까?
Sebastien Lorber

4

input[type=file]라벨 태그를 감싸고 label원하는대로 스타일 을 지정하고 input.

<label class="btn btn-default fileLabel" data-toggle="tooltip" data-placement="top" title="Upload">
    <input type="file">
    <span><i class="fa fa-upload"></i></span>
</label>

<style>
    .fileLabel input[type="file"] {
        position: fixed;
        top: -1000px;
    }
</style>

순전히 CSS 솔루션.


<input type="file" hidden>CSS 스타일을 적용 할 필요가 없도록 설정 하기 만하면됩니다 .
Sylvain Lesage

3

기본적으로 유일한 방법은 <input type="file"> 요소를 만든 다음 클릭을 시뮬레이션하는 것입니다.

항상이 작업을 수행해야하는 고통을 덜어 줄 작은 플러그인 (부끄러운 플러그)이 있습니다. file-dialog

fileDialog()
    .then(file => {
        const data = new FormData()
        data.append('file', file[0])
        data.append('imageName', 'flower')

        // Post to server
        fetch('/uploadImage', {
            method: 'POST',
            body: data
        })
    })

3

최고의 솔루션은 모바일에서도 모든 브라우저에서 작동합니다.

<div class="btn" id="s_photo">Upload</div>

<input type="file" name="s_file" id="s_file" style="opacity: 0;">';

<!--jquery-->

<script>
    $("#s_photo").click(function() {
        $("#s_file").trigger("click");
    });
</script>

입력 파일 유형을 숨기면 브라우저에 문제가 발생합니다. 불투명도는 숨겨지지 않고 표시되지 않기 때문에 최상의 솔루션입니다. :)


1
여기에는 jquery 참조가 필요하다는 점을 언급해야합니다.
Brino

불투명도는 전혀 관련이없는 개념을 포함합니다. "투명"요소가있는 레이아웃에 영향을주지 않으면 운이 좋을뿐입니다. 요소가 있어야하지만 보이지 visibility:hidden않아야하므로 더 나은 선택이되어야합니다.
conny

visibility: hidden여전히 레이아웃에 영향을 미칩니다. display: none당신이 원하는 것입니다.
stommestack

1

보안상의 이유로 크로스 브라우저 방식이 없습니다. 사람들은 일반적으로 입력 파일을 다른 것에 오버레이하고 가시성을 숨김으로 설정하여 자체적으로 트리거되도록합니다. 여기에 더 많은 정보가 있습니다.


2
영업 이익은 대해 얘기 <input type="file">하지 <select>.
Bojangles 2011

문제가 아니다. 전에 직접 해본 적이 있습니다. 귀하의 편집에 대응하여, 거기에 있다 그것을 할 수있는 방법은; jQuery를 사용하여 요소의 클릭 이벤트를 트리거합니다 $.click().
Bojangles

1
@JamWaffles 괜찮아요. 나는 몇 주 전에 이것에 하루 종일을 보낸 것을 분명히 기억합니다. Firefox와 IE에서는 제대로 작동하지 않았습니다. 거래가 무엇인지 궁금합니다 ...
Alex Turpin 2011

궁금한. 내 대답에는 FF와 함께 작동하는 JSFiddle이 있습니다. IE에서 테스트 할 수 없기 때문에 (저는 Linux에 있습니다) 그래도 문제가 될지 모르겠습니다.
Bojangles

2
거기에 좋은 연구 노력! 웹 개발자가 꽤 정상적인 동작을 무언가에 해킹해야 할 때마다 한 푼만 투자한다면 나는 부자가 될 것입니다.
Bojangles 2011

1

REACT에서 구성 요소 소품을 가져 오기 위해 바인딩을 사용하고 있는지 확인하십시오.

class FileUploader extends Component {
  constructor (props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }
   onChange=(e,props)=>{
    const files = e.target.files;
    const selectedFile = files[0];
    ProcessFileUpload(selectedFile,props.ProgressCallBack,props.ErrorCallBack,props.CompleatedCallBack,props.BaseURL,props.Location,props.FilesAllowed);
  }
   handleClick = () => {
    this.refs.fileUploader.click();
  }
  render()
  {
  return(
      <div>
        <button type="button" onClick={this.handleClick}>Select File</button>  
        <input type='file' onChange={(e)=>this.onChange(e,this.props)} ref="fileUploader" style={{display:"none"}} />
      </div>)
  }
}

0

jQuery를 사용 click()하면 클릭을 시뮬레이션하기 위해 호출 할 수 있습니다 .


0

이것은 나를 위해 일했습니다.

$('#fileInput').val('');

0

같은 것을 원하지만 React를 사용하는 사람들을 위해

openFileInput = () => {
    this.fileInput.click()
}

<a href="#" onClick={this.openFileInput}>
    <p>Carregue sua foto de perfil</p>
    <img src={img} />
</a>
<input style={{display:'none'}} ref={(input) => { this.fileInput = input; }} type="file"/>

0
<div id="uploadButton">UPLOAD</div>
<form action="[FILE_HANDLER_URL]" style="display:none">
     <input id="myInput" type="file" />
</form>
<script>
  const uploadButton = document.getElementById('uploadButton');
  const myInput = document.getElementById('myInput');

  uploadButton.addEventListener('click', () => {
    myInput.click();
  });
</script>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.