2010-01-01から1年間の記事一覧

Firefoxはdocumentにclickイベントリスナーを登録すれば中・右クリックも捕捉できる

Firefoxのclickイベントは、イベントリスナーの登録先がdocumentか要素かによって、中・右クリックも捕捉するかどうかが変わる。 /* Firefox 3.6.13 */ document.addEventListener('click', function (e) { alert(e.button); /* 左クリック、中クリック、右…

Altキー+ドラッグによるアンカーテキストの選択を補助するGreasemonkeyスクリプト

Firefox 13 でAlt+クリックでリンク先のリソースを保存する機能が無効化された。この機能が必要ないのであれば、以下のスクリプトは必要ない。 以前のようにAlt+クリックでリンク先のリソースを保存したい場合はabout:configでbrowser.altClickSaveをtrueに…

空要素に対するCSSの疑似要素(:before, :after)指定

CSS

次の例で、テキストボックスの前、あるいはテキストボックス内に「hoge」という文字列の疑似要素は挿入されない。 <style> input:before { content: "hoge"; } </style> <input> CSS 2.1の仕様書にあたる。 As their names indicate, the :before and :after pseudo-elements speci…

Google Chromeで2chへのリンクを踏んだときに2ch専用ブラウザで開く

Google Chromeで2ちゃんねるの板やスレッドへのリンクを踏んだときに2ch専用ブラウザ(Janeなど)を開く方法。 URL書き換えエクステンションでhttpを適当な文字列に書き換え →レジストリにそのプロトコルでJaneを起動するように入力 で実現できる 手順 適当…

querySelector(All)のレシーバは、セレクタのコンテキストには影響を与えない

<ul id="list"> <li>階層1</li> <li>階層1 <ul> <li>階層2</li> <li>階層2</li> </ul> </li> </ul> <script> var list = document.getElementById('list'); var lis = list.querySelectorAll('ul li'); </script> 変数lisには階層2のli要素だけが含まれると思っていたが、実際には階層1のli要素も含まれてしまう。querySelector、querySelectorA…

HTMLFormElement#elementsにはtype="image"のinput要素は含まれない

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>HTMLFormElement#elements Test</title> <form action="#" id="testForm"> <ul> <li><input type="text"></li> <li><input type="password"></li> <li></li></ul></form></meta>

A要素は文字列コンテキストではhrefプロパティ値で評価される

window.openの第一引数にA要素(HTMLAnchorElement)をそのまま渡しているコードを見て、動かないんじゃないかと思って試してみると問題なく動いて驚いた。どうやらHTMLAnchorElementは文字列コンテキストではhrefプロパティの値として評価される、つまりtoS…

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

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;>…