Плагины JQuery: как получить доступ к параметрам?

В настоящее время я пишу плагин jQuery с некоторыми параметрами.

Пример упрощенной части кода с веб-страницы:

<div id="div1"></div>
<div id="div2"></div>

$(document).ready(function(){
    $("#div1").myFunc({width: 100, height: 100});
    $("#div2").myFunc({width: 200, height: 200});
});

И здесь (еще упрощённый) код плагина:

(function($) {
 $.fn.myFunc = function(options) {
  // extending default settings
  var options = $.extend( {
   width: 300,
   height: 200
  }, options);

     return this.each(function() {
      // doing something for example with #div1
         $(this).click(function() {
          // here I need to access ANOTHER (e.g. #div2) object options
          // how can I do it?
         });
     });
 }
})(jQuery);

Ну, вопрос в листинге - как я могу получить доступ к другим объектным опциям изнутри функции плагина? Что-то вроде $( "# div2" ). Options.width

Ответ 1

Вы можете выполнить это, используя метод jQuery .data(ключ, val), чтобы установить эти параметры перед тем, как получить к ним доступ в своем плагине:

  // set 'options' for '#div2'
  $("#div2").data('options', {width: 500, height: 500});

  // get 'options' for '#div2' (this would be in your plugin code)
  var opts = $('#div2').data('options');
  alert('options.height:' + opts.height + '\n'
        'options.width:' + opts.width);

Когда вы храните данные в словаре-подобном объекте, вы можете установить практически любые данные, которые вы хотите:

  $("#div2").data('priority', 2);
  $("#div2").data('flagColors', ['red', 'white', 'blue']);
  $("#div2").data('parts', {arm: 2, legs: 2});

... и получить его позже следующим образом:

  var foo = $("#div2").data('priority');
  var foo2 = $("#div2").data('flagColors');
  var foo3 = $("#div2").data('parts');

За кулисами jQuery добавляет одно свойство expando к элементу DOM вашего выбора jQuery (внутренне сгенерированное значение UUID), значение которого является уникальным ключом в jQuery.cache, который в основном там, где все ваши данные сохраняется/извлекается из.

Чтобы выполнить очистку, вызовите .removeData(key) (если ключ не передан, все данные удаляются).

Ответ 2

(function($) {
 $.fn.myFunc = function(options) {
  var options = $.extend( {
   width: 300,
   height: 200
  }, options);

     return this.each(function() {

         $(this).bind('click', {myOptions: options}, function(event) {
              optionsHere = event.data.myOptions;
         });
     });
 }
})(jQuery);

"В тех случаях, когда это невозможно, вы можете передать дополнительные данные в качестве второго параметра (и функцию обработчика как третьего)..."

jQuery bind

Ответ 3

Простой ответ: вы не можете. options object, переданный в плагин в каждом экземпляре, используется для назначения значений свойствам локально объявленного объекта options, который не будет доступен за пределами области функций плагина.

Вы можете найти несколько способов сделать то, что хотите, например, дополнительные свойства options object, которые вы передаете.

Ответ 4

Почему бы не добавить метод к вашему плагину, который возвращает объект options?

Ответ 5

см. этот ответ, вторая часть решает проблему без реструктуризации вашего плагина. В основном сделать ваши варианты глобальными, и они будут доступны после инициализации в первый раз