Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Как делать доступ к переменным из функций? (https://javascript.ru/forum/jquery/21388-kak-delat-dostup-k-peremennym-iz-funkcijj.html)

gonzo76 07.09.2011 16:52

Как делать доступ к переменным из функций?
 
Всем привет!

Я делаю плагин на jQuery и возник такой вопрос. Вот код:

(function($)
{
  $.fn.my_plugin = function()
  {
    return this.each(function() {
      var container = $(this);
      var link = container.find("a");
      create();
    });

      function create() {
        alert(container);
        alert(link);
      }
  };
}) (jQuery);


Я хочу иметь возможность один раз сохранить ссылки на некоторые внутренние элементы и потом иметь к ним доступ из метода. Как такое можно сделать?

walik 07.09.2011 16:59

(function($)
{
  $.fn.my_plugin = function()
  {
    var container, link;
    return this.each(function() {
      container = $(this);
      link = container.find("a");
      create();
    });
 
      function create() {
        alert(container);
        alert(link);
      }
  };
}) (jQuery);

gonzo76 07.09.2011 17:35

На сколько я понимаю, такой вариант создаёт переменные видимости всего плагина, верно? А хотелось бы чтобы были отдельные для каждого элемента, который попал под селект $(".my-plugin").my_plugin().

Sweet 07.09.2011 17:40

Тогда так:
(function($)
{
  $.fn.my_plugin = function()
  {
    return this.each(function() {
      var container = $(this);
      var link = container.find("a");
      create(container, link);
    });

      function create(container, link) {
        alert(container);
        alert(link);
      }
  };
}) (jQuery);

gonzo76 07.09.2011 17:42

Спасибо.

Это первое что приходит в голову, но неудобно таскать все переменные. А чего-то более приближенному к раздению переменных объекта между методами как в классовых языках в нет?

gonzo76 07.09.2011 17:43

Просто в реальности у меня с десяток этих переменных.

ваый 07.09.2011 18:09

Пересмотри структуру своего плагина. Например:
$.fn.slapAss = function(options) {
    var options = $.extend({
        buttSize: 'medium'
    }, options);

    var Butt = function(el) {
        var $ass = $(el);
        var $pants = $ass.find('.pants');

        this.init   = function() {...};
        this.create = function() { alert($pants) };
        this.putOff = function() { alert($pants) };
    };

    return this.each(function() {
        new Butt($(this)).init();
    });
};

gonzo76 07.09.2011 19:05

Спасибо за наводку. В итоге сделал так
(function($)
{
  $.fn.my_plugin = function()
  {
    return this.each(function() {
      var self = this;
      var ivar = Math.random(1000);

      $(this).click(function() {
        self.clicked("a1")
      });

      this.clicked = function(a) {
        alert(ivar)
      }
    });
  };
}) (jQuery);


Часовой пояс GMT +3, время: 22:53.