2012-03-19 3 views
1

Я создаю плагин jQuery, который должен сделать кучу вещей при первом вызове (и только в первый раз). В первый раз, когда мне нужно построить индекс из части dom, я бы только хотел сделать это один раз и использовать этот индекс в остальное время.Как создать плагин jQuery с инициализацией в первый раз?

В идеале я хочу работать так:

  1. Первый раз это называется, установить запустить функцию Init() и настроить все много вар, который мне нужно в целом плагин (так что я могу 't определить их внутри init(), поскольку они будут недоступны в остальной части плагина).
  2. Все остальные времена, которые он называется, должны использовать уже определенные в первый раз варвары.

Сначала я попытался это:

$.fn.search = function() { 

    if(!inited) { 
    /* 
     Define everything that should only be defined the first time 
    */ 
    } 

    /* 
     All methods for my plugin, including an init() method 
    */ 

    if(!inited) { 
     init(); 
     var inited = true; 
    } 

}; 

Но я обнаружил, что каждый раз, когда плагин называется все вары ушли, так что не будет работать. Я знаю, что я могу хранить вещи, как так:

$.fn.search.config = { 
    inited = false, 
    output, 
    search, 
    singleElems, 
    templates, 
    included, 
    scoreBoard, 
    container, 
    singles 
} 

и определить их в Init(), но в том, что лучший способ для хранения вещей для вашего плагина?

ответ

4

Использование data, что, как большинство плагинов сделать, чтобы сохранить состояние и избежать дублирования инициализации:

$.fn.search = function() { 
    return this.each(function() { // For each selected element 
     var data = $(this).data("search"); 
     if (!data) { 
      var state = {}; 
      // Your plugin logic 
      $(this).data("search",state); 
     } 
    }); 
}; 
+0

это, спасибо! Обратите внимание, что 'this' внутри вашего закрытия уже является объектом jQuery, поэтому вы можете просто использовать' this' вместо '$ (this)' (правильно?) – askmike

+0

Да, но помните, что это набор объектов с нулем, один или несколько элементов. Чтобы быть в безопасности, используйте 'return this.each (function() {...});' и поместите свой код внутри этой функции (в этом случае 'this' не будет объектом jQuery, а элементом, поэтому вам может потребоваться использовать '$ (this)') – mgibsonbr

2

Вы можете использовать .data('myPluginData',{a:b,c:d}) (docs), чтобы сохранить все необходимые вам настройки в одном объекте с пространством имен, который прикреплен к элементу, к которому применяется плагин. См.: http://docs.jquery.com/Plugins/Authoring#Data для части данных и http://docs.jquery.com/Plugins/Authoring#Plugin_Methods для логики вызова метода.

Таким образом, вы можете легко отслеживать используемую настройку и использовать такие вещи, как if ($(this).data('myPluginData')), чтобы узнать, был ли подключен плагин уже к любому заданному объекту, и просто используйте sth, например $(this).data('myPluginData').settingA, для доступа к сохраненной настройке.

 Смежные вопросы

  • Нет связанных вопросов^_^