1

複数の個別のインスタンスをサポートするようにプラグインを作成したと信じているにもかかわらず、jQuery プラグインの他のインスタンスが変更されるという奇妙な問題が発生しています。

私はコードを必要最低限​​のものまで取り除いたので、ここでテストできます: http://jsbin.com/ajifoh/4/edit#html,live

いずれかのテキストボックスでキーを初めて押すとleng: 0、コンソールに表示されるはずですが、何らかの理由で最初のテキストボックスをトリガーした後、2番目のテキストボックスにも最初に挿入されたすべてのコンボパーツが含まれています...違う?

;(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);
4

1 に答える 1

1

に追加されたプロパティは、prototypeタイプごとに 1 回だけ存在します。でインスタンス化ComboDataするためKeyCombinator.prototype、 のすべてのインスタンスがKeyCombinatorの 1 つのインスタンスを共有しますComboDataComboDataのインスタンスごとに の一意のインスタンスが必要な場合は、コンストラクターで次のようKeyCombinatorにインスタンス化する必要があります。KeyCombinator

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

これはjsbinの実例です。

于 2012-04-29T02:06:31.903 に答える