jQueryを使用してアップロードボックス(参照ボタン)をトリガーしようとしています。
私が今試した方法は:
$('#fileinput').trigger('click');
しかし、それは機能していないようです。助けてください。ありがとうございました。
jQueryを使用してアップロードボックス(参照ボタン)をトリガーしようとしています。
私が今試した方法は:
$('#fileinput').trigger('click');
しかし、それは機能していないようです。助けてください。ありがとうございました。
回答:
これはセキュリティ上の制限によるものです。
セキュリティ制限は、<input type="file"/>
がdisplay:none;
またはに設定されている場合のみであることがわかりましたvisbilty:hidden
。
設定することで、ビューポートの外側で位置決めしようとした私はそうposition:absolute
とtop:-100px;
、それが動作しますほら。
http://jsfiddle.net/DSARd/1/を参照してください
それをハックと呼びます。
うまくいきますように。
left: -100px;
。ページの長さがどれほどかはわかりません
これは私のために働きました:
JS:
$('#fileinput').trigger('click');
HTML:
<div class="hiddenfile">
<input name="upload" type="file" id="fileinput"/>
</div>
CSS:
.hiddenfile {
width: 0px;
height: 0px;
overflow: hidden;
}
>>>クロスブラウザーで機能する別のもの:<<<
アイデアは、カスタムボタンの上に非表示の巨大な「参照」ボタンをオーバーレイすることです。したがって、ユーザーがカスタムボタンをクリックすると、実際にはネイティブ入力フィールドの[参照]ボタンをクリックします。
JSフィドル:http : //jsfiddle.net/5Rh7b/
HTML:
<div id="mybutton">
<input type="file" id="myfile" name="upload"/>
Click Me!
</div>
CSS:
div#mybutton {
/* IMPORTANT STUFF */
overflow: hidden;
position: relative;
/* SOME STYLING */
width: 50px;
height: 28px;
border: 1px solid green;
font-weight: bold
background: red;
}
div#mybutton:hover {
background: green;
}
input#myfile {
height: 30px;
cursor: pointer;
position: absolute;
top: 0px;
right: 0px;
font-size: 100px;
z-index: 2;
opacity: 0.0; /* Standard: FF gt 1.5, Opera, Safari */
filter: alpha(opacity=0); /* IE lt 8 */
-ms-filter: "alpha(opacity=0)"; /* IE 8 */
-khtml-opacity: 0.0; /* Safari 1.x */
-moz-opacity: 0.0; /* FF lt 1.5, Netscape */
}
JavaScript:
$(document).ready(function() {
$('#myfile').change(function(evt) {
alert($(this).val());
});
});
height
への変更を提案しているheight: 100%
LABEL要素exを使用できます。
<div>
<label for="browse">Click Me</label>
<input type="file" id="browse" name="browse" style="display: none">//
</div>
これにより、入力ファイルがトリガーされます
私はそれをIE8 +、最近のFFとクロムで動作させています(=テスト済み):
$('#uploadInput').focus().trigger('click');
キーはクリックを発動する前に焦点を合わせています(そうでない場合、クロムはそれを無視します)。
注:入力を表示および表示する必要があります(in、not display:none
、notなどvisibility:hidden
)。(他の多くの人がそうであるように)入力を絶対的に配置し、画面から外すことをお勧めします。
#uploadInput {
position: absolute;
left: -9999px;
}
私のフィドルをチェックしてください。
http://jsfiddle.net/mohany2712/vaw8k/
.uploadFile {
visibility: hidden;
}
#uploadIcon {
cursor: pointer;
}
<body>
<div class="uploadBox">
<label for="uploadFile" id="uploadIcon">
<img src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Icon_-_upload_photo_2.svg/512px-Icon_-_upload_photo_2.svg.png" width="20px" height="20px"/>
</label>
<input type="file" value="upload" id="uploadFile" class="uploadFile" />
</div>
</body>
adardesignは、ファイル入力要素が非表示の場合に無視されることに関して、それを釘付けにしました。また、多くの人が要素のサイズを0にシフトしたり、配置やオーバーフローの調整によって要素を範囲外に押し出していることに気づきました。これらはすべて素晴らしいアイデアです。
完全にうまく機能しているように見えるもう1つの方法は、不透明度を0に設定することです。次に、位置を設定するだけで、非表示のように他の要素をオフセットしないようにすることができます。要素をあらゆる方向に10Kピクセル近くシフトすることは少し不必要に思えます。
これが欲しい人のための小さな例です:
input[type='file']{
position:absolute;
opacity:0;
/* For IE8 "Keep the IE opacity settings in this order for max compatibility" */
-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
/* For IE5 - 7 */
filter: alpha(opacity=0);
}
好奇心のために、アップロードフォームと入力ファイルをDOMツリーに追加せずに動的に作成することで、好きなことを実行できます。
$('.your-button').on('click', function() {
var uploadForm = document.createElement('form');
var fileInput = uploadForm.appendChild(document.createElement('input'));
fileInput.type = 'file';
fileInput.name = 'images';
fileInput.multiple = true;
fileInput.click();
});
DOMにuploadFormを追加する必要はありません。
正しいコード:
<style>
.upload input[type='file']{
position: absolute;
float: left;
opacity: 0; /* For IE8 "Keep the IE opacity settings in this order for max compatibility" */
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; /* For IE5 - 7 */
filter: alpha(opacity=0);
width: 100px; height: 30px; z-index: 51
}
.upload input[type='button']{
width: 100px;
height: 30px;
z-index: 50;
}
.upload input[type='submit']{
display: none;
}
.upload{
width: 100px; height: 30px
}
</style>
<div class="upload">
<input type='file' ID="flArquivo" onchange="upload();" />
<input type="button" value="Selecionar" onchange="open();" />
<input type='submit' ID="btnEnviarImagem" />
</div>
<script type="text/javascript">
function open() {
$('#flArquivo').click();
}
function upload() {
$('#btnEnviarImagem').click();
}
</script>
実際、私はこのための本当に簡単な方法を見つけました。
$('#fileinput').show().trigger('click').hide();
このようにして、ファイル入力フィールドのcssプロパティをどれにも表示せずに、トレードに勝つことができます:)
答えるのは遅すぎますが、この最小限の設定が最もうまく機能すると思います。私も同じことを探しています。
<div class="btn-file">
<input type="file" class="hidden-input">
Select your new picture
</div>
// css
.btn-file {
display: inline-block;
padding: 8px 12px;
cursor: pointer;
background: #89f;
color: #345;
position: relative;
overflow: hidden;
}
.btn-file input[type=file] {
position: absolute;
top: 0;
right: 0;
min-width: 100%;
min-height: 100%;
filter: alpha(opacity=0);
opacity: 0;
cursor: inherit;
display: block;
}
これは非常に古い質問ですが、残念ながらこの問題は依然として関連しており、解決策が必要です。
私が思いついた(驚くほど簡単な)解決策は、実際のファイル入力フィールドを「非表示」にし、LABELタグでラップすることです(拡張のために、BootstrapとHTML5に基づくことができます)。
See here:
ここにサンプルコード
このようにして、実際のファイル入力フィールドは非表示になり、実際に変更されたLABEL要素であるカスタマイズされた「ボタン」だけが表示されます。このLABEL要素をクリックすると、ファイルを選択するウィンドウが表示され、選択したファイルが実際のファイル入力フィールドに移動します。
さらに、必要に応じて外観と動作を操作できます(たとえば、選択したファイルの名前をファイル入力ファイルから取得し、選択した後、どこかに表示します。LABEL要素は自動的には行いませんが、もちろん、私は通常、テキストコンテンツとしてLABELの中に入れます。
しかし注意してください!これの外観と動作の操作は、想像したり考えたりできるものに限定されます。;-) ;-)
単純な$(...)。click();で管理しました。JQuery 1.6.1
<input type="file"/>
偽のボタンを使用してそれをトリガーするときにカスタムクライアント側の検証に問題があり、@ Guillaume Bodiのソリューションが(Chromeでもopacity: 0;
)機能しました
$("#MyForm").on("click", "#fake-button", function () {
$("#uploadInput").focus().trigger("click");
});
アップロード入力のCSSスタイル
#uploadInput {
opacity: 0.0;
filter: alpha(opacity=0); /* IE lt 8 */
-ms-filter: "alpha(opacity=0)"; /* IE 8 */
-khtml-opacity: 0.0; /* Safari 1.x */
-moz-opacity: 0.0;
}
これを試してください、それはハックです。Position:absoluteはChrome用で、trigger( 'change')はIE用です。
var hiddenFile = $("<input type=\"file\" name=\"file\" id=\"file1\" style=\"position:absolute;left:-9999px\" />");
$('body').append(hiddenFile);
$('#aPhotoUpload').click(function () {
hiddenFile.trigger('click');
if ($.browser.msie)
hiddenFile.trigger('change');
});
hiddenFile.change(function (e) {
alert('TODO');
});
$.browser
jQueryの新しいバージョンでは推奨されないことに注意してください
同様の問題があるので、あなたの問題は理解できたと思います。したがって、タグ<label>
には属性があります。この属性を使用して、入力をtype = "file"にリンクできます。しかし、レイアウトのルールがあるためにこのラベルを使用してこれをアクティブにしたくない場合は、次のようにすることができます。
$(document).ready(function(){
var reference = $(document).find("#main");
reference.find(".js-btn-upload").attr({
formenctype: 'multipart/form-data'
});
reference.find(".js-btn-upload").click(function(){
reference.find("label").trigger("click");
});
});
.hide{
overflow: hidden;
visibility: hidden;
/*Style for hide the elements, don't put the element "out" of the screen*/
}
.btn{
/*button style*/
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>
<div id="main">
<form enctype"multipart/formdata" id="form-id" class="hide" method="post" action="your-action">
<label for="input-id" class="hide"></label>
<input type="file" id="input-id" class="hide"/>
</form>
<button class="btn js-btn-upload">click me</button>
</div>
もちろん、これを自分の目的とレイアウトに合わせて調整しますが、それは私がそれを機能させるためのより簡単な方法です!!
ギヨーム・ボディの答えに基づいて、私はこれを行いました:
$('.fileinputbar-button').on('click', function() {
$('article.project_files > header, article.upload').show();
$('article.project_files > header, article.upload header').addClass('active');
$('.file_content, article.upload .content').show();
$('.fileinput-button input').focus().click();
$('.fileinput-button').hide();
});
つまり、最初は非表示になっていて、トリガーに対して表示され、その後すぐに非表示になります。