素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: twitter: @javascripter にどうぞ。

2008-05-01から1ヶ月間の記事一覧

Arrayのuniq()を作る

配列を重複しないようにするメソッド。 Array.prototype.uniq=function(){ var r=this; return r.filter(function(a,i) !r.slice(i+1).some( function(b)a===b ) ) } var array=[1,1,2,3,4,1,null,null,undefined,HTMLElement,'a','b',HTMLElement,'b']; arr…

エレメントのbackgroundColorを数値で取得する

function getBgColor(elem){ var [r,g,b]=getComputedStyle(elem,null).backgroundColor .replace(/[^\d,]/g,'') .split(',') .map(function(i)parseInt(i)); return {r:r,g:g,b:b}; } getBgColor(document.body);//Object r=0 g=0 b=0 こんな感じかな。 取…

エラトステネスの篩

エラトステネスの篩 - Wikipediaを参考に。 function primeNumber(n){ var r=[],s=[],tmp; for(var i=2;i<=n;r.push(i++)); do{ s.push(tmp=r.shift()); r=r.filter(function(i)i%tmp); }while(r[r.length-1]>tmp*tmp); return s.concat(r); } primeNumber(2…

try〜catch文の正しい使い方

try〜catch文は、エラーを処理するときに使う。たとえば、ユーザーにXPathを入力してもらい、document.evaluateでそれを評価する時、ユーザーが間違ったXPathを入力するかもしれない。 上の内容をそのままコードにすると、 var xpath=prompt('type XPath'); …

XPathはDOM+JSより速いのか

XPathと、getElementsBy〜の速度比較。はてなハイク - お絵かきも楽しめるミニブログからclass名がentryである要素を抽出する場合。 console.time('speed'); for(var i=0;i<100;i++)document.getElementsByClassName('entry') console.timeEnd('speed'); con…

いろいろなものを配列に変換する

HTMLElement.prototype.to_a=function()Array.slice(this); Element.prototype.to_a=function()Array.slice(this); HTMLCollection.prototype.to_a=function()Array.slice(this); XPathResult.prototype.to_a=function(){ var r=[]; switch(this.resultType)…

outerHTMLを作ってドキュメント全体のソースを取得する

FirefoxにはinnerHTMLはあってもouterHTMLがない。 でも、__define[SG]etter__とかを使えば再現できる。 HTMLElement.prototype.__defineGetter__('outerHTML', function(){ var tmp=document.createElement('div'); tmp.appendChild(this.cloneNode(true));…

先頭を0で埋めて桁をそろえる(解説付き)

使いたい場面はけっこうあるのにいざ作ろうとなると難しい。 Number.prototype.fillZero=function(n)(new Array(n).join('0')+this).substr(-n); var n=1234; n.fillZero(5);//01234 妙なテクニック使いまくりだから後で読んでわかるようにコメント付きのソ…

FirefoxでもcurrentStyleを使う

HTMLElement.prototype.__defineGetter__('currentStyle', function()getComputedStyle(this,null) ) とすれば、 document.body.currentStyle.backgroundColor みたいな感じで現在のスタイルが取得できるようになる。OperaとIEはもとからできる。 currentSty…

Webページの階層を上るブックマークレット

javascript:location.href=location.href.split(/\/(?!$)/).slice(0,-1).join('/') Firefoxならスマートキーワードとかキーワードサーチとかクイックサーチとかそういうやつに../として登録すると便利。

let文とlambda

let(foo=1,bar=2){ console.log(foo,bar);//1,2 } console.log(foo,bar);//undefined,undefined は (function(foo,bar){ console.log(foo,bar);//1,2 })(1,2) console.log(foo,bar);//undefined,undefined とできる。 let(foo=1){ let(bar=2){ console.log(f…

ネイティブのgetElementsByClassNameはすごく速い

Firefox2でgetElementsByClassNameを使えるように適当に作ったスクリプトと、Firefox3のネイティブのメソッドの速度の差がすごくてびっくりした。作ったスクリプトは HTMLElement.prototype._getElementsByClassName=function(className){ var r=this.getEle…

データを送信するまえに確認する

document.addEventListener('submit', function(e){ !confirm('送信しますか?')&&e.preventDefault(); },false); そろそろネタ切れ。何をしよう。

forループを多少高速化する方法

インクリメントするんじゃなくてデクリメントすれば、lengthプロパティへのアクセスを減らせて高速化ができる。 たとえば、 var foo=new Array(1000000); var start=new Date().getTime(); for(var i=0;i<foo.length;i++); var end=new Date().getTime(); end-start; は僕のPCでは940msだったけど、 var foo=new Array(1000000); var start=new Date().getTime(); for(var i=foo.length-1;i>=0…</foo.length;i++);>

はてなキーワードの自動リンクを無効にするGreasemonkeyを書き直した

はてなキーワードへのリンクを削除するGreasemonkeyを修正 - 素人がプログラミングを勉強するブログでいろいろ直して完璧だと思ったんだけど、AutoPagerizeで継ぎ足しされたページでうまくいってなかったっぽい。ついでにXPathを使わないように修正した。 //…

Array.sortの挙動

[ false, '', 0, null, 'a', new String, new Number, new Boolean, new Array, 1, undefined, NaN, void 0, true ].sort() としたら、結果は ["", , [], 0, 0, 1, NaN, "a", false, false, null, true, undefined, undefined] になった。 falseとtrueの間に…

いろんなサイトをhAtomに対応させるGreasemonkey

// ==UserScript== // @name microformats // @namespace http://d.hatena.ne.jp/javascripter/ // @include http://* // ==/UserScript== function getSITEINFO(){ if(!GM_getValue('cache')){ GM_xmlhttpRequest({ method:'GET', url:'http://wedata.net/d…

SBMからブックマーク画像を取得する

function getSBMImage(url,site){ var apiUrl; switch(site){ case 'hatena':apiUrl='http://b.hatena.ne.jp/entry/image/';break; case 'livedoor':apiUrl='http://image.clip.livedoor.com/counter/';break; case 'yahoo':apiUrl='http://num.bookmarks.ya…

エレメントを画面中央に表示する

function setCenter(element){ element.style.top=Math.floor((screen.availHeight-element.offsetHeight)/2)+'px'; element.style.left=Math.floor((screen.availWidth-element.offsetWidth)/2)+'px'; element.style.position='fixed'; window.addEventList…

/a/gみたいな文字列から正規表現オブジェクトを作る

追記:動いていなかった。下のコードは修正済み。 RegExp.parse=function(str){ var [,pattern,flags]=str.split(/^\/|\/(?=[igmy]*$)/); return new RegExp(pattern,flags); } var re=RegExp.parse('/foo\/bar\\\\baz[^/]/ig'); 'foo/Bar\\baz-foo/Bar\\baz…

正規表現をエスケープする方法と、Greasemonkeyの@includeみたいなものを実現する方法

まず、正規表現をエスケープする関数を作り、Greasemonkeyの@includeのように、*というワイルドカードを正規表現用に、.*?に置換する。ただし、*は関数によってエスケープされてしまっていることに注意。 function escapeRegExp(str){ if(str instanceof Reg…

はてなハイクのユーザーアイコンを全てデフォルトさんにする

Array.forEach(document.getElementsByClassName('profile-image'), function(img){ img.src='data:image/gif,GIF89a%10%00%10%00%F3%0C%00%9B%CC%F2!%5E%97%D8%B5X%9D%80.%EF%E8%D9%40%87%C4p%B6%EE%DD%BDf%F3%E7%C0%F7%E0%A2%FA%DB%87%5C%A5%E0%FF%FF%FF%0…

beforeunloadイベントを使ってWebページの滞在時間を調べる

var start=new Date().getTime(),end; window.addEventListener('beforeunload', function(){ end=new Date().getTime(); alert(end-start); },false); こんな感じ。実際に使うには、アラートを表示するんじゃなくてcookieに保存したり、サーバーに送信した…

括弧の対応が正しいか調べる

function check(str){ var stack=0; str.split('').forEach(function(str){ if(str=='(')stack++; if(str==')')stack--; }); if(stack==0){ return 'error'; }else{ return 'ok'; } } check((foo(bar(baz))));//'ok' check(foo));//'ng' 普通に(と)の文字数…

Webページのアンカーを一覧表示する

var menu=document.createElement('ul'); Array.forEach(document.anchors, function(anchor){ var li=document.createElement('li'); var a=document.createElement('a'); a.href='#'+anchor.name; a.appendChild(document.createTextNode(anchor.name)); l…

autocomplpop.vimでJavaScriptのomni補完をできるようにする

Firebugでインデントつきのソースを書くのは厳しいことに気づいた。 ある程度長いプログラムを書くときはエディタでやろうと思い、エディタってどんなものがあるのかなーと調べたら、vimというのがかっこよかったので、インストールした。 さらに調べ、autoc…

.matchよりも.searchのほうが速い

var start=new Date().getTime(); for(var i=0;i<10000;i++){ 'foo'.search(/foo/) } var end=new Date().getTime(); end-start の平均結果:28 var start=new Date().getTime(); for(var i=0;i<10000;i++){ 'foo'.match(/foo/) } var end=new Date().getTim…

setTimeout難しい

setTimeout( function(){ alert('hoge1'); setTimeout( function(){ alert('hoge2'); setTimeout( function(){ alert('hoge3'); },0); },0); },0); alert('hoge0'); setTimeout( function(){ alert('hoge4'); },0); なんとなくhoge0,hoge1,hoge2,hoge3の順に…

エレメントにclass名を追加したり、削除したりする

HTMLElement.prototype.addClassName=function(className){ var list=this.className.split(' '); if(list.indexOf(className)==-1){ list.push(className); this.className=list.join(' '); } } HTMLElement.prototype.removeClassName=function(className)…

1秒ごとに一ずつ増えた値を出力する方法と、変数の束縛について

iが0〜10の間、一秒後ごとにiをconsoleに出力する、っていうのをしたい場合。 普通に、 var i=0; var tid=setInterval( function(){ console.log(i++) i>=10 && clearInterval(tid); } ,1000) ってすると、初めに出力されるのが実行したときから1秒後になっ…