Home > 2008年07月

2008年07月

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  • Comments (Close): -
  • TrackBack (Close): -

setTimeoutのメモ

setTimeoutが実行されるタイミング

windows.setTimeoutは指定された時間(ミリ秒)の後に関数やコードを実行する。

setTimeout(関数, 時間)

setTimeoutの後の行は、setTimeoutの関数を待たず、実行されていく。

opera.postError('before');
setTimeout(function (){opera.postError('setTimeout');}, 100);
opera.postError('after');


エラーコンソール
before
after
setTimeout

setTimeoutの関数は後の行が実行された後指定した時間が来たら実行されるので、時間が来ても後の行の実行が終わっていなければ待つことになる。

opera.postError('before');
setTimeout(function (){opera.postError('setTimeout');}, 100);
for (var i = 0; i < 50000; i ++){
    opera.postError(i);
}


エラーコンソール
before
1
2
------
------
49998
49999
setTimeout

setTimeout内の this

setTimeoutに呼び出される関数内の thisはグローバルオブジェクト(window)になる。

var name = 'global';    // window.name = 'global'
var obj = {name : 'property'};
obj.a = function (){
    alert(this.name);
}
obj.b = function (){
    setTimeout(function (){alert(this.name);}, 100);
}

obj.a();    // 'property'
obj.b();    // 'global'

setTimeoutの関数内でメソッドを呼び出したオブジェクト(this)を参照したい時は、前以て関数のローカル変数に代入しておく。

var name = 'global';
var obj = {name : 'property'};
obj.b = function (){
    var self = this;
    setTimeout(function (){alert(self.name);}, 100);
}

obj.b();    // 'property'

参考

DOM:window.setTimeout - MDC

livedoor クリップのクリップするページにはてなブックマークのタグを表示する User JavaScript

User JavaScriptで livedoor クリップのクリップするページにはてなブックマークのタグを表示

livedoor クリップでクリップを追加する時に付けるタグを何にするか迷うことがある。そういう時ははてなブックマークのエントリーページを見に行っていた。が、いちいち行くのが面倒になってきたので、livedoor クリップのクリップするページにはてなブックマークに付けられたタグを表示する User JavaScriptを書いてみた。

  • タグは 15まで多い順に表示する。2桁は赤、3以上は青、2以下は灰色。
  • タグ一覧のタグと同じようにはてなブックマークのタグもクリックすると、タグのテキストボックスに入力する。
  • はてなブックマークのユーザ数もついでに表示。
  • はてなブックマークにブックマークされていない時、ブックマークされていても何もタブが付けられていない時は何も表示しない。

(はてなブックマークエントリー情報取得APIを利用しているので、JSON データはキャッシュを利用しているため、実際のエントリーの内容と異なる場合があります。)

ダウンロード

ldc_show_hbtags.js

参考にしたページ

ブログの全ての記事のタイトル一覧を表示

  • 2008-07-21 (Mon)
  • blog

FC2ブログには、全ての記事のタイトル一覧のページがある。記事のタイトルが新しい順に2000件まで表示される。

FC2ブログの全記事のタイトル一覧を表示する URIは、ブログの URIに「archives.html」か「?all」を付ければいい。

私のブログの URIが「http://karafuto50.blog117.fc2.com/」だから、全記事のタイトル一覧の URIは「http://karafuto50.blog117.fc2.com/archives.html」か「http://karafuto50.blog117.fc2.com/?all」になる。

そのままだとFC2が用意したテンプレートで表示されますということなので、ブログのテンプレートで表示されるようにテンプレートの HTMLと CSSを編集した。

ブログのテンプレートは公式テンプレート sharpgreenを使用しています。

テンプレートの HTMLの編集

<!-- ▼全記事タイトルの一覧ここから --> 
<!--titlelist_area-->
<div class="titlelist_area"> 
<h3>全ての記事のタイトル一覧</h3>
<!--titlelist-->
<h4><a href="<%titlelist_url>"><%titlelist_title></a>&nbsp;(<%titlelist_year>/<%titlelist_month>/<%titlelist_day>&nbsp;|&nbsp;<%titlelist_category>)</h4>
<p><%titlelist_body>...</p>
<!--/titlelist-->
</div>
<!--/titlelist_area--> 
<!-- /全記事タイトルの一覧ここまで△ -->

上記の HTMLを<!--topentry-->の上に挿入した。

テンプレートの CSSの編集

div.titlelist_area p {
    font-size: 100%;
    margin: 0.5em 2em;
    line-height: 1.6;
}
div.titlelist_area h3 {
    margin: 0 0 1.5em 0;
}
div.titlelist_area h4 {
    color: #999;
    font-size: 90%;
    font-weight: normal;
    margin-top: 2em;
}
div.titlelist_area h4 > a {
    font-size: 120%;
}

全記事タイトル表示プラグインの追加

公式プラグインの全記事表示リンクを追加して、サイドバーの月別アーカイブの下に表示した。

参考にしたページ

foobar2000でのレートの設定 (2)

Karafuto Blog: foobar2000 v0.9.5.3にバージョンアップで書いたように、foobar2000 v0.9.5.3では foo_custominfo(外部データベースに情報を保存するコンポーネント)を使えないので、Karafuto Blog: foobar2000でのレートの設定で書いた方法ではレートを記録できなくなった。

仕方がないので、ファイルのタグにレートを記録することにした。コンテキストメニューのプロパティからフィールド(タグ情報)の編集をしてもいいが手数がかかるので、Masstaggerを使い、ショットカットキーを設定する。この方法で問題はないが、タグに書きこむため、レートを設定する時にプログレスバーが一瞬現れる。

Masstaggerの Actionの作成

Masstagger(Manage Scripts)を使い、レートを設定する Actionを作り、保存する。そうすることで、コンテキストメニューの Taggingの Scriptsから作成した Actionを実行することができるようになる。

Masstagger

  1. コンテキストメニュー > Tagging > Manage Scriptsを選び、'Masstagger'のウィンドウを開く。
  2. 'Actions to perform'のテキストエリアに何かが書いてあれば、Clearで消す。Addを押し、Actionを追加する。
  3. 'Select action type'メニューから「Set value...」を選択、OKを押す。
  4. 'Set value'ダイアログの Field nameに「RATING」、Field valueに「1」と入力して、OKを押すと、Actionが作成される。
  5. 戻った'Masstagger'の Scriptsのテキストボックスに「RATING 1」と名前を書き、Saveを押して、保存する。

後は、欲しいレートの数だけ作成、保存する。レートの数と名前だけを変えればいいので、

  1. 'Masstagger'で作成したレートの Actionを表示したまま(消した場合は、Scriptsのテキストボックスから作成した Actionを選び、Loadを押すと表示される)、'Actions to perform'のテキストエリアの Actionをダブルクリックする。
  2. 'Set value'ダイアログの Field valueに「1(前の数)」を「2(変更したい数)」に書き換え、OKを押す。
  3. 'Masstagger'の Scriptsのテキストボックスに「RATING 2」と名前を書き換え、Saveを押して、保存する。

レートなしは「RATING 0」でも良いのだが、私は RATINGタグを削除するようにしている。

  1. 'Masstagger'のウィンドウを開く(コンテキストメニュー > Tagging > Manage Scripts)。
  2. 'Actions to perform'のテキストエリアに何かが書いてあれば、Clearで消す。Addを押し、Actionを追加する。
  3. 'Select action type'メニューから「Remove field...」を選択、OKを押す。
  4. 'Select field to remove'メニューから「RATING」を選び、OKを押すと、Actionが作成される。
  5. 'Masstagger'の Scriptsのテキストボックスに「Remove RATING」と名前を書き、Saveを押して、保存する。

ショートカットキーの設定

ここまでの設定でコンテキストメニュー > Tagging > Scriptsから Actionを選ぶことでレートを記録することができるが、ショートカットキーならさらに楽になるので、ショートカットキーを設定する。

Preference > General > Keyboard Shortcuts

Ctrl+1
Scripts : RATING 1
Ctrl+2
Scripts : RATING 2
Ctrl+3
Scripts : RATING 3
Ctrl+4
Scripts : RATING 4
Ctrl+5
Scripts : RATING 5
Ctrl+0
Scripts : Remove RATING

User JavaScriptの AfterEventListener.loadにはまる

Opera 9.5になって動かなくなっていた User JavaScriptをいくつか直した。

具体的には、livedoor Readerの User JavaScriptで、window.onloadのイベントハンドラ、init関数の後に動くように作ったスクリプトが、init関数よりも先に動いて、エラーを吐いていた。Opera 9.27までなら 'AfterEventListener.load'で window.onloadを感知して、関数の後に動いていたのが、Opera 9.5では window.onloadの前に動いていた。そのことと、下記の更新履歴から Opera 9.5は window.onloadを捕捉できないのかと勘違いして、スクリプトを修正するのにてこずった。

イベントの捕捉がよりクロスブラウザ互換になりました。window へアタッチされた load イベントは捕捉されず、対象において捕捉したイベントは破棄されます。文書中で load イベントを捕捉する必要がある場合、document オブジェクトへイベントリスナをアタッチしてください

Opera 9.5 ベータ 1 for Windows 更新履歴

本当のエラーの原因は下の Browser JavaScript(browser.js - Opera Desktop 9.51, July 6, 2008)のコードに関係していた。このコードがすべてのサイトで loadイベントの後呼び出されていた。そのため、このイベントリスナが window.onloadより先に実行されてしまうため、User JavaScriptがこれを目的のイベントと間違えて検出し、予定より早く動いていたのだ。(Web Forms 2.0は拡張されたフォームの仕様のようなんだけど、これを使用しているサイトはそんなにあるの?)

// The required attribute does not take the value false according to WebForms2 - remove "required=false" from form elements
document.addEventListener('load', function(){
    try{var obj = document.evaluate( '//input[translate(@required, "FALSE", "false")="false"]', document.documentElement, null, 4, null ), el ;
    while(el=obj.iterateNext()){el.removeAttribute('required');}}catch(e){}
}, false);

今回、User JavaScriptで修正したところは、'AfterEventListener.load'で イベントリスナを検出する時、そのイベントリスナが目的の関数( init関数)なのか確かめてからスクリプトを実行するようにした。以下のようになる。(イベントリスナの後にスクリプトを実行するのだから、当然どんなイベントリスナが実行されたかを調べておくべきだった。)

window.opera.addEventListener('AfterEventListener.load', function (e){
    // init()関数か調べる
    if (e.listener.toString().indexOf('function init()') == -1) return;

    // 処理

}, false);

Browser JavaScriptのことを最後にちょこっと書いておくと、Browser JavaScriptを無効にしてあれば上のようなエラーは出ない。しかし、Browser JavaScriptは、古い形式のスクリプトや Opera を意図せずにブロックしてしまい Opera で利用できない Web ページを自動的に修正する機能です。そういうことなので有効にしておいた方が良いかと。Browser JavaScriptの設定を確認するには、ブラウザ JavaScriptのページを開くと、上の方の「更新情報の取得」のリストの最後に、「現在ブラウザ JavaScript は有効(無効)です」と表示される。Browser JavaScriptを有効にするには、設定ファイルエディタ(opera:config) > User Prefs > Browser JavaScriptに 1を入力して、保存する。

Home > 2008年07月

おまかせリンク(R)
全記事表示リンク
Search
Meta
Feeds

Page Top

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。