JavaScript

IE に表示した Flash でリファラが取れない問題の回避方法

IE 6/7 に表示された Flash で navigateToURL を呼ぶとリファラが取れない (document.referrer === "" //true) 問題の回避方法。 アンカーエレメントをクリックしたことにする アンカーエレメントを作って click イベントを呼べば、リファラを取ることができ…

JavaScript ライブラリのブラウザ判定ロジックを調べてみた

幾つかの JavaScript ライブラリから、ブラウザ判定部分だけを抜き出してみた。判定基準が userAgent だったり、ブラウザの実装だったり、多種多様で面白い。MooTools はレンダリングエンジンを返す所が他と違う。 Prototype (prototype-1.6.0.2.js) Browser…

はてなブックマークのタグを当てるゲームを作った

はてなブックマークのタグを当てるゲームを作った。タグを入力後、エンターを押して正解なら、次の問題に進む。 はてブ - タグ当てゲーム はてなから引っ張って来た ホットエントリの feed には 4、5 個のタグしか無く、正直なところ、難しすぎてゲームにな…

便利なコメントのテクニック

地味に便利な ActionScript/JavaScript で使えるコメントテクニック。 実行するブロックを切り替える (参考) テスト用のコードを切り替えるときに便利。 //* doHoge(); /*/ doFoo(); //*/ この状態では doHoge() が有効で、先頭行のスラッシュを一つ取ると、…

String.replace の第二引数には置換関数を指定できる

String.replace の第二引数には、置換後の文字列を返す、独自の関数を指定できることを知った。目的にもよるが、グルーピングを使うときは RegExp.exec を繰り返すよりも使いやすい。 ただし、置換関数に渡される引数が可変で、いくらか複雑なので注意が必要…

== の代わりに === を使え

JavaScript: The Good Parts を斜め読みしていたら、面白いことが書いてあった。 比較演算子の == や != を、=== と !== の "evil twins" と呼び、"never use the evil twins" という。それはなんでかというと、型が違うときの評価が複雑だから。 以下のコー…

二重否定で Boolean にキャストする

二重否定 (double negation) で簡単に Boolean にキャストできる。 var hoge; !!hoge => false !!0 => false !!null => false !!undefined => false !!"" => false

Date クラスの直感的なインタフェース

Date クラスに直感的な (流れるような) インタフェースを実装してみた (ソースコード)。元ネタはこの一枚。 実行サンプルはこんな感じ。 var d = new Date(); => Wed Apr 30 2008 00:00:00 GMT+0900 (JST) d.tomorrow(); => Thu May 01 2008 00:00:00 GMT+09…

jQuery の $() の戻り値は jQuery オブジェクト

Prototype.js の感覚で jQuery の $() を使ったら詰まった。 SWFObject で貼り付けた SWF のメソッドを ExternalInterface で呼び出そうとして、 $("flashMovie").doSomething(); と書いたら、$("flashMovie") には doSomething が無いと言われる。 それもそ…

文章を皮肉っぽくするブックマークレットを作った

文章を皮肉っぽくするブックマークレットを作った。 javascript:(function(){document.body.innerHTML=document.body.innerHTML.replace(/([、。])/g,'(笑)$1');})(); このブログを皮肉っぽくする google で検索したら、これよりも高機能なものを見つけた。

フォールトトレラント設計 のための try..catch 節

JavaScript のランタイムエラーは、起こると処理がそこで停止してしまう。たとえば initModuleA();//エラーが起こる可能性のあるモジュール initModuleB(); initModuleC(); alert("done"); このコードで initModuleA でエラーが起こると、以降、initModuleB …

Helma の文字コードを UTF-8 にする

Helma のデフォルト文字コードは ISO-8859-1 なので、UTF-8 にしたい。結論から言うと app.properties に charset = UTF-8 を書くだけでよい。 アドホックだと感じつつも、hac ファイル全てに res.charset = "UTF8" を追加した上で db.properties に hoge.us…

if 文のワンライナー化

とあるコードにこのような行があった。 isHoge() && isFoo() && alert("ok"); やっていることは if (isHoge() && isFoo()) { alert("ok"); } なのだが、なるほどと思った。

jQuery の解説動画を見た

Dmitri Gaskin による jQuery の解説動画を見た。jQuery の API を一通り解説している。英語も聞き取りやすく勉強になった。 ひとつ驚いたのが、この子が 12 歳だということ。 Dmitri Gaskin drinks code with his cereal for breakfast every morning. He's…

Helma を触ってみた

TrimPath Junction を落として NextAction をちょっと触った。が、 NextAction よりも、Junction に付属している Helma に興味がわいたのでそちらを追ってみた。 仕組みもよくわからない状態で、チュートリアル (邦訳) をそのままトレースしてアドレスブック…

文字列と数値の + 演算時による結合

文字列と数値の + 演算時による結合について。 console.log(1 + 1 + "hoge" + 1 + 1); //=>2hoge11 console.log((1 + 1 + "hoge") + 1 + 1); //=>2hoge11 console.log(1 + 1 + "hoge" + (1 + 1)); //=>2hoge2 + 演算子の評価は左から右に行われるので、評価…

Amazon.com へのリンクを追加する Greasemonkey スクリプト

Amazon.co.jp の商品ページに .com の同一商品へのリンクを追加する Greasemonkey スクリプトを書いた。洋書のレビューや価格を調べるときに便利。元ネタは会社の上司。 AddAmazonDotCom.user.js // ==UserScript== // @name Add Amazon.com URL // @namespa…

サーバを経由せずに Flash の内容を画像に変換する

Flash で描画したベクター画像を img タグで表示させるデモを作った。肝はサーバプログラムを経由しないところ。 IE 以外のモダンブラウザなら、下の灰色の領域に線を描くと、その下に PNG 画像が現れるはず。 ペイントツール部分は、func09 さんのソースを…

メタプログラミングで生産性を上げる

メタプログラミングをすると生産性が上がる。 メタプログラミングには様々な定義があるが、ここでは広めに "無駄なコーディングや手作業を減らす手法" としておく。 以下に、実務 (主に Web のフロントエンド開発) に役立つメタプログラミングの例をいくつか…

JavaScript でリフレクションを利用する

JavaScript でリフレクションを利用してみた。肝は arguments.callee.toString(); 以下は、実行されているメソッド名を取得し、引数の数が正しくなければ、メソッド名と正しい引数を出力する例。 function hoge(a, b, c) { var matches = arguments.callee.t…

配列の集合演算を実装する

JavaScript の配列には、集合演算子が無い。仕事で使いそう且つ頭の体操も兼ねて、和集合、差集合、積集合を求めるコードを書いてみた。 //helper method function include(item, target) { for (var i = 0, len = target.length; i < len; i++) { if (item …

未だに YUI Compressor で文字コードを指定できない

前にも書いたが、依然として YUI Compressor の文字コード指定の方法がわからない。結局、泥臭いやり方で対応した。 $ nkf -w hoge_sjis.js > hoge_utf8.js $ java -jar yuicompressor.jar hoge_utf8.js > hoge_utf8_compress.js $ nkf -s hoge_utf8_compres…

スタックトレースを取得したい

JavaScript でスタックトレースを取得したい。結論から言うと、Firebug の trace 関数を呼ぶだけ。 console.trace(); Firebug が無くとも、数行のスクリプトで得られる。 スタックトレースの取得 (callee/caller/argumentsの利用) 上記サイトに掲載されてい…

YUI Compressor で文字コードを指定できない

解決済み YUI Compressor で文字コードを指定できない。 [hoge@foo bar]# java --version java version "1.4.2" gij (GNU libgcj) version 4.1.2 20070626 (Red Hat 4.1.2-14) ... java -jar yuicompressor-2.2.5.jar --charset Shift_JIS hoge.js [INFO] Us…

Untold JavaScript Secrets

John Resig が次に出す本が待ち遠しい。 Untold JavaScript Secrets Secrets: Table of Contents 前作『Pro Javascript Techniques』は良書だったが、Ajax/DHTML/OOP にフォーカスしたテクニック本 (タイトル通り) だったので、gotcha 感を得られなかった。 …

JavaScript で SWF ファイルを読み書きする

3to2 に触発され、JavaScript で SWF ファイルを読み込んで中身を書き換えるデモを作った。 JavaScript で SWF を読み書きする (Firefox 限定) 主な仕組み XmlHttpRequest で SWF バイナリを読み込む (参考) SWF を解析する (3to2 などを参考) Base64 エンコ…

JavaScript の辞書ファイル

JavaScript の辞書ファイルを導入した。 作者の cooldaemon 氏に足を向けて寝られない。

setInterval/setTimeout を使った非同期ループ

以下のような巨大なループを実行するとブラウザがフリーズする。 for (var i = 0; i < 100000; i++) { //... } alert("done"); フリーズを回避するには、for ループを、setInterval/setTimeout に置き換えればよい。Flash ならば onEnterFrame イベントも有…

Function.length

"JavaScript Method Overloading" を読んで、Function.length の存在を知る。 Function.length には、関数に明示的に定義された引数の数が入る。 var hoge = function(foo, bar) { console.log(arguments.length); // => 1 console.log(arguments.callee.len…

Image オブジェクトを appendChild すべきではない

Safari 1.x/2.x では、以下のコードは動かない。Safari 3.x では動く。 document.getElementById("hoge").appendChild(new Image()); なので、代わりに createElement を使う。 document.getElementById("hoge").appendChild(document.createElement("img"))…