要素ノードにデータを紐付ける関数

HTML5で、紐付けたいデータが文字列なら、data-で始まる属性(custom data attribute)を付けることができる(詳細はコメント欄を参照)。 DOM3のNode#setUserData・Node#getUserDataのように、間接的に要素とデータを紐付けられる関数を作った。jQuery.data()…

jQueryを使わずに画像の先読み(プリロード)

function preLoadImages() { for (var i = 0, I = arguments.length; i < I; ++i) { new Image().src = arguments[i]; } } preLoadImages("image1.gif", "/path/to/image2.png"); Preloading Images with jQuery and JavaScript | Code Engineered [JS]jQuer…

Firefoxでのみ動くイベントリスナー

Firefoxでは、グローバルスコープに「on+イベントハンドラ名」の名前の関数を宣言すると、その関数をwindowのイベントハンドラとして設定してしまうので気をつける。 // グローバルスコープで function onclick(evt) { alert('click'); } // Firefoxのみ、こ…

使い捨て関数と使い捨てコンストラクタ

使い捨て関数 無名関数と呼ばれているけど、ここでは使い捨て関数と呼ぶ。 (function () { // 即実行される })(); 使い捨てコンストラクタ 無名コンストラクタ? new function () { // 即実行される // ただし、コンストラクタとして }; コンストラクタとし…

ページ内のタブ文字をスペースに置き換えるブックマークレット

タブ文字(\t)を半角空白2文字に置き換えるブックマークレットを作った。IEでは動かない。インストールはリンク先から。 tabToSpace - Hatena::Let document.body.innerHTML = document.body.innerHTML.replace(/\t/g, ' ');と単純に書くこともできる(IEでも…

簡単な影付きborder

CSS

[CSS]borderプロパティを使用した華麗なる四つのエフェクト | コリス Liner Noteで使われている方法で、border-style: groove;で影付きのボーダーを作れる。> 普通のボーダー border-bottom: 1px solid #666; 影付きのボーダー border-bottom: 3px groove #c…

整数の数値リテラルから直接Numberのメソッドを呼ぶ

255.toString(16); // (1) ドットが小数点と見なされSyntax Error (255).toString(16); // (2) 255..toString(16); // (3) 255 .toString(16); // (4) (4)はJS MinifierやBookmarklet Builderが(1)に変換してしまうので、(3)。 Number オブジェクトのメソッ…

目次を生成するブックマークレットを作った

インストールはリンク先から。 TOC - Hatena::Let IE対応は諦めた。 リストをネストする部分は、コードは書き直したけど、やっていることは前に作ったものと大体同じ。 目次をクリックしたときの処理をa.addEventListener( 'click', (function (elm) { retur…

ファイル名順にソートする

Array#sortでファイル名順にソートするための比較関数。具体的には、数字部分は桁数に関わらず数字順に比較し、それ以外の文字は辞書順に比較する。全角数字にも対応。他にも考慮すべき点があるかもしれない。 function compareFileNames(a, b) { var fullWi…

HTAでコマンドライン引数を取得・分割

HTAにコマンドライン引数を渡す 送るメニュー(SendTo)にHTAのショートカットを登録する。 HTAに直接ファイルをドラッグ&ドロップできるようにレジストリを登録する。 HTAでコマンドライン引数を受け取る HTA:APPLICATION要素に設定したid属性値が、HTA:AP…

EnumeratorおよびDictionaryの覚書

JScript(IEのJavaScript実装)なので、他のブラウザでは動かないし、普通のWebページでは使わないこと。 Enumeratorオブジェクト メソッド4つのみのシンプルなオブジェクト。 var e = new Enumerator(collection); メソッド 説明 e.moveFirst() ポインタを…

ちょっとしたことを試すだけのページでも、body開始タグは省略しないこと

<meta charset="UTF-8"> <title>TEST</title> <div id="result"></div> <script> document.getElementById('result').innerHTML = '12345'; </script> IE8とFirefox3.6ではエラーとなる。開発者ツール/Firebugで見ると、末尾のscript要素がhead要素の子になっている。内容のない要素はスキップしてしまうのかな。不思議。 div#resultの前に</meta>…

chrome.browserAction.onClicked.addListener テンプレート

Google Chrome拡張機能用。あるページがすでに開かれていればそのタブを選択。開かれていなければ新規タブでページを開く。HOGE.htmlのところを開きたいページのパスに書き換える。 素直にforループにした。 chrome.browserAction.onClicked.addListener(fun…

オブジェクト(JSON)から定義リスト(DL要素)を生成する

array2listを作ったついでにと思ったけど、こっちの方が実用性がありそう。array2listにも少し手を入れて、オブジェクトと配列の入れ子にも対応したので、JSONのdumpもできる。 function object2dl(object, doc) { if (!doc) doc = document; var dl, dt, dd…

多次元配列からリスト(UL・OL要素)を生成する

オブジェクトの入れ子にも対応したバージョン function array2list(array, ordered, doc) { if (!doc) doc = document; var list = doc.createElement(ordered ? 'ol' : 'ul'), li; for (var i = 0; i < array.length; ++i) { var item = array[i]; var item…

0と1を交互に得る

var f = 0; f^=1; // => 1 f^=1; // => 0 f^=1; // => 1 f^=1; // => 0 おまけ:0と-1を交互に得る 使い道思い浮かばないけど...。 var f = 0; f=~f; // => -1 f=~f; // => 0 f=~f; // => -1 f=~f; // => 0

livedoor Readerをホイール操作ですいすい読むためのGreasemonkey

もともと#headerの部分でマウス操作ができるけど、コストの高い「クリック」に次の記事への移動が割り当てられているため、どんどん記事を流し読みしていくような使い方だと指が疲れる。今になってクリック→クリックしっぱなしで自動スクロールできることを…

リンクを左ボタン長押しによって新規タブに開きたい

かざぐるマウスというソフトでできる(左ボタン長押しにCtrl+Shift+クリックを割り当て)んだけど、僕の環境だとFirefoxだけうまく作用しない(効くリンクと効かないリンクがある)ので自分で作ることにした。最初はGreasemonkeyスクリプトとして作っていた…

ソートアルゴリズム

バブルソート 挿入ソート シェルソート 選択ソート マージソート バブルソート function bubbleSort(data) { var l = 0, r = data.length - 1, i, temp, last; while(l < r) { i = r; last = l; while(i > l) { if(data[i-1] > data[i]) { temp = data[i-1];…

Array.new

「new」は予約語だった。 Array.neww = function(len, val) { var arr, i, undefined; if (typeof len !== 'number') { throw new TypeError('"' + len + '" is a not number'); } if (len < 0) { throw new RangeError('invalid array length'); } arr = ne…

カード配り問題 その2

カード配り問題 - rikubaの日記の続き。 Array#zipという正しくこの問題のためにあるようなメソッドを発見。 10分でコーディング - 簡潔なQ 凄い。 というわけで class Cards def deal(numPlayers, deck) return Array.new(numPlayers) {|i| ""} if numPlaye…

カード配り問題

10分でコーディング | プログラミングに自信があるやつこい!! 時間は気にせず挑戦してみた。 require "test/unit" class TestCards < Test::Unit::TestCase def setup @cards = Cards.new end def test_deal assert_equal(["111", "222", "333"], @cards…

シェーカーソート

function shakerSort(array) { var l = 0, r = array.length - 1, last, i, temp; while(true) { last = -1; for(i=l; i<r; ++i) { if(array[i] > array[i+1]) { temp = array[i]; array[i] = array[i+1]; array[i+1] = temp; last = i; } } if(last == -1) return; r = last; last =</r;>…

バブルソート

function bubbleSort(array) { var r = array.length - 1, last, i, temp; while(0 < r) { last = -1; for(i=0; i<r; ++i) { if(array[i] > array[i+1]) { temp = array[i]; array[i] = array[i+1]; array[i+1] = temp; last = i; } } if(last == -1) return; r = last; } }</r;>

選択ソート

function selectionSort(array) { var i = 0, len = array.length, min, temp; for(; i<len; ++i) { min = i; for(var j=i+1; j<len; ++j) { if(array[min] > array[j]) { min = j; } } temp = array[i]; array[i] = array[min]; array[min] = temp; } }</len;>

はてなダイアリーの注釈をその場に展開するブックマークレット

注釈*1が多い記事は、ページを上下に行ったり来たりしなければならなくて面倒*2 *3なので、注釈のリンクを注釈の内容に置き換える*4ブックマークレットを作った。 前のはいまいちな気がしたので書き直し。まだ納得いかないけどとりあえず。もう少し汎用的に…

Google Chromeに「左側のタブを閉じる」がないのが素敵

Google Chromeのタブのコンテキストメニューには「右側のタブを閉じる」があって「左側のタブを閉じる」がない。僕はFirefoxをメインで使っていて、FireGesturesという拡張機能で ↓←で左側のタブを閉じる ↓→で右側のタブを閉じる とマウスジェスチャーを割り…

Firebugの$$()の落とし穴

Firefox 3.5.6 + Firebug 1.4.5。 ユーザーCSSを作るときにパパッとセレクタの対象になる要素を確認できて便利だな、と思っていたら、疑似セレクタが使えないなどdocument.querySelectorAllとは別物のよう。まあそれくらいなら良いけれど、クラスセレクタが…

FirefoxではHTMLCollection#namedItem()の戻り値は(該当する要素が複数あっても)1つの要素

Greasemonkeyスクリプトを作成しているときにつまずいた。 XPCNativeWrapper - MDC (XPCNativeWrapper の制限事項)HTMLCollection に設定された XPCNativeWrapper では、名前による要素のアクセスが動作しません。 この場合は、コードとして namedItem() メ…

配列をソートするとき(Array#sort()の引数)に使う比較関数についての覚書

JavaScript 第5版の118ページ。 基本 引数を指定しなければ辞書順でのソートになる。数値は文字列として比較されるので、33と4では1文字目(3と4)の比較となり33が先になる。 var a = [33, 4, 1111, 222]; a.sort(); // 1111, 222, 33, 4(辞書順) 他の順…