Как сделать плагин JQuery (правильный путь)? - PullRequest
2 голосов
/ 10 июня 2010

Я знаю, что есть плагины jQuery cookie, но я хотел написать один для лучшего изучения шаблона плагинов jQuery.

Мне нравится разделять "работу" на небольшие управляемые функции,но я чувствую, что слишком много передаю аргументы name, value и options.Есть ли способ, которым это может быть реорганизовано?

Я ищу фрагменты кода, чтобы помочь проиллюстрировать примеры, представленные в ответах.

Любая помощь приветствуется.Спасибо:)

пример использования

$.cookie('foo', 'bar', {expires:7});
$.cookie('foo'); //=> bar
$.cookie('foo', null);
$.cookie('foo'); //=> undefined

Редактировать:

Я немного поработал над этим.Вы можете просмотреть историю изменений, чтобы увидеть, откуда это произошло.По-прежнему кажется, что можно сделать больше рефакторинга, чтобы немного оптимизировать поток.Есть идеи?

Плагин

(function($){

  // the utility function
  $.cookie = function(name, value, options) {

    // cookies enabled?
    if (!navigator.cookieEnabled){
      return false;
    }

    // get
    if (typeof value == 'undefined') {
      return get(name);
    }

    // set
    else {
      options = $.extend({}, $.cookie.defaults, options || {});
      return (value != null) ? set(name, value, options) : unset(name, options);  
    }
  };

  // default options
  $.cookie.defaults = {
    expires:  null,
    path:     '/',
    domain:   null,
    secure:   false
  };

  // private functions
  var set = function(name, value, options){
    return document.cookie = options_string(name, value, options);
  };

  var get = function(name){
    var cookies = {};
    $.map(document.cookie.split(';'), function(pair){
      var c = $.trim(pair).split('=');
      cookies[c[0]] = c[1];
    });
    return decodeURIComponent(cookies[name]);
  };

  var unset = function(name, options){
    value = '';
    options.expires = -1;
    set(name, value, options);
  };

  var options_string = function(name, value, options){
    var pairs = [param.name(name, value)];
    $.each(options, function(k,v){
      pairs.push(param[k](v));
    });
    return $.map(pairs, function(p){
      return p === null ? null : p;
    }).join(';');
  };

  // prepare each key=value pair
  var param = {
    name: function(name, value){
      return name + "=" + encodeURIComponent(value);
    },
    expires: function(value){
      // no expiry
      if(value === null){
        return null;
      }
      // number of days
      else if(typeof value == "number"){
        d = new Date();
        d.setTime(d.getTime() + (value * 24 * 60 * 60 * 1000));
      }
      // date object
      else if(typeof value == "object" && value instanceof "Date") {
        d = value;
      }
      return "expires=" + d.toUTCString();
    },
    path: function(value){
      return "path="+value;
    },
    domain: function(value){
      return value === null ? null : "domain=" + value;
    },
    secure: function(bool){
      return bool ? "secure" : null;
    }
  };

})(jQuery);

Ответы [ 2 ]

2 голосов
/ 14 июня 2010
0 голосов
/ 11 июня 2010
...