ユーザーがファイルを選択できるようにする唯一の方法は、<input type="file" />
1を使用することです。この要素をページ上に表示する必要はありません。
ユーザーがファイルを選択すると、そのファイルから取得できるのはその名前だけです。そのパスを取得できません。また、ファイル アップロード要素は非同期であることに注意してください。onchange
名前を取得するには、イベント (コールバック)を使用する必要があります。
を使用してアップロード要素を非表示にしdisplay: none
、別の JavaScript 関数をプログラムでトリガーするだけです。(注: この方法は、Opera や他のブラウザーでは機能しない可能性があります。Chrome、Firefox、および IE 8/9 でテストされています)。
<style>
#getFile{
display: none;
}
</style>
<input type="file" id="getFile" />
<button id="openFile" type="button">Click Me</button>
<script>
var uploadElement = document.getElementById('getFile'),
uploadTrigger = document.getElementById('openFile'),
openFileUpload = function(){
uploadElement.click();
},
alertValue = function () {
alert(uploadElement.value);
};
if (window.addEventListener) {
uploadTrigger.addEventListener('click', openFileUpload);
uploadElement.addEventListener('change', alertValue);
} else {
uploadTrigger.attachEvent('onclick', openFileUpload);
uploadElement.attachEvent('onchange', alertValue);
}
</script>
デモ: http://jsfiddle.net/rJA7n/3/show (編集: http://jsfiddle.net/rJA7n/3/ )
ほとんどのブラウザー (Opera を含む) で機能するもう 1 つの方法は、ファイル アップロード要素を「非表示」にして、その上に要素を配置することです。つまり、ボタンと思われるものをクリックすると、実際にはアップロード要素をクリックしていることになります。AJAX アップローダ ( http://fineuploader.com/など) は、このメソッドを使用して、アップロード ボタンの「スタイル」を設定できるようにします。
<style>
#getFile{
width: 100px;
opacity: 0;
filter: alpha(opacity = 0);
}
#openFile{
display: inline;
margin-left: -100px;
background-color: red;
height: 30px;
width: 100px;
padding: 10px;
color: white;
text-align: center;
}
</style>
<input type="file" id="getFile" />
<div id="openFile">Click Me</div>
<script>
var uploadElement = document.getElementById('getFile'),
alertValue = function(){
alert(uploadElement.value);
};
if(window.addEventListener){
uploadElement.addEventListener('change', alertValue);
}
else{
uploadElement.attachEvent('onchange', alertValue);
}
</script>
デモ: http://jsfiddle.net/cKGft/4/show/ (編集: http://jsfiddle.net/cKGft/4/ )
1ええと、本当に派手にしたい場合は、ドラッグ アンド ドロップを使用できます。ここで簡単なデモを作成しました: http://jsfiddle.net/S6BY8/2/show (編集: http://jsfiddle.net/S6BY8/2/ )