配列の要素を検索
Array#searchとかあっても良さそうだけど、用意されていないようなので適当に定義。
/** * 配列から要素を検索 * @param a0 検索する要素またはテスト関数 * @return number 要素の添字。見つからない場合は-1 */ Array.prototype.search = function(a0) { if( a0 instanceof Function ){ for( var i=0, l=this.length; i < l; i++ ) if( a0(this[i]) ) return i; }else{ for( var i=0, l=this.length; i < l; i++ ) if( this[i] == a0 ) return i; } return -1; };
用意されてそうで無いのは何故だろう。
JavaScriptでコールスタックを取得
arguments.callee.callerが使える環境でのみ動作
コード
function getCallStack() { var caller = arguments.callee, ret = []; while( (caller = caller.caller) ) ret.unshift(caller); return ret; }
テストBookmarklet
javascript:function f(a,b){a=[],b=arguments.callee;while(b=b.caller)a.unshift(b);return a}function a(){alert(f())}function b(){a()}b()
Eclipse Helios(3.6)が起動せず、"Failed to create the Java Virtual Machine."というエラーが出る場合の対処法(Windows)
選択した範囲のURLをまとめて開くBookmarklet
Google Chrome 6.0.472.53 betaで動作確認。
厳密に動作を検証したわけではないので、予期せぬ動作をするかもしれません。
javascript:var r=getSelection().getRangeAt(0),b=r.startContainer,e=r.endContainer,t='childNodes',b=b[t][r.startOffset]||b,e=e[t][r.endOffset]||e,t='firstChild',c='nextSibling';while(r=b[t])b=r;for(;;){if(r=b.href)open(r);while(b!=e&!b[c])if(b=b.parentNode,r=b.href)open(r);if(b==e)break;b=b[c];while(r=b[t])b=r}!1
Web Inspectorから動作確認したときはwindow.openがポップアップブロックに引っ掛かって、さらに解除しても新規ウィンドウで開いたが、Bookmarkletとして実行するとポップアップブロックに引っ掛からず新規タブで開かれるみたい。
ちなみにos0xさんのLDRですべての外部リンクをバックグラウンドタブで開くUserScripts - os0x.blogの方法でミドルクリックをエミュレートしても、Web Inspectorだとポップアップブロックに引っ掛かってwindow.openと同じ挙動となった。
Bookmarkletの短縮化作業の間に使った手法など。
- 長いメソッド名を変数に格納
- 1文字の識別子名(変数・メソッド)
- 変数の使い回し
- "window."の省略
- &&を&に置き換える (左右の項がtrue or falseの場合に等価)
- while(1)をfor(;;)に置換
- カンマ(",")演算子の使用 (カンマ演算子は右辺の値を返す)
- ブロック末尾直前のマルチステートメント(";")省略
- javascript:疑似スキームの末尾に置かれるvoid(0)を!1に置換 (false, null, undefinedだとページ遷移しない模様)
- 変数定義(var)で同じ変数を何度も列挙 (var a=1,b=2,a=3のような記述で、左辺の値を右辺で参照可能)
使っているDOM API等
- window.open
- window.getSelection
- Selection#getRangeAt
- Range#startContainer
- Range#startOffset
- Range#endContainer
- Range#endOffset
- Node#firstChild
- Node#childNodes
- Node#childNodes[]
- Node#nextSibling
- Node#parentNode
正規表現メモ
忘れがちなのでまとめておく。
基本的な部分はどこのサイトにでも載っているので割愛。
- 後方参照 $n,\n
グループ化した部分文字列を後で利用- パターン内で
/(A)b\1/ → AbAにマッチ - 置換文字列内で
/(A)b\1/, $1 → Aとなる
- パターン内で
- 非格納グループ化 (?:…)
内部でキャッシュされない - 後読み (?<…), (!<…)
/(?/(! - 先読み (?=…), (?!…)
/hoge(?=fuga)/ → fugaが後に続くhogeにマッチ
/hoge(?!fuga)/ → fugaが後に続かないhogeにマッチ
パターン | 意味 |
---|---|
(?=XXX) | ゼロ幅肯定先読み表現。パターンの後にXXXがある場合にマッチ |
(?!XXX) | ゼロ幅否定先読み表現。パターンの後にXXXが無い場合にマッチ |
(? | ゼロ幅肯定後読み表現。パターンの前にXXXがある場合にマッチ |
(! | ゼロ幅否定後読み表現。パターンの前にXXXが無い場合にマッチ |
正規表現 エンジン・ライブラリ
名前 | コメント |
---|---|
K2Regexp | K2Editor |
Irregexp | Google Chrome |
PCRE(Perl Compatible Regular Expression) | Webkit, PHP |
JPCRE | Webkit? |
RE2 | |
鬼車(Oniguruma) | 小迫氏作, Ruby |
Carakan | Opera |
Futhark | Opera |
jre.dll | 山田和夫氏作, 秀丸エディタ, EmEditor |
hmjre.dll | 秀まるお作, 秀丸エディタ |
Bregexp | SakuraEditor |
WREC(the Webkit Regular Expression Compiler) | SquirrerlFish Extreme |
参考URL忘れた…
後日書く。
JavaScript言語メモ
プロパティの属性について
- var宣言文で定義された変数はDontDelete属性がついており、delete演算子で削除することができない。
- ArrayインスタンスのlengthプロパティなどはDontEnum属性がついており、for in構文で列挙されない。
object.propertyIsEnumelable(propertyName)でプロパティのDontEnum属性を調べることが可能。
ツイートを読むのに必要な時間を表示するBookmarkletを140文字で書いてみた
元ネタ。
http://tt3000.blog12.fc2.com/blog-entry-15.html
たった一行追加するだけでサイトの滞在時間を13.8%伸ばす方法・・・ | IDEA*IDEA
http://briancray.com/2010/04/09/estimated-reading-time-web-design/
Twitterの自分のTL(https://twitter.com/home)を開いて以下をアドレスバーに入力、Enterで実行してみてね。
javascript:$('.entry-content').each(function(){$(this).parent().next().append($('<b>'+Math.round(this.innerText.length/.67)/10+'秒</b>'))})
文の長さが60文字のワケ - コラム - ライトノベルを書こう!!より、NHKのアナウンサーは1分に平均400文字程度読むということから、文字数/(400/60)で1秒あたりにかかる文字数を計算してます。