2012-04-29 2 views
1

여러 개별 인스턴스를 지원하기 위해 플러그인을 작성했다고해도이 jQuery 플러그인의 다른 인스턴스가 수정되는 이상한 문제가 있습니다.다른 jQuery 플러그인 인스턴스의 속성이 덮어 쓰기 중임

나는 베어 필수로 코드를 제거했습니다, 당신은 여기를 테스트 할 수 http://jsbin.com/ajifoh/4/edit#html,live

당신이 콘솔에 leng: 0를 표시해야합니다 텍스트 상자 중 하나에서 키를 누르면,하지만 이후 처음 웬일인지 어떤 이유에서든 첫 번째 트리거를 시작했습니다. 두 번째 것도 첫 번째 삽입 된 모든 콤보 파트를 가지고 있습니다 ... 무엇을 잘못 했습니까?

;(function($, window, document, undefined){ 

    var KeyCombinator = function(elem, options){ 
     this.$elem = $(elem); 
    }; 

    function ComboPart(keyCode){ 
    if (keyCode !== undefined){ 
     this.keyCode = keyCode; 
    } 
    } 
    function ComboData(){ 
    this.comboParts= []; 
    } 

    function set_insert(array, value){ 
    array.push(value); 
    } 

    KeyCombinator.prototype = { 
    comboData: new ComboData(), 

    eval_key_event: function(e){ 
     set_insert(this.comboData.comboParts, new ComboPart(e.keyCode)); 
    }, 

    init: function(){ 
     var $elem = this.$elem; 
     var that = this; 

     $elem.keydown(function(e){ 
     console.log('leng', that.comboData.comboParts.length); 
     that.eval_key_event(e); 
     }); 
    } 
    }; 

    $.fn.makeKeyCombinator = function(options) { 
    return this.each(function() { 
     new KeyCombinator(this, options).init(); 
    }); 
    }; 

})(jQuery, window, document); 

답변

1

prototype에 추가 된 속성은 유형마다 한 번만 존재합니다. KeyCombinator.prototype에서 ComboData을 인스턴스화하므로 KeyCombinator의 모든 인스턴스는 ComboData이라는 단일 인스턴스를 공유합니다. 당신이 KeyCombinator의 각 인스턴스에 대해 ComboData의 고유 한 인스턴스를 원하는 경우에, 당신은 같은 당신의 KeyCombinator 생성자에서 인스턴스화해야합니다

여기
var KeyCombinator = function(elem, options){ 
    this.$elem = $(elem); 
    this.comboData = new ComboData(); 
}; 

jsbin에서 작동하는 예이다.

관련 문제