使い道がわからん

もうすぐ廃止になるJavaScriptのescape関数なのだが、例えばこんな風に文字列をescape関数に渡すと

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<script language="javascript">
function test(){
	var str = document.getElementById('tibet').innerHTML;
	var esc = escape(str);
	alert(esc);
}
</script>
</head>
<body>
<div id="tibet">ダライラマ</div>
<button onClick="test();">test</button>
</body>
</html>

alertに表示されるのは「%u30C0%u30E9%u30A4%u30E9%u30DE」という書式になっている文字列で、ようするにescape関数は文字列を%uで始まる16進数のかたまりにする。

これをそのままPHPに渡してデコードするには、

<?php
$str = '%u30C0%u30E9%u30A4%u30E9%u30DE';
$decode = preg_replace_callback("/(%u)([0-9a-zA-Z]+)/", '_decode', $str);
function _decode($array){
	return mb_convert_encoding(pack("H*", $array[2]), 'UTF-8', 'UCS-2');
}
?>

こんな感じで処理する。逆に、PHP側で文字列をJavaScriptのescape処理と同様に加工する場合は

<?php
$str = 'ダライラマ';
preg_match_all("/(.)/u", $str, $matches);
foreach($matches[1] as $k => $v){
	$matches[1][$k] = '%u' . strtoupper(bin2hex(mb_convert_encoding($v, 'UCS-2', 'UTF-8')));
}
$encode = implode("", $matches[1]);
?>

でできる。

と、ここまではいいのだが、JavaScriptでエスケープ処理された文字列をやり取りして面白いことができないか考えても、特に何も思いつかないので困った。

Popularity: 1% [?]

Yahoo! JapanでJavaScriptのエラ_

Yahoo! Japanのトップページにアクセスすると、デバッグモードにしてLog JavaScript ExceptionsをオンしたSafariではコンソールに

http://www.yahoo.co.jp/:TypeError – Value undefined (result of expression hm.isHomePage) is not object.

というエラーが出てくる。なんだろう。たぶんここに書かれているのと同じだから、Operaでも再現するらしい。というわけでFirefoxで開いてみたのだが、

Yahoo

これじゃねえの?

Popularity: 1% [?]

dieとexit

exit関数(dieはこのエイリアス)の引数に文字列を渡すと、メッセージとして文字列を出力してスクリプトが終了するのだが。

PHP4.2以降ではintegerを渡すと終了時のステータスコードになる。0は正常終了なので、適時利用すればいい。利用できるのは254までの整数で、255は予約されている。

255を越える値を渡すと無視される。

で、何が言いたいのかというと、

public static function response($str){
    header('Expires: ' . gmdate('D, j M Y H:i:s', 1));
    print("\xef\xbb\xbf");
    die($str);
}

うっかりこんなコードを書くと、$strに整数しか入っていない場合は何も出力されない。Ajaxでサーバ側からのレスポンスを記述するときによくやってしまいがち。

public static function response($str){
    header('Expires: ' . gmdate('D, j M Y H:i:s', 1));
    print("\xef\xbb\xbf");
    print($str);
    exit;
}

これが正しい。って、自分がやってしまったわけですが。

Popularity: 1% [?]

Prototype Portal Class

コンテンツをブロックに分けて、それぞれをWidgetと称して自由に位置を変更したり非表示にしたりするJavaScriptライブラリ、Prototype Portal Classyoumosで紹介されている

PCサイト向けCMSのページ編集機能なんかに使えるな、と思ったら、これってJetspeedの画面みたいだな。

Popularity: 1% [?]

TinyMCEとページ内リンクのURL

TinyMCEでページ内のアンカーにリンクを挿入しようとすると、#で始まるURLは勝手に親ページのURLを拾ってきて補完して絶対パスに変換してしまう。

http://hoge.com/hoge.cgiにて動作させる

リンクアイコンをクリック
ポップアップ画面のリンクのところに「#test」と入力
リンクを挿入してポップアップ画面を閉じる
HTMLを確認 ← 「http://hoge.com/hoge.cgi#test」に補完されている

という感じ。該当箇所はlink.js。

// Make anchors absolute
      if (href.charAt(0) == '#')
              href = tinyMCE.settings['document_base_url'] + href;

これ、仕様なんだけど、いろいろ困るんだよな。

Popularity: 1% [?]

総論賛成だが

「href=”#” onclick”…”」はそろそろやめよう

周囲には「萌え野郎に説教されたかねえや」という声もあったが、総論では賛成。ただし、アンダーライン入れるとか文字色を変えるとかもしないといけない。社内ではfake_linkクラスをCSSに追加している。

Popularity: 1% [?]

Tuit: Javascript

IE6でinputタグのname属性を書き換えようとしたらうまく動かない。createElementでname属性を指定できないので困っていたら、こんな情報が:

IE は createElement(‘input’) した要素の name 属性を変更することができない。

ではどうすれば良いかと言うと、MSDN にちゃんと書かれている。
var inputElement = document.createElement (‘<input type=”text” name=”i_theme” size=”20″>’);

ここ笑う(しかない)所ね。ブラウザ分けするのが面倒だが、IE6 のみの環境なら大丈夫だろう。

いや本当に笑うしかない。こういう失敗データベースはMSDN探すしかないのかな。

Popularity: 1% [?]

JSLint: eval is evil

ここのところJavascriptをたくさん書いていて、多分この一ヶ月で書いた量はこれまでの一生に書いた分を越えていると思われるのだが、JSLintの存在を教えてもらった。

こっちはさすがに枯れていて、なるほどと思わせるところもたくさんある。どれも一発で通らなかったのは悲しいが。

しかし一点問題が。JSONの処理用にevalを使っている箇所で

Problem at line 28 character 47: eval is evil.
var res = eval( '(' + xh.responseText + '...

と、身も蓋もないことをいわれてしまう。

追記:「eval is evil」というキーワードで検索してくる人が多いみたいなので追記。JSLintでこのメッセージを出さないようにするには、ページ下部の「Tolerate eval(evalを許容する)」のチェックボックスをオンにしておく。

ちなみにevalについては以下のように説明されている。

eval関数(やFunction、setTimeout、setIntervalなど)を通じてJavaScriptコンパイラへのアクセスが可能になります。JSONのパースには有用ですが、その他のほぼ全ての場合にはコーディングがひどいことになっている証拠です。evalはJavaScriptの中で最も間違って利用されている関数なのです。

JSLintを作った人たちの考え方はこうだから、JSONをパースしている箇所でも無条件に「eval is evil(evalは邪悪です)」と警告される。

Popularity: 2% [?]

BloggerをCMSに

Bloggerにテンプレートファイルの編集機能が追加されたので、これを使って無理矢理CMSにするという手がある。うちみたいに更新のたびに自前のサーバにファイルを転送しているととても簡単にできる。

最も単純な手を使うと、例えば

var CommonClass = Class.create();

CommonClass.prototype = {

    initialize: function(){
    },

    displayBlock: function(id){
        var url = "./server.php?param=block1";
        new Ajax.Updater(id, url, {method: "get"});
    }
}

var Common = new CommonClass();

Event.observe(window, 'load', function(){
    Common.displayBlock (‘block1’);
});

こんな感じのJavascriptをとprototype.jsを読み込むようにテンプレートを編集し、どこか表示内容を動的に出したい箇所に<div id=”block1″><div>などと記述しておく。

あとは、サーバ側にserver.phpを置いて、

<?php

//do something

?>

適当なコンテンツを出力してやればおしまい。

Technorati Tags: ,

Popularity: 1% [?]

JSONのセキュリティ

http://www.zeroknock.metaeye.org/mlabs/expjson.html

このページを訳していたのだが、途中いくつか英語が変なので質問を送っている。まだ返答がもらえない。Javascriptの実装についてはセキュアなプログラミングのノウハウがまだまだ少ないので、この手の文書がもっと増えるといいのだが。

#追記:返事が届いた。とても感じのいいメールだった。名字と名前を間違えられるのはこちらのシグネチャが悪いせいだ。

Technorati Tags: ,

Popularity: 1% [?]