― MozillaZine.jp フォーラムは Mozilla 製品に関する情報交換の場です ―



All times are UTC + 9 hours

新しいトピックを投稿する トピックへ返信する  [ 4 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2008年9月10日(水) 18:01 
本の109ページのサンプルコードの8行目でエラーが発生しました。
http://firefox3hacks.org/source/ch3/20-109.txt
コード:
    init : function() {
        var target = this.target;
        this.types.forEach(function(aType) {
            target.events.addListener(aType, target); // ←ココ
        });
    },


エラーの内容。
引用:
//エラー: uncaught exception: [Exception... "Could not convert JavaScript argument arg 1 [extIEvents.removeListener]" nsresult: "0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)" location: "JS frame :: chrome://helloworld/content/helloworld.js :: anonymous :: line 14" data: no]


forEachの前に var tmp=this として、addLister(aType, tmp) とすることで
期待した動作になっているように見えますが、あっているでしょうか?
よろしくお願いいたします。

# まだFirefoxとJavaScriptをはじめたばかりなので、
# 実行方法などの問題でしたら申し訳ありません


通報する
ページトップ
  
引用付きで返信する  
投稿記事Posted: 2008年9月14日(日) 00:06 
オフライン
Moderator

登録日時: 2006年10月29日(日) 21:56
記事: 472
naoshi さんが書きました:
forEachの前に var tmp=this として、addLister(aType, tmp) とすることで
期待した動作になっているように見えますが、あっているでしょうか?

それであっていると思います。自分なら
コード:
for (var i in this.types) {
  target.events.addListener(this.types[i], this);
}
とするかな。


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2008年9月17日(水) 13:59 
functionの中にthisを渡すよりすっきりですね。
ありがとうございました。


通報する
ページトップ
  
引用付きで返信する  
投稿記事Posted: 2008年9月22日(月) 10:32 
オフライン
Moderator

登録日時: 2007年5月03日(木) 01:11
記事: 92
お住まい: 東京
あわわわ。すみません。リファクタリングの時かなんかにやらかしてしまったようです。以下を「正式版」とさせてください。(増刷分からはこちらに差し替えてもらいます)

コード:
function FUELEventListener(aTypes, aTarget, aHandler) {
    this.types = aTypes.split(/,\s*|\s+/);
    this.target = aTarget;
    this.handleEvent = aHandler;
}
FUELEventListener.prototype = {
    init : function() {
        this.types.forEach(function(aType) {
            this.target.events.addListener(aType, this);
        }, this);
    },
    destroy : function() {
        this.types.forEach(function(aType) {
            this.target.events.removeListener(aType, this);
        }, this);
        this.types = this.target = this.handleEvent = null;
    }
};
var pref = Application.prefs.get('browser.sessionstore.resume_session_once');
var listener = new FUELEventListener('change', pref,
      function(aEventItem) {
        alert('pref is changed!');
        this.destroy();
      }
    );
listener.init();


通報する
ページトップ
 プロフィール  
引用付きで返信する  
期間内表示:  ソート  
新しいトピックを投稿する トピックへ返信する  [ 4 件の記事 ] 

All times are UTC + 9 hours


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[4人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by MozillaZine.jp® Forum Software © phpBB Group , Almsamim WYSIWYG
Japanese translation principally by ocean