Как заставить переменную функции вызываться как плагины jquery? - PullRequest
0 голосов
/ 23 января 2012

Plugin:

(function( $ ){

  $.fn.myplugin = function( options ) {  

    var mymethod = function(){
      // I want to be able to access "this" here ('.element')

      return this; 
    };

    return this.each(function() {        
      // $('.element', this).mymethod(); <- how to do this?
    });

  };
})( jQuery );

Я хочу назвать mymethod так:

$('.element').mymethod();

Возможно ли это?

По сути, он должен сохранять последовательность, чтобы я мог дальше вызывать другие функции ...

Ответы [ 5 ]

2 голосов
/ 23 января 2012

Если вы еще этого не сделали, я настоятельно рекомендую проверить страницу создания плагина jQuery.http://docs.jquery.com/Plugins/Authoring

Лучший способ вызвать конкретный метод - это пойти

$( '#foo' ).myPlugin( 'myMethod' );

То, как вы могли бы достичь чего-то подобного, было бы следующим (Сайт разработки плагинов jQuery)

( function ( $ ) {

    var methods = {
        init : function( options ) {

            // Init function here

        },
        destroy : function( ) {

            // Teardown function here

        }
    };

    $.fn.myPlugin= function( method ) {

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 on jQuery.myPlugin' );
}    


};

})( jQuery );
2 голосов
/ 23 января 2012

Закрыть, вы просто теряете ключевое слово this всякий раз, когда появляется новое ключевое слово function. Попробуйте сначала сохранить:

(function( $ ){

  $.fn.myplugin = function( options ) {  

    var that = this;

    var mymethod = function(_this, dotElem){
      // I want to be able to access "this" here ('.element')
        that.hide().blah()...

      return this; // this isn't needed as we are going to anyway return `this.each()`
    };

    return this.each(function() {        
        mymethod(this, $('.element' )); <- how to do this?
    });

  };
})( jQuery );
2 голосов
/ 23 января 2012

Если вы хотите назвать его как плагин jQuery, вы не сможете добавить его к прототипу jQuery ($ .fn). Но если вы просто хотите, чтобы этот ссылался на элемент jQuery вашего селектора, вы можете просто использовать apply :

(function( $ ){

  $.fn.myplugin = function( options ) {  

    var mymethod = function(){
      // I want to be able to access "this" here ('.element')

      return this; 
    };

    return this.each(function() {        
      mymethod.apply($('.element', this));
    });

  };
})( jQuery );
1 голос
/ 23 января 2012

Что ж, тогда вы просто сделаете:

$.fn.mymethod = function () { ...   return this; }

jQuery автоматически передаст элемент, который вызывается как this.

Но добавлять таким образом множество функций считается плохой практикой.Вот почему большинство плагинов просто добавляют одну функцию к $.fn и принимают строковый аргумент, для которого вызывается метод.

1 голос
/ 23 января 2012

Измените MyMethod, так что это прямое расширение

$.fn.mymethod = function() {
   this.hide(); // the .element
   return this; // continue the daisy chain
}

// example usage
$(document).ready(function() {
   $("div").mymethod();
});

Обновлен х2 (опечатка)!

http://jsfiddle.net/MattLo/2TWMV/1/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...