タグ

ブックマーク / amachang.hatenablog.com (67)

  • とてもシンプルに自分自身が属する script 要素を取得 - IT戦記

    グローバル領域に以下の一行を書く <script> var currentScript = (function (e) { if(e.nodeName.toLowerCase() == 'script') return e; return arguments.callee(e.lastChild) })(document); alert(currentScript); </script>こうすることで、currentScript はこの script 要素を指す。 いちおう説明 DOM は構築されるときに、上から順番に構築される。そして、script タグがあると、 script 要素を構築したあとに、スクリプトを実行する。 つまり、スクリプトが実行されたとき script 要素は今まさに作られたばかりであり、それよりも後ろの要素が存在しない。さらにこの script 要素を含むすべての要

    とてもシンプルに自分自身が属する script 要素を取得 - IT戦記
  • JavaScript の配列と連想配列の違い - IT戦記

    id:cheesepie:20070131:1170172709 最近は、こういう風に JavaScript を勉強する人が増えていてとても嬉しいです ^^ id:cheesepie さん頑張ってください! で、ちょっと配列と連想配列の使いかたが違うようなので、エントリーを書こうと思いました。おせっかいだったらすみません>< ! やっぱり、このへんが JavaScript の難しいところのひとつなのだろうか。 ということで、 JavaScript の配列と連想配列の違い いってみよおー 連想配列とは JavaScript では連想配列は一番シンプルなオブジェクトのことである。つまり、すべてのオブジェクトは連想配列である。 以下のすべての連想配列はまったく同じものである。 // 1 var obj = { hoge: 'hoge' }; // 2 var obj = { 'hoge': 'h

    JavaScript の配列と連想配列の違い - IT戦記
  • IT戦記 - JavaScript の名前空間

    JavaScript での大規模開発では シンボルの衝突が非常に大きな問題となる。その代表例が Firefox の拡張機能内のシンボルである。 で、こんな記述ルールはどうだろう window['http://d.hatena.ne.jp/amachang/']={}; // URI (function(){with(this){ // ここにコードを書く }}).apply(window['http://d.hatena.ne.jp/amachang/']); // URI 例えば window['http://d.hatena.ne.jp/amachang/']={}; (function(){with(this){ var hoge = 'hoge'; // このスコープ内で共有するシンボル this.fuga = 'fuga'; // 同じ名前空間で共有するシンボル window.p

    IT戦記 - JavaScript の名前空間
  • IT戦記 - CSS の勉強会をしました

    2007 CSS Study Meeting http://artcode.g.hatena.ne.jp/keyword/2007%20CSS%20Study%20Meeting 発表をしましたので資料を置いておきます。 http://usrb.in/amachang/static/cssstudy/200701/ Firefox で動きます。IE でもぎりぎりうごきます。あ、でも、横長な表示域じゃないと崩れる可能性大です。 左右キーで操作してください。また、ソースは実行できるようになってるので、実際に実行しながら読んでいっていただけるとうれしいです。 他に事前に CSS のセレクタのバグリストとプロパティ一覧を作りました。 プロパティ一覧は element.style に辞書アタックを掛けて各種ブラウザから抽出したプロパティです。 http://usrb.in/amachang/stat

    IT戦記 - CSS の勉強会をしました
  • 関数一発でプロトタイプチェーンに繋げて、オブジェクトをクローンする。 - IT戦記

    最近、プロトタイプ的継承の話しが盛り上がっています。 http://blog.livedoor.jp/dankogai/archives/50662064.html http://labs.cybozu.co.jp/blog/kazuho/archives/2006/10/javascript_string.php http://blog.livedoor.jp/dankogai/archives/50662606.html 最終形がやたら複雑になっています でも、実際はあそこまで複雑に書かなくても、できると思います ^^; そう思う理由 P 関数は object 関数の中でローカルのものである。コンストラクタとして使える必要はない。なので、 Atomic な場合でも P は function(){} でいい。 method 関数では P.prototype のプロパティに関数が代入されて

    関数一発でプロトタイプチェーンに繋げて、オブジェクトをクローンする。 - IT戦記
  • IT戦記 - JavaScript の数値はある一瞬だけオブジェクトになる。

    いちおう、先に Firefox でしか試してないと白状しておきます。 JavaScript は数値もオブジェクトのように扱える (1).toString() // 文字列 "1" が復帰される しかし、以下のコードを試すと var a = 1; n.a = 1; alert(n.a); // undefined と表示される ここで二つ仮説を立てた 数値へのプロパティ追加はスルーされる。 数値はドット演算によって一時的にオブジェクト化されてその後戻る。だから、オブジェクト化されたときに代入されても、再びオブジェクト化されたときとは別のオブジェクトになっている。 どうすれば、それを確かめられるだろうか さんざん悩んだ(深夜4時)。。。。うーん。うーん。 思いついた! こうすればいいんじゃね? alert(typeof 1); // 'numer' (function(){alert(type

    IT戦記 - JavaScript の数値はある一瞬だけオブジェクトになる。
  • それすぐ実行!JavaScript! - IT戦記

    思った JavaScript はすぐに実行してみましょう! ブラウザの URL 入力欄に javascript:(function() { /*実行したいコードを書く*/ })()FireBug を使ってる人は、コンソール開いて実行したいコードを書く。 たとえばこんなことができます。 これらの例は僕が日頃使っているものです。 グローバルで使える関数を列挙する(Firefox Only) FireBug用 for(var n in window) if(typeof window[n]=='function')console.log(n); URL用 javascript:(function(){var b='';for(var n in window)if(typeof window[n]=='function')b+=n+"\n";alert(b)})() Object.prototyp

    それすぐ実行!JavaScript! - IT戦記
  • DOM 系の関数は IE に合わせればいいんじゃね? - IT戦記

    IE 以外のブラウザは HTML 要素(Element)の prototype がとれる prototype とはクラスの定義のようなもの。 具体的には 以下のようにとれる ブラウザ 方法 Opera HTMLElement.prototype Firefox HTMLElement.prototype OR document.documentElement.__proto__.__proto__ Konqueror (たぶんSafariも(情報求む)) document.documentElement.__proto__ prototype を書き換えるとそれと繋がるオブジェクトは全て書き換わる これはおもしろい。 例のごとく IE だけ取れないので 動作が違う関数はすべて IE に合わせてやればいいんじゃない!?(ヒラメキ!)と思った たとえば。。。 Ptototype.js の Ev

    DOM 系の関数は IE に合わせればいいんじゃね? - IT戦記
  • IT戦記 - 複雑で重くなった JavaScript を超高速化する方法3

    8 ヶ月前に setInterval 書き換えのネタで作ったやつ id:amachang:20060104:1136344836 id:amachang:20060114:1137243389 ふと ちょっと設計変えたらすごく速くなる気がして、作り替えてみた。 でも、作ってみたら clearInterval がちょっとだけ速くなったけど、正直そこまで変わらなかった。 でも、設計はきれいになったと思うので公開します。 ダウンロード http://sample.ecmascript.jp/setInterval/setInterval03.js 以前のもファイル化した 最初の失敗作(utf-8だから適当にエンコードして使ってください) 次に作ったやつ、実績はこっちのがある(utf-8だから適当にエンコードして使ってください) 使いかた すべてのスクリプトより前に読み込む <script src

    IT戦記 - 複雑で重くなった JavaScript を超高速化する方法3
  • IT戦記 - 複雑で重くなった JavaScript を超超ちょ???高速化する方法。

    前回(id:amachang:20060104)の改良版です。前回のでやっていたら、queueを走査する時間がかかりすぎるようになって結局崩壊してしまったので、さらに改良しました。ただし、今回のは時間が多少ずれる場合があります。なので、ストップウォッチなどのプログラムを作る場合は使わないでください。 主な改良点としては .(ドット) 減らす。 文字列リテラルをループ中に記述しない。 ループ。ループのネストを減らす。 new を減らす。 関数コールを減らす。 より早い演算を使う。(+1 を ++ にするとか。他にもいっぱい) これで、めっちゃ早くなりました。やヴぁいです。 ミニマム版 var _SIi=10,_SIM='第一引数が不正です。',_SIl=0,_SIc=0,_SIS ='string',_SIF='function',_SIf=window.setInterval,_SIp=[

    IT戦記 - 複雑で重くなった JavaScript を超超ちょ???高速化する方法。
  • IT戦記 - [javascript] Plain Old JavaScript Prototypes (普通の JavaScript も使えるようにしよう)

    Prototype.js や MochiKit や jQuery や dojo こういう便利なライブラリがたくさん出てきてとても便利になりました。 でもそのライブラリ当に必要? たしかに、グループワーキングを行うにはこれらのライブラリは必須だと思います。 でも、ちょいスクリプトを作るのに .bind(this) や $ や each や Event.observe が必要でしょうか。 いささかオーバスペックな気がします。 実際に「このツール Prototype.js 必須かよ。こっちは MochiKit で作ってるのにぃ」とかってことも多々あります。 あれを使うためにあれとこれを読み込んで、これを使うためにこれも必要だな。こんな感じだとサイトはどんどん重いものになってしまします。。。orz そこで、原点回帰です。 ちょっとしたツールでライブラリ使うのはやめようよ!何も使わなくても Jav

    IT戦記 - [javascript] Plain Old JavaScript Prototypes (普通の JavaScript も使えるようにしよう)
  • IT戦記 - JavaScript を学ぶ際に一番重要なのに、誤解されがちな setTimeout 系の概念

    おそらく、JavaScript を使いこなす肝は setInterval、setTimeout、イベントによる関数の実行を理解することだと思う 例えば 次のコードの結果を考えたとき document.write("hoge\n"); setTimeout(function(){ document.write("fuga\n") }, 1000); document.write("piyo\n");普通に JavaScript を使いこなしてる人なら、hoge → piyo と表示して、 1 秒後に fuga が表示されるな。って思うはずなんです。 でも、 JavaScript を始めたばっかりの人の中には、 hoge と表示したあと 1 秒後に fuga → piyo と表示するな。って思ってる人が非常に多い。(経験的に) 何故か? たぶん、どのサイトの setTimeout の説明を見て

    IT戦記 - JavaScript を学ぶ際に一番重要なのに、誤解されがちな setTimeout 系の概念
  • FireBug と benchmark.js を使って稼働中のサービスの JavaScript パフォーマンスをチェックする - IT戦記

    まずはこれを見てください。 http://sample.ecmascript.jp/bench.htm このような感じで FireBug のコンソールを表示させて 適当なサーバにある benchmark.js を読み込んで benchmark.at('firebug')({ 'テスト1': function() { ... } }); って感じで、どんなサイトでもパフォーマンスを計ることが出来ます。 何が嬉しいのか いちいちサービスの JavaScript を書き換えて計測する必要がない。 思いついたときに、パフォーマンスチェックができる。 FireBug を入れていない、または Firefox 以外でパフォーマンスを計りたい場合 URL 欄に javascript:(function(){var s=document.createElement('script');document.bo

    FireBug と benchmark.js を使って稼働中のサービスの JavaScript パフォーマンスをチェックする - IT戦記
  • IT戦記 - ベンチマークツール公開

    最近 またしても、JavaScript のベンチマークを取らなければならない仕事が来たので、 ツールをキレイにしました。 それを公開します。(ダウンロードは一番下にあります。) 使い方 script タグで benchmark.js を読み込んで、以下のように連想配列の関数群を渡すだけです。 benchmark({ 'ほげほげの計測': function() { ...... }, 'ふがふがの処理の計測': function() { ...... } }); 結果は以下のように表示されます。 *** ほげほげの計測 *** result : 0.0011[ms] *** ふがふがの処理の計測 *** result : 0.111[ms] 表示された秒数は 関数の中身を一回だけ実行する時間です。 関数呼び出しのコストは差し引かれています。 また、FireBug を使っている場合は benc

    IT戦記 - ベンチマークツール公開
  • 勉強が出来ない奴はプログラマになれ!(バカだからできる勉強法) - IT戦記

    どのくらいの人がこのブログを読んでいるか分かりませんが、 もし、勉強が出来ない人が周りにいたら、このブログを紹介してあげてください。 ふと 勉強が出来ない人は、プログラマになったほうがいいと思った。 僕はというと 自分でも驚くくらい勉強というものが出来ない。ものごとを知らない。 はっきり言ってバカなのである。 たとえば、 大学行ってない。 株式公開と上場の違いを知らなくて、一同ぽかーん。 つい最近まで、サイバーエージェントを知らなかった。(技術者には必要ない) 英語が一切読めない。 宮崎料理「冷や汁」を「冷や飯」だと思ってた。 基的に会議とかでよく出る英語、「さじぇっしょん」とか、「あさいん」とか、「ぶらんでぃんぐ」とか、「うぇぶつーぽいんとおー」とか、よく分からん。 人力(じんりき)検索を入力(にゅうりょく)検索だと思っていた たぶん、まだまだあるけど、自分がバカだから気がつかないんだ

    勉強が出来ない奴はプログラマになれ!(バカだからできる勉強法) - IT戦記
  • Catalyst勉強会資料 - IT戦記

    けっこう前ですが、会社の勉強会で Catalyst についてやりました もったいないので、共有しときます。 http://sample.ecmascript.jp/Catalyst.ppt そんな矢先ですが、 Catalyst が 5.7 になったようですね。ちょっと調査しないと

    Catalyst勉強会資料 - IT戦記
  • 要素をキャッシュして $ 関数をちょっと高速化 - IT戦記

    prototype.js の $ 関数で あっちこっちで、$、$、ってやるとその都度ノード探索発生してうざいので ↓prototype.js 1.5 の $ 関数 function $() { var results = [], element; for (var i = 0; i < arguments.length; i++) { element = arguments[i]; if (typeof element == 'string') element = document.getElementById(element); results.push(Element.extend(element)); } return results.length < 2 ? results[0] : results; } キャッシュしてみますた。 でも、IDがダイナミックに変更される場合(あんまな

    要素をキャッシュして $ 関数をちょっと高速化 - IT戦記
  • Shibuya.js を終えて #2 - IT戦記

    資料置いておきます。(Firefox 推奨、IE では一部エフェクトが効きません) ↓上下キーでページ送りです。 http://sample.ecmascript.jp/shibuya_js_tt2/amachang/ 感想 うーん。テーマがテーマなだけに新しいことを話すのが難しかった。 やっぱ、prototype.js script.aculo.us は語りつくされた感ありますね。 そんな中、 id:motemen さんの Mochikit にびびっとキマシタね! これだ!みたいな。今後、 prototype.js よりも Mochikit をいじっていきましょうかね。 あとは、最速 ma.la さんがすごかった。Trigger はパクると思う。 関連リンク http://shibuyajs.org/articles/2006/06/15/technical-talk-2

    Shibuya.js を終えて #2 - IT戦記
  • IT戦記 - Shibuya.js Technical Talk #1 を終えて。

    皆様のお話し、とても勉強になりました。そして、楽しかったです。 自分自身にこのような機会を与えてくれた、id:secondlife さん及び Shibuya.js の皆様に感謝します。 また、別のテーマでも話せる機会があれば、ぜひ、挑戦してみたいと思います。 これからも、amachang をよろしくお願いします。 資料をアップしました。 http://sample.ecmascript.jp/20060414.ppt

    IT戦記 - Shibuya.js Technical Talk #1 を終えて。
  • Script.aculo.us の Effect をちょっと簡単に書く方法 - IT戦記

    普通はこういう風に書く new Effect.Opacity($('id'), {from: 1, to: 0});こういう、インスタンスを取得しない new は JavaScript では一般的に使われる。 関連するプロパティを this にまとめ、イベントを this に bind して分かりやすくするためである。 でも、慣れてないと逆にわかりにくい。 それで、最近のScriptaculousではこう書ける。 $('id').visualEffect('opacity', {from: 1, to: 0});こっちのが、ちょっとイメージ掴みやすいですよね。 ついでに、こんな書き方も出来るかも!(未検証) <a href="javascript:void(0);" onmouseover="Element.extend(this);" onclick="visualEffect('opa

    Script.aculo.us の Effect をちょっと簡単に書く方法 - IT戦記