2009-06-21

ユーザースクリプトは楽し

javascriptを覚えたので、ここらで一つ、ユーザースクリプトでも書いてみたい。しかし、今現在、自分では、とくに欲しい機能がない。そこで、適当に他人の欲しがっている機能を実現してみることにした。

図書館員がAmazonの検索を好きになれないたった一つの理由 - そうだ、図書館へ行こう!

選んだ理由は、たんにはてなブックマークの人気エントリーに上がっていただけだ。なるほど、発売日などの情報を、すぐに見たいという望みらしい。さっそく書いてみよう。

// ==UserScript==
// @name    Amazon Mod
// @namespace  http://cpplover.blogspot.com/
// @description move Amazon's Product Details to under the product name.
// @include   http://www.amazon.*/*
// ==/UserScript==

(function()
{
var holder = document.querySelector("div.buying h1.parseasinTitle") ;
if ( holder === null )
    return ;

holder = holder.parentNode ;

var list = document.querySelectorAll("tbody td.bucket > div.content > ul > li") ;
if ( list.length === 0 )
 return ; 

var elem = document.createElement("ul") ;

for ( var i = 0 ; i !== list.length ; ++i )
{
  if ( !list.item(i).getAttribute("id") && !list.item(i).getAttribute("class") )
    elem.appendChild( list.item(i) ) ;
}

holder.appendChild(elem) ;
})() ;

上記のコードをユーザースクリプトとして使えば、アマゾンの商品名の下に、登録情報が表示されるようになる。とりあえず、amazon.co.jpとamazon.comでは動いた。

ユーザースクリプトになじみのない場合、このリンクをブックマークして、アマゾンのページで使うこともできる。

Chrome 3、Firefox 3.5、Opera 10、Safari 4で動くことを確認。問題は、querySelectorが、かなり最新のW3C規格だと云うことだ。jQueryなどのライブラリを使えば、最新ではないブラウザで動作させることも可能だろう。

なるほど、ユーザースクリプトは面白い。

しかし、ブラウザがjavascriptの実行に寛大なのは如何ともしがたい。list.item(i).getAttribute("class")の代わりに、list.item(i).classと書いても、Firefox、Opera、Chromeでは、問題なく実行できてしまった。もちろん、classは予約語なので、本来エラーになるべきである。エラーを出してくれたのはSafariのみ。なるほど、Safariは開発用として悪くないブラウザだ。また、最初は、querySelector("div.buying h1.parseasinTitle").parentNodeとしていたのだが、Safariはこれにもエラーを出してくれた。すばらしい。たしかにquerySelectorはnullを返す可能性があり、その場合、parentNodeを呼び出すのはエラーになる。Safariはなかなかやるブラウザだ。これからは、javascriptのコーディングにはSafariを用いようと思う。

No comments:

Post a Comment

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.