メモ1

ファイルをAjaxを用いてバックグラウンドで送信する方法。prototype.js使用。

html
<input type="file" name="file" id="file">
javascriptのonclickなりなんなりのイベントで
var frame = document.createElement('iframe'); // ダミーのiframeを作成
var bodyobj = document.getElementsByTagName('body')[0]; // bodyを取得
var file = $('file');

// フレームが見えないようにする。
Element.hide(frame);
// フレームをbodyに追加しておく
bodyObj.appendChild(FileSubmittion.frame);
// フレームのID/nameを設定(bodyに追加した後で無いと、IDは割り振れない? @IE7にて)
frame.contentWindow.name =
frame.id = frame.name = “file_submittion_dammy_frame”;

// ダミーフォームを作る
form.action = “hogehoge.php”; // 送信先のCGIなりPHPなりを設定。
form.target = “file_submittion_dammy_frame”; // ダミーフレームに飛ぶように設定。
form.method = “post”;
form.encoding = “multipart/form-data”;
Element.hide(form); // フォームは見えない様に。
bodyObj.appendChild(form);

// ファイル用のinput[type="file"]をダミーのフォームに移動する。
// 元の位置に戻せるように、元の位置にはダミーのdiv要素をつっこんでおく。
var prevObj = file.parentNode.insertBefore(document.createElement(‘div’), file);
// appendChildすると、そこにコピーではなく移動される。
form.appendChild(file);
// 送・信!
form.submit();

/*
ファイルの送信が終わったら、イベントで通知できる。通知し終わったら、Event.stopObservingしないと余計なときまでイベントが発生するかも。(リロードかかったり)
*/
Event.observe(frame, ‘load’, file_submit, false);

// ファイル用のフォームを元に戻す。divと置き換え。
prevObj.parentNode.replaceChild(file, prevObj);

メモ2

イベントに適当な引数渡せないじゃん!⇒

Event.observe(element,
'click',
new Function('function_01(' arg1 + ',' + arg2 + ',' + ... + ')'),
false);

という風に出来るはず。