私の Web サイトにはファイル アップロード機能があります。Chrome、Safari、IE 7 および 10 では正しく動作しますが、FireFox 23.0.1 では動作しません。
コードは次のとおりです。
HTML:
<iframe style="display:none" src="about:blank" id="up_frame" name="up_frame" onload="iFrameDone()"></iframe>
JavaScript:
function Create(tag,type,obj){
var n = document.createElement(tag);
if(type) n.type = type;
n.id = UniqueId();
obj.appendChild(n);
return n;
}
.
.
.
fm = Create("form",null,uplButton);
fl = Create("input","file",fm);
fl.name = "up_file";
if(ie){
// Keep Internet Explorer from complaining
// move the from to a proper place & apply some styles.
}else{
fm.Opacity(0); // make it transparent
}
fl.onchange = function(){
fm.method = "post";
fm.encoding = "multipart/form-data";
fm.action = "upload";
fm.target = "up_frame";
fm.submit();
}
基本的に私がやっていることは、アップロード ボタンの上にフォームを作成し、それを透明にすることです。これは、デザインの視覚的な統一を実現するためのトリックです。ユーザーがファイルを選択すると、onchangeイベントがトリガーされ、非表示のiframeを介してフォームが送信されます。
これは Chrome と Safari で完璧に機能します。IE で動作させるには、フォームを表示したままにしておく必要がありました。それ以外の場合は、「アクセスが拒否されました」と文句を言うためです。これがifの理由ですが、ご覧のとおり、フォーム送信メカニズムはすべてのブラウザーで同じです。
FF デバッガーでコードをトレースし、 submitが実行されようとしている時点でfmのすべてのメンバーに期待される値が含まれていますが、Single Stepボタンをクリックしてfm.submit()を実行すると、何もせずに指示をスキップするだけで、サーバーには何も送信されず、コンソールにエラー/警告メッセージが記録されないため、何が起こっているのかわかりません。
その点に注意してください:
IE で発生したような同様の問題を破棄するために、フォームを表示してテストしましたが、それでも同じ動作が得られます。
また、次の点にも注意してください。
このトリックまたは同様のトリックは、すべての主要な電子メール サービスで使用されているため、機能させる方法があります。「送信ボタンを追加する」などの回答はしないでください。
特定のファイルのアップロードを強制しようとしているわけではないので、これはセキュリティ上の問題がないことを意味します。私がやろうとしているのは、「ファイルのアップロード」ウィンドウをポップアップし、ユーザーが自分の自由で意識的で意識的な意志で選択したファイルをアップロードすることです。しかし、ブラウザがそれをセキュリティ上の問題と見なすのであれば、なぜコンソールに記録されないのでしょうか? またはその他の方法でユーザーに報告します。