iframeを使用したクロスドメインPOST

指定したidのiframeのdocumentを取得する関数

function getIframeDoc(iframeId){
	var iframe = document.getElementById(iframeId);
	if (document.all) {
		return iframe.contentWindow.document;
	} else {
		return iframe.contentDocument;
	}
}

こんな感じで適当なdivを作って適当なiframeを放り込んで、body作ってDOM操作できるようにしてやる。

var div = document.createElement('div');
div.id = 'iframeContainer';
document.body.appendChild(div);

var iframe = document.createElement('iframe');
iframe.id = 'iframe';
document.getElementById('iframeContainer').appendChild(iframe);

var iframedoc = getIframeDoc('iframe');
iframedoc.writeln('<body></body>');
iframedoc.close();

iframe経由でPOSTしてやる関数

まあ見たまんま

function submit(iframedoc,action,params){
	var form = iframedoc.createElement('form');
	form.method = 'post';
	form.action = action;
	iframedoc.body.appendChild(form);
	for(var paramName in params){
		var paramValue = params[paramName];
		var input = iframedoc.createElement('input');
		input.type = 'text';
		input.name = paramName;
		input.value = paramValue;
		form.appendChild(input);
	}
	form.submit();
}

空iframeを使った場合は基本的にparamsはUTF-8でURLエンコードされてPOSTされるけど、
documentのinputEncodingプロパティが他のエンコーディング(EUC-JPとかSJISとか)になってるページを
読み込ませたiframeだったら、そのエンコーディングでURLエンコードされてPOSTされるよ。
(↑クロスドメインの時はダメだよ)
クロスドメインじゃなければ↓みたいな感じでレスポンスも取れるけど、↑と併用しないとそんなにうれしくないね。

getIframeDoc('iframe').body.innerHTML;


ずっとFirebugで弄ってたんでFirefox以外での動作には自信ないです。
ちゃっちゃとIEコンポーネントブラウザでの動作も確認して、
クロスドメインでPOSTする&レスポンス情報は別になくても困らない系の用途で
GM_xmlhttpRequestを使っているグリモンをSeaHorseに移植したい。