よく使うHTML5以前のメソッドを提供します。これにはいくつかの欠点がありますが、多くの利点があります。主なものは、ほぼ完全にクロスブラウザーであるということです(唯一の要件はJavaScriptと非表示のIFRAMEです)。
すぐに欠点をリストして、発生する可能性のある問題を正確に把握できるようにします。
- 別のドメインに投稿している場合、そのドメインからの返品を受け取ることはできません
- コンテンツ以外のものを取得することはできません。HTTPエラーが発生すると、サイレントに失敗します。
- 失敗した場合は、フォームを再生成する必要があります。その場合、ユーザーのファイルを自動的に再選択することはできません。
解決策:入力type = "file"をわかりやすいIFRAMEに入れ、これを使用して送信します。これはAJAXではなく、かなり古い方法ですが、機能します。
方法
手順1.IFRAMEを作成し、効率的に選択できるようにIDまたはクラスを指定します。準備が整ったものを乱雑にするのではなく、DOMReadyで作成します。作成するときに、を使用してロードイベントを割り当てます$('#yourIframe').load(function() { });
。これがトリガーされると、iframeにコンテンツを追加できるようになります。秘訣は、すべてのフォーム要素をそれにコピーし、「クローン」を残して、すべての有用なイベントをIFRAME内のイベントにバインドすることです。順番に:
click()
change()
input type = "file"の場合、input type = "text"を選択し、
change()
他の何かのために
クリックイベントは、IFRAMEの要素に転送するだけです。イベントはchange()
、IFRAME内の要素にバインドされると、ファイルの名前を回復することができます。
ファントム送信ボタンをクリックしたら、load()
イベントをIFRAMEにバインドしてから、IFRAME内でフォームを送信します。フォームが送信されると、$( "body"、$(this).contents())を使用してロードハンドラー内のiframeのコンテンツにアクセスできるようになります。
説明のために小さなフィドルを書きました:http://jsfiddle.net/WQhnM/2/。JSFiddle.netがデータを取得し(したがって、深刻なものや犯罪的なものを送信しないでください;-))、サーバーが100kbを超えるものを拒否する(したがって、小さいものを送信する)ことに注意してください。しかし、アイデアはそこにあります。IFRAMEを表示したままにして、何が起こるかを確認できるようにしました。
これはかなりの解決策ではありませんが、IEがHTML5に追いつくまで機能します。
編集:私は言及するのを忘れました-これはIE7で動作するためにハックが必要です。change()
この特定のブラウザでは正しくトリガーされません。ソリューション:
if (!$.browser.msie) {
nItem.change(function() { ... });
}
else {
nItem.click(function() {
setTimeout(function() {
(function() { ... });
},0);
});
}