8
votes

Fonctions d'espacement de noms de plug-in jquery

Je crée un plugin JQuery qui est assez important dans la portée. En fait, le plugin est techniquement composé de quelques plugins qui travaillent tous ensemble.

$('#example').foo()
$('#other_example').foo.bar()


0 commentaires

4 Réponses :


1
votes

Eh bien, je suis sûr qu'il y a de nombreuses façons de cuire ce chat. La bibliothèque de l'interface utilisateur JQuery utilise un motif comme celui-ci:

// initialize a dialog window from an element:
$('#selector').dialog({});

// call the show method of a dialog:
$('#selector').dialog('show');


1 commentaires

Personnellement, je crois que cette façon d'être un hack "sale" en raison du fait qu'ils ne pouvaient pas utiliser $ ("# sélecteur"). Dialogue (). Afficher (), mais c'est une solution alternative de le faire.



11
votes

dès que vous utilisez $. fn.foo.bar () code> - this code> pointe sur $. fn.foo code>, lequel est ce que vous attendez en JavaScript ( ceci code> étant l'objet que la fonction est appelée.)

J'ai remarqué dans des plugins de JQuery UI (comme SHITABLES) où vous appelez des fonctions comme: p> xxx pré>

Si vous faites quelque chose comme ça - vous pouvez prolonger JQuery lui-même: P>

$.foo_plugin = {
  bar: function() {},
  baz: function() {}
}

$.fn.foo = function(opts) {
  if (opts == 'bar') return $.foo_plugin.bar.call(this);
  if (opts == 'baz') return $.foo_plugin.baz.call(this);
}


1 commentaires

Je n'avais jamais regardé la bibliothèque d'Ui JQuery avant. Mais c'est une solution très intéressante et applicable. Merci.



2
votes

0
votes

Je suis fan du motif que j'ai vu sur Eric Martin's SimpleModal . Cela fonctionne bien pour quand je ne joue pas sur des éléments DOM - dans ce cas, une enveloppe utilise localtstorage.

De cette façon, je peux facilement faire référence au constructeur: p>

;(function($){

/* Variables I'll need throghout */

var ls;
var supported = true;
if (typeof localStorage == 'undefined' || typeof JSON == 'undefined') {
    supported = false;
} else {
    ls = localStorage;
}

/* Make the methods public */

$.totalStorage = function(key, value, options){
    return $.totalStorage.impl.init(key, value);
}

$.totalStorage.setItem = function(key, value){
    return $.totalStorage.impl.setItem(key, value);
}

$.totalStorage.getItem = function(key){
    return $.totalStorage.impl.getItem(key);
}

/* Object to hold all methods: public and private */

$.totalStorage.impl = {

    init: function(key, value){
        if (typeof value != 'undefined') {
            return this.setItem(name, value);   
        } else {
            return this.getItem(name);
        }
    },

    setItem: function(key, value){
        if (!supported){
            $.cookie(key, value);
            return true;
        }
        ls.setItem(key, JSON.stringify(value));
        return true;
    },

    getItem: function(key){
        if (!supported){
            return this.parseResult($.cookie(key));
        }
        return this.parseResult(ls.getItem(key));
    },  

    parseResult: function(res){
        var ret;
        try {
            ret = JSON.parse(res);
            if (ret == 'true'){
                ret = true;
            }
            if (ret == 'false'){
                ret = false;
            }
            if (parseFloat(ret) == ret){
                ret = parseFloat(ret);
            }
        } catch(e){}
        return ret;
    }
}})(jQuery);


0 commentaires