2010-11-26 11 views
1

Je codage mon propre plugin jQuery, basé sur http://docs.jquery.com/Plugins/Authoringplugin jQuery personnalisée avec les méthodes et les options

 
(function($) 
{ 
    var methods = 
    { 
     publish : function(options) 
     { 
      var settings = 
      { 
       title : 'Publish' 
      } 
      var obj = $(this); 
      var opt = $.extend(settings, options); 
      return this.each(function() 
      { 
       //some code here 
      }); 
     } 
    }; 

    $.modal = 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'); 
     } 
    }; 

})(jQuery); 

Maintenant, le problème est si je ne l'utilise pas: $ .fn.modal = function (méthode) ... Une erreur se produit: trop de récursion. Je veux utiliser: $ .modal alors je peux l'appeler comme: $ .modal(); Comment puis-je utiliser beaucoup de méthodes avec leurs propres options et sans élément comme $ (élément)?

Merci

Répondre

0

Ce que vous faites est pas faux, le problème est que si vous ajoutez directement à l'objet jQuery et non à la jQuery.fn cette référence pointera vers la fonction exécutée et non l'élément $ (élément) (si vous êtes familier avec la POO, pensez-y comme des méthodes statiques). Donc quand vous utilisez method.apply, vous passez juste la référence de $ .method il change le pointeur de cette référence pour la fonction que vous appelez. Je suppose que ce n'est pas ce que vous voulez faire et que cela mène à la récursivité.

2

résolu en utilisant:

(function($) 
{ 
    var methods = 
    { 
     publish : function(options) 
     { 
      var settings = 
      { 
       title : 'Publish' 
      } 
      var opt = $.extend(settings, options); 
      //some code here 
     } 
    }; 

    jQuery.extend(function(){ 
     modal : 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'); 
      } 
     }; 
    }); 

})(jQuery); 

Maintenant, je peux utiliser: $.modal(method, options);