2011-08-06 7 views
0

私は、削除方法を追加する方法について私の頭を包み込むことができないようではないことを除いて、ほとんどうまくいっているJavaScriptスクリプト/ライブラリを持っています。スクリプトに「削除」メソッドを実装するにはどうすればよいですか?

//Adds a "widget" to the memory 
Core.extend('widget',function(m){ 
    $(window).click(function(){ alert(m); }); 
}); 

//Actually loads widget, and will alert "hello world" each click on the body 
Core.load('widget', 'hello world'); 

//*SHOULD* make it so that when I click on the window the alert no longer shows 
Core.remove('widget'); 

ここで私は

var Core = function(){ 
    var debug = function(m){ 
    console.log(m); 
    } 

    var errors = false; 

    var extensions = {}; 

    var listeners = {}; 

    var extend = function(name,func){ 
    name = name || ''; 
    func = func || function(){}; 
    if(typeof extensions[name] == 'undefined'){ 
     extensions[name] = func; 
    } 
    else{ 
     if(errors){ 
     throw new Error('Core extend() error: the extension "'+name+'" already exists'); 
     } 
    } 
    } 

    var load = function(name,params){ 
    name = name || ''; 
    params = params || ''; 
    if(typeof extensions[name] !== 'undefined'){ 
     extensions[name](params); 
    } 
    else{ 
     if(errors){ 
     throw new Error('Core load() error: the extension "'+name+'" doesn\'t exist'); 
     } 
    } 
    } 

    //Sends out a notification to every listener set with this name 
    var push = function(name, value){ 
    name = name || ''; 
    value = value || ''; 
    if(typeof listeners[name] !== 'undefined'){ 
     listeners[name].call(this,value); 
    } 
    else{ 
     if(errors){ 
     throw new Error('Core push() error: the extension "'+name+'" doesn\'t exist'); 
     } 
    } 
    } 

    //Saves a function to the listeners object to be called by push() 
    var listen = function(name, callback){ 
    name = name || ''; 
    callback = callback || function(){}; 
    listeners[name] = callback; 
    } 

    //Removes an extension from being called 
    var remove = function(name){ 
    name = name || ''; 
    if(typeof extensions[name] !== 'undefined'){ 
     delete extensions[name]; 
    } 
    else{ 
     if(errors){ 
     throw new Error('Core remove() error: the extension "'+name+'" doesn\'t exist'); 
     } 
    } 
    } 

    return { 
    extend:extend, 
    load:load, 
    remove:remove, 
    push:push, 
    listen:listen 
    } 
}(); 
を書いているコードです:たとえば、あなたは(jQueryのが追加されただけできれいだし、簡単に例を理解することが、私のスクリプトはjQueryのを必要としない)のようなものは何だろう

例のユースケース:
http://jsbin.com/enopup

答えて

0

あなたの問題は、コアから除去機能が、onClickのコールのバインドを解除されていないということです。 これはブラウザでキャッシュされていると思われます。削除呼び出しの後に$(ウィンドウ).unbind( 'クリック')を追加すると、これをすぐに確認できます。

JSは私を超えていますが、私が推薦するのはおそらく、取られる可能性のあるアクションをバインド解除するためのデストラクタメソッドです。

+0

ええ、私はアンバインドとremoveEventListenerについて知っていますが、単純な.remove()を使って即座にメソッドを分解するためのメソッドや "デザインパターン"があれば不思議でした。 –

0

例では、ウィジェットは実際にclickイベントのイベントハンドラをアタッチします。

ライブラリオブジェクトからウィジェットを削除するだけでは不十分です。イベントリスナーを添付してから削除する必要があります。

Unbind

はjQueryのを使用すると、特定の要素に取り付けたすべてのイベントハンドラを削除するために.unbind()メソッドを使用することができます。

この方法でもう一度クリックすると、何もしません。

+0

ええ、私はアンバインドとremoveEventListenerについて知っていますが、単純な.remove()を使って即座にメソッドを分解するためのメソッドや "デザインパターン"があれば不思議でした。 –

関連する問題