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に移植したい。