Home JavaScript Greasemonkey PHP

JavaScript だけで Shift_JIS/EUC-JP のページから UTF-8 に変換して POST する方法2009-04-16


1 個前のエントリで、JavaScript だけを用いて、任意の文字コードのページから、UTF-8 エンコーディングで任意のサーバに (クロスドメインして) POST する方法を編み出しました。
その部分だけで需要があるのではないかと思ったので、関数として取り出して公開します。

案外スマートに書けたのでご機嫌です。

function postUtf8(param)
    if (!param) return;
    param = param.replace(new RegExp('&', 'g'), '&');
    param = param.replace(new RegExp('"', 'g'), '"');
    param = param.replace(new RegExp('<', 'g'), '&lt;');
    param = param.replace(new RegExp('>', 'g'), '&gt;');
    var d = document;
    var i = d.createElement('iframe');
    i.style.display = 'none';
    d.body.appendChild(i);
    var iDoc = i.contentWindow.document;
    iDoc.open();
    iDoc.write('<form method="POST" action="http://server/path/file">');
    iDoc.write('<input type="hidden" name="param" value="' + param + '" />');
    iDoc.write('</form>');
    iDoc.write('<script>window.onload = function(){document.forms[0].submit();}</script>');
    iDoc.close();
    setTimeout(function() {
        d.body.removeChild(i);
    }, 5000);
}

こんな感じです。
http://server... と、param の部分を書き換えれば、好きなサーバに好きなパラメータを渡せますね。
POST 先のサーバが重い時は、setTimeout の 5000 の値をもう少し大きめに取った方がいいかもしれません。

簡単に技術的な説明もしておきましょうか。
基本的には、iframe を新規で作成すると、その文字コードがデフォルトで UTF-8 として処理される事を利用しています。

iframe の中身は当初 DOM で構築しようとしたのですが、うまくいかず、document.write で構築しています。

iframe 内で window.onload しているのは、これまた直接 script タグ内で submit しようとすると、その時点では iframe の DOM 構築が完了しておらず、submit 出来ないためです。
iDoc.close(); しないと、DOM が構築されないのではないかと予想されます。

カテゴリ: Development タグ: utf-8 javascript