0

だから、私は最初のプラグインを書いています。jQuery Web サイトのアドバイスを使用しているので、プラグインのセットアップは次のようになります。

(function( $ ){

  var methods = {
    init : function( options ) {
      var $this = $(this);
      // do some code.

      // Add an element
      $this.append('<select id="test"><option value="yes">Yes</option>' +
                   '<option value="no">No</option></select>');

      // Bind the change handler (chose '.on' after reading the documentation for '.delegate')
      $this.on('change', '#test', methods['handler'].call($this, $('#test').val()));

    },
    handler : function( content ) { 
      alert ('You chose: ' + content);
    }
  };

  $.fn.testbed = function( method ) {

    // Method calling logic
    if ( methods[method] ) {
      return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || ! method ) {
      return methods.init.apply( this, arguments );
    } else {
      $.error( 'Method ' +  method + ' does not exist' );
    }    

  };

})( jQuery );

代替できるので、ハンドラー自体が機能していることを知っています

function(){ alert ("You did it!");} 

関数呼び出しのために、それは動作します。

しかし、私が今関数を呼び出している方法は機能しません。他のメソッド内から他の関数​​を呼び出す方法ですが、ハンドラーでは機能しません。

だから、私の質問は次のとおりです。(1)関数を呼び出すにはどうすればよいですか?(2) これはハンドラーをセットアップするのに最適な場所ですか?

4

1 に答える 1

0

IDはページ内で一意である必要があります。同じIDを持つ複数の要素があると、アクセスしようとしたときに考えるものとは異なる要素が得られます。IDはまったく使用しないでくださいthis。コールバックで使用して、適切な要素を取得してください。

イベントごとにデリゲートを作成するときに、デリゲートを作成する理由はありません。select要素のイベントを直接バインドします。

イベントのハンドラーは、関数呼び出しの結果ではなく、関数である必要があります。

init : function( options ) {

  // Add an element
  this.append('<select><option value="yes">Yes</option>' +
               '<option value="no">No</option></select>');

  // Bind the change handler
  $('select', this).on('change', function() {
    methods['handler']($(this).val());
  });

},
于 2012-08-21T22:53:35.283 に答える