Friday, July 24, 2009

a bookmarklet which loaded external script and open in another window

I updated the bookmarklet for FeedKraft. Changes are:
* Now it work even alternate links have relative path (URI).
* Open feedkraft in another window.

To keep maintainability, I decided to split complex part of the scripts into a external js file. However, Safari 4 seems to just ignore in a external loaded script, and Firefox 3.5 asks users whether popup a window or not.

To get those features work for Safari and Firefox, I struggled with javascript, but I got it.

FeedKraftbookmarklet を更新して
* alternate link の href が相対パス(URL) でも登録できるように
* 別 window で開くように

"/feed/atom.xml" のようなパスをURLに変換するコードはそれなりに長くなるので bookmarklet の javascript: 以下に続けて書くメンテしずらいので、外部 js ファイルをロードするようにしました。
しかし、外部 js ファイルからでは 別 window で開くための を実行しても Safari 4 では何も起きないし、 Firefox 3.5 では ポップアップブロックの確認が生じてしまいます。


void(w =;
void(e = document.createElement('script'));
void(e.src = '');
void(e.addEventListener('load', function(){ w.location = FeedKraft.bookmarkURL()}, false));

Why does first is to avoid calling it in load event handler which behave like external file (I mean can't open a window). Annoying void() is for Firefox. Without enclosing a sentence with void(), the script will return with result of the sentence.

I'm not a Javascript ninja. I never think that this is the best solution. Please give me advice if you have idea.

load イベントで直接 すると外部 js ファイルで実行したときと同じ挙動になってしまうため、あらかじめ window を開いてから location を変更してます。
理屈わかってませんが、 void() で囲っていない文があると Firefox ではそこでストップして、その文の結果が表示されてしまいます。

Javascript は苦手なのでもっと良い方法があったら教えて下さい。

No comments: