2013-03-04 37 views
5

私は画像アップローダアプリケーションを開発していますが、Chromeでのみ発生する1つのバグを除いてすべてがうまくいきます。私はこの問題を1つのコールバックに取り除いてしまいました。jQuery .fadeOut .clickが動作しないコールバック

.click()トリガーへの.fadeOutコールバックがトリガーされないという問題があります。私は下にリンクされている簡単なバージョンのフィドルを作り直しました。最初のクリックはfadeOutを開始し、fadeOutが終了すると.clickトリガーは発生しません。もう一度クリックするトリガーがトリガーされます。なぜどんなアイデア?

HTML:

<div><input type="file" name="image_file" id="image_file"/></div> 

<div class="overlay_wrap"> 
    Overlast 
</div> 

<a id="click" href="">Click</a> 

のjQuery:

$(document).ready(function() { 
    $("#click").click(function(event) { 
     event.preventDefault(); 
     $('.overlay_wrap').fadeOut(1000, function(event){ 
      $('#image_file').trigger('click'); 
     }); 
    }); 
}); 

http://jsfiddle.net/gg2a7/5/

助けてくれてありがとう!

EDIT:古いフィドルリンクが変更されていました。

+1

何らかの理由でトリガー()をコールバックに配置するとイベントが遅れるように見えますが、ユーザーの作成したものではないと思われるため、Chromeのセキュリティがイベントを停止しているようです。コールバックから取り除くだけで問題が解決され、通常のsetTimeoutでテストするのと同じ問題があるように見えるので、トリガを延期することと関係します()。答えがあります。[**ここ**](http://stackoverflow.com/questions/210643/in-javascript-can-i-make-a-click-event-fire-programmatically-for-a-file-input )これはやや似たような問題を扱っている。 – adeneo

+0

adeneoが言っていることをサポートする[別の回答](http://stackoverflow.com/questions/12134014/how-can-i-programmatically-open-the-file-picker-with-javascript)です。 –

+0

これを回避する手段はありませんか? –

答えて

2

に変更

、これは動作しません。それは、ブラウザ内のタイミング/スレッド機能と関係しています。 <input type="file" />(それについてGoogleでLoads ofquestions on SO /原料)プログラムで開くことができませんができます。

問題の核心はこれです。 Chromeだけでなく、 Firefoxはポップアップがブロックされたことを示すメッセージを表示し、Safariもそれをブロックし、IEではフォームは送信されません。

これは、潜在的なセキュリティ上のリスクがあるためです。 ユーザアクションのみが開封されます。<input type="file" />.fadeOut()のため、ブラウザはこれをユーザーイベントとしてこれ以上認識しません。今度は、になっているので、ブラウザのタイミング/スレッディングに戻ります。デリゲートも、ダイアログが開かないような何らかの種類のスレッド/タイムアウトもありません。

$("#click").click(function(event) { 
    event.preventDefault(); 
    $('#image_file').trigger('click'); 
}); 

JSFiddle

HTML

<input type="button" name="image_file" id="image_file" value="type='button'" /> 

JS

$("#click").click(function(event) { 
     event.preventDefault(); 
     $('.overlay_wrap').fadeOut(1000, function(){ 
      $('#image_file').trigger('click'); 
     }); 
    }); 

    $('#image_file').click(function() { 
     alert('ok'); 
    }); 

0123:それは実際に<input type="file" />であることを示すために

は、ここ作業を行うこと<input type="button" />との例です。

長いストーリー:フェード効果ではできません。単にダイアログを開いて要素を非表示にすることもできますが、それだけです。

$("#click").click(function(event) { 
    event.preventDefault(); 
    $('.overlay_wrap').hide(); 
    $('#image_file').trigger('click'); 
}); 

JSFiddle

+0

これは残念ですが、私はそれを回避することができます。奇妙なことは、FirefoxとIE 10でテストしたところ、うまくいきました。 FFは私に "あなたはこのサイトのポップアップを許可しますか?"と言ってくれました。IE10はまったく警告を出さず、ちょうどうまくいきました。 –

+0

これは私をナットにしていた。イベントコールバックで動作した理由は非常にわかりましたが、イベントコールバックのコールバックではありませんでした。私はそれを回避する必要があるように見えます。 – Dex

0
があなたの $('.overlay_wrap').fadeOut(1000,complete)悲しいこと
$('.overlay_wrap').fadeOut(1000); 
complete(); 
+2

完全な機能を実行する前にフェードが終了するのを待つことはありません。 –

+0

あなたは正しいです、ごめんなさい気づかなかった – MIIB

関連する問題