Не доступна переменная vars в методе destroy 
		
		
		
		Не доступна переменная vars в методе destroy. Добрые люди подскажите что я делаю не так? 
	Вот кусок метода: 
destroy: function() {
    alert(vars);// undefained
}
Этот велосипед мне нужен, потому что мне другие не нравятся, не удовлетворяют требований. Просьба не критиковать. Вот сам плагин, описание внутри: 
/* ------------------------------------------------------------------
Плаин выпадывающего меню .DropDown()
Опции:
  button_element: 'a',             Ссылка на кнопку для открытия меню
  menu_element: 'ul',              Ссылка на дочернее меню
  event: 'hover',                  Событие для открытия меню hover или click
  animate: 'slide',                Название анимации none, fade или slide
  animate_duraction: 500,          Скорость анимации в милисекундах
  open_class: 'open',              Класс для открытого меню
  wrap_class: 'dropdown',          Класс обёртки меню
  button_class: 'dropdown-button', Класс кнопки меню
  menu_class: 'dropdown-menu'      Класс по меню
События:
  render.dropdown                  Визуализая, добовление нужных стилей, классов
  open.dropdown                    Открытие меню
  close.dropdown                   Закрытие меню
Пример:
  HTML:
    <div class="menu">
      <a href="#">Открыть</a>
      <ul>
        <li><a href="#">Пункт 1</a></li>
        <li><a href="#">Пункт 2</a></li>
        <li><a href="#">Пункт 3</a></li>
      </ul>
    </div>
  JS:
    $(".menu").DropDown();
  
------------------------------------------------------------------ */
;(function ($) {
    "use strict";
    $.fn.DropDown = function(method, options) {
        var defaults, vars, methods, data;
        // Если не указаны пользовательские настройки
        if(options === undefined) {
            options = {};
            // Если пользователь не указал метод но указал свои настройки
            if(typeof method === 'object') {
                options = method;
            }
        }
        // Стандартные настройка
        defaults = {
            button_element: 'a',
            menu_element: 'ul',
            event: 'hover',
            animate: 'slide',
            animate_duraction: 500,
            open_class: 'open',
            wrap_class: 'dropdown',
            button_class: 'dropdown-button',
            menu_class: 'dropdown-menu'
        };
        // Методы плагина
        methods = {
            init: function () {
                // Цикл по всем элементам
                return this.each(function () {
                    var $wrap, $button, $menu;
                    // Обёртка меню
                    $wrap = $(this);
                    // Получение data настроек
                    data = $wrap.attr('data-dropdown');
                    if (data === undefined) {
                        data = {};
                    } else {
                        try {
                            data = JSON.parse(data);
                        } catch (error) {
                            $.error('Не верный формат JSON данных. В data атрибуте, для JQuery.dropdown');
                        }
                    }
                    // Обьеденияем стандартные и пользовательские настройки
                    vars = $.extend({}, defaults, data, options);
                    // Елементы меню
                    $button = $wrap.children(vars.button_element);
                    $menu = $wrap.children(vars.menu_element);
                    // Визуализация
                    $wrap
                        .addClass(vars.wrap_class)
                        .trigger('dropdown.render');
                    $menu
                        .addClass(vars.menu_class)
                        .css('display', 'none');
                    $button.addClass(vars.button_class);
                    // Открытие закрытие меню
                    switch (vars.event) {
                        // При наведении
                        case 'hover':
                            $wrap.on('mouseenter.dropdow', function () {
                                open($(this));
                            }).on('mouseleave.dropdown', function () {
                                close($(this));
                            });
                            break;
                        // При клике
                        default:
                            $button.on('click.dropdown', function () {
                                var $this_wrap = $(this).parent($wrap);
                                if($this_wrap.hasClass(vars.open_class)) {
                                    close($this_wrap);
                                } else {
                                    open($this_wrap);
                                }
                            });
                            // При клике вне меню закрываем его
                            $(document).on('click.dropdown', function (event) {
                                if ($(event.target).closest($wrap).length) return;
                                close($wrap);
                                event.stopPropagation();
                            });
                            break;
                    }
                });
            },
            update: function(content) {
                // !!!
            },
            destroy: function() {
                var $wrap;
                // Обёртка
                $wrap = $(this);
                alert(vars);// undefained
            }
        };
        // Вызов методов
        // Если запрашиваемы метод существует, вызываем его
        if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        // Если передан обьект или ничего, ызываем метод init
        } else if (typeof method === 'object' || !method) {
            return methods.init.apply(this, arguments);
        // Если метода не существует, выдаём ошибку
        } else {
            $.error('Метод с именем ' +  method + ' не существует для jQuery.dropdown');
        }
        // Функция открытия меню
        function open(element) {
            element
                .addClass(vars.open_class)
                .trigger('open.dropdown');
            // Анимация
            switch (vars.animate) {
                case 'slide':
                    element
                        .children(vars.menu_element)
                        .slideDown(vars.animate_duraction)
                        .css('display', 'block');
                    break;
                case 'fade':
                    element
                        .children(vars.menu_element)
                        .fadeIn(vars.animate_duraction)
                        .css('display', 'block');
                    break;
                default:
                    element
                        .children(vars.menu_element)
                        .css('display', 'block');
                    break;
            }
        }
        // Функция закрытия меню
        function close(element) {
            element
                .removeClass(vars.open_class)
                .trigger('close.dropdown');
            // Анимация
            switch (vars.animate) {
                case 'slide':
                    element
                        .children(vars.menu_element)
                        .slideUp(vars.animate_duraction);
                    break;
                case 'fade':
                    element
                        .children(vars.menu_element)
                        .fadeOut(vars.animate_duraction);
                    break;
                default:
                    element
                        .children(vars.menu_element)
                        .css('display', 'none');
                    break;
            }
        }
    };
}(jQuery));
 | 
	
		
 Цитата: 
	
 вариант ... 
<!DOCTYPE HTML>
<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
  <script>
     $(function(){
     /* ------------------------------------------------------------------
Плаин выпадывающего меню .DropDown()
Опции:
  button_element: 'a',             Ссылка на кнопку для открытия меню
  menu_element: 'ul',              Ссылка на дочернее меню
  event: 'hover',                  Событие для открытия меню hover или click
  animate: 'slide',                Название анимации none, fade или slide
  animate_duraction: 500,          Скорость анимации в милисекундах
  open_class: 'open',              Класс для открытого меню
  wrap_class: 'dropdown',          Класс обёртки меню
  button_class: 'dropdown-button', Класс кнопки меню
  menu_class: 'dropdown-menu'      Класс по меню
События:
  render.dropdown                  Визуализая, добовление нужных стилей, классов
  open.dropdown                    Открытие меню
  close.dropdown                   Закрытие меню
Пример:
  HTML:
    <div class="menu">
      <a href="#">Открыть</a>
      <ul>
        <li><a href="#">Пункт 1</a></li>
        <li><a href="#">Пункт 2</a></li>
        <li><a href="#">Пункт 3</a></li>
      </ul>
    </div>
  JS:
    $(".menu").DropDown();
------------------------------------------------------------------ */
;(function ($) {
    "use strict";
    $.fn.DropDown = function(method, options) {
        var defaults, vars, methods, data;
        // Если не указаны пользовательские настройки
        if(options === undefined) {
            options = {};
            // Если пользователь не указал метод но указал свои настройки
            if(typeof method === 'object') {
                options = method;
            }
        }
        // Стандартные настройка
        defaults = {
            button_element: 'a',
            menu_element: 'ul',
            event: 'hover',
            animate: 'slide',
            animate_duraction: 500,
            open_class: 'open',
            wrap_class: 'dropdown',
            button_class: 'dropdown-button',
            menu_class: 'dropdown-menu'
        };
        // Методы плагина
        methods = {
            init: function () {
                // Цикл по всем элементам
                return this.each(function () {
                    var $wrap, $button, $menu;
                    // Обёртка меню
                    $wrap = $(this);
                    // Получение data настроек
                    data = $wrap.data('dropdown');
                    if (data) return ; //инициализация уже была
                    // Обьеденияем стандартные и пользовательские настройки
                    vars = $.extend({}, defaults, data, options);
                    $wrap.data('dropdown', vars);
                    // Елементы меню
                    $button = $wrap.children(vars.button_element);
                    $menu = $wrap.children(vars.menu_element);
                    // Визуализация
                    $wrap
                        .addClass(vars.wrap_class)
                        .trigger('dropdown.render');
                    $menu
                        .addClass(vars.menu_class)
                        .css('display', 'none');
                    $button.addClass(vars.button_class);
                    // Открытие закрытие меню
                    switch (vars.event) {
                        // При наведении
                        case 'hover':
                            $wrap.on('mouseenter.dropdow', function () {
                                open($(this));
                            }).on('mouseleave.dropdown', function () {
                                close($(this));
                            });
                            break;
                        // При клике
                        default:
                            $button.on('click.dropdown', function () {
                                var $this_wrap = $(this).parent($wrap);
                                if($this_wrap.hasClass(vars.open_class)) {
                                    close($this_wrap);
                                } else {
                                    open($this_wrap);
                                }
                            });
                            // При клике вне меню закрываем его
                            $(document).on('click.dropdown', function (event) {
                                if ($(event.target).closest($wrap).length) return;
                                close($wrap);
                                event.stopPropagation();
                            });
                            break;
                    }
                });
            },
            update: function(content) {
                // !!!
            },
            destroy: function() {
                var $wrap, vars;
                // Обёртка
                $wrap = $(this);
                vars = $wrap.data('dropdown');
                console.log(vars)
                alert(vars);// undefained
            }
        };
        // Вызов методов
        // Если запрашиваемы метод существует, вызываем его
        if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        // Если передан обьект или ничего, ызываем метод init
        } else if (typeof method === 'object' || !method) {
            return methods.init.apply(this, arguments);
        // Если метода не существует, выдаём ошибку
        } else {
            $.error('Метод с именем ' +  method + ' не существует для jQuery.dropdown');
        }
        // Функция открытия меню
        function open(element) {
            element
                .addClass(vars.open_class)
                .trigger('open.dropdown');
            // Анимация
            switch (vars.animate) {
                case 'slide':
                    element
                        .children(vars.menu_element)
                        .stop(true,true)
                        .slideDown(vars.animate_duraction)
                        .css('display', 'block');
                    break;
                case 'fade':
                    element
                        .children(vars.menu_element)
                        .stop(true,true)
                        .fadeIn(vars.animate_duraction)
                        .css('display', 'block');
                    break;
                default:
                    element
                        .children(vars.menu_element)
                        .css('display', 'block');
                    break;
            }
        }
        // Функция закрытия меню
        function close(element) {
            element
                .removeClass(vars.open_class)
                .trigger('close.dropdown');
            // Анимация
            switch (vars.animate) {
                case 'slide':
                    element
                        .children(vars.menu_element)
                        .stop(true,true)
                        .slideUp(vars.animate_duraction);
                    break;
                case 'fade':
                    element
                        .children(vars.menu_element)
                        .stop(true,true)
                        .fadeOut(vars.animate_duraction);
                    break;
                default:
                    element
                        .children(vars.menu_element)
                        .css('display', 'none');
                    break;
            }
        }
    };
}(jQuery));
$(".menu").DropDown({event: ''})
.DropDown('destroy');
});
  </script>
</head>
<body>
<div class="menu">
      <a href="#">Открыть</a>
      <ul>
        <li><a href="#">Пункт 1</a></li>
        <li><a href="#">Пункт 2</a></li>
        <li><a href="#">Пункт 3</a></li>
      </ul>
    </div>
</body>
</html>
 | 
	
		
 
data = $wrap.data('dropdown');
if (data) return; //инициализация уже была
Меня пугает эти строчки, в особенности if (data) return;, это полностью убило возможность задавать настройки плагина в HTML, а это очень плохо. Или может я что то путаю, посмотрел HTML а я кажется не знаю что делает .data(), почему в html нет data-dropdown=""? А что делает строчка .stop(true, true), в анимации, что это?  | 
	
		
 А зачем в самом начале $(function(){ если уже есть ;(function ($) {? Что это даёт? 
	 | 
	
		
 Цитата: 
	
 Цитата: 
	
 Цитата: 
	
  | 
	
		
 Цитата: 
	
 Вот про hover глюк, это да. Часто это вижу, жудко бесит, с click такая же ерунда, если раз 5 за секунду нажать. Огромное спасибо, за такую полезную штуку. "можно вынести код плагина" - Посути это и так вынесено, и даже в отдельный файл.  | 
	
		
 Цитата: 
	
 
<!DOCTYPE HTML>
<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
  <script>
     /* ------------------------------------------------------------------
Плаин выпадывающего меню .DropDown()
Опции:
  button_element: 'a',             Ссылка на кнопку для открытия меню
  menu_element: 'ul',              Ссылка на дочернее меню
  event: 'hover',                  Событие для открытия меню hover или click
  animate: 'slide',                Название анимации none, fade или slide
  animate_duraction: 500,          Скорость анимации в милисекундах
  open_class: 'open',              Класс для открытого меню
  wrap_class: 'dropdown',          Класс обёртки меню
  button_class: 'dropdown-button', Класс кнопки меню
  menu_class: 'dropdown-menu'      Класс по меню
События:
  render.dropdown                  Визуализая, добовление нужных стилей, классов
  open.dropdown                    Открытие меню
  close.dropdown                   Закрытие меню
Пример:
  HTML:
    <div class="menu">
      <a href="#">Открыть</a>
      <ul>
        <li><a href="#">Пункт 1</a></li>
        <li><a href="#">Пункт 2</a></li>
        <li><a href="#">Пункт 3</a></li>
      </ul>
    </div>
  JS:
    $(".menu").DropDown();
------------------------------------------------------------------ */
;(function ($) {
    "use strict";
    $.fn.DropDown = function(method, options) {
        var defaults, vars, methods, data;
        // Если не указаны пользовательские настройки
        if(options === undefined) {
            options = {};
            // Если пользователь не указал метод но указал свои настройки
            if(typeof method === 'object') {
                options = method;
            }
        }
        // Стандартные настройка
        defaults = {
            button_element: 'a',
            menu_element: 'ul',
            event: 'hover',
            animate: 'slide',
            animate_duraction: 500,
            open_class: 'open',
            wrap_class: 'dropdown',
            button_class: 'dropdown-button',
            menu_class: 'dropdown-menu'
        };
        // Методы плагина
        methods = {
            init: function () {
                // Цикл по всем элементам
                return this.each(function () {
                    var $wrap, $button, $menu;
                    // Обёртка меню
                    $wrap = $(this);
                    // Получение data настроек
                    data = $wrap.data('dropdown');
                    if (!data) data = {} ;
                    if (data.init) return ;  //инициализация уже была
                    data.init = true;
                    // Обьеденияем стандартные и пользовательские настройки
                    vars = $.extend({}, defaults, data, options);
                    $wrap.data('dropdown', vars);
                    // Елементы меню
                    $button = $wrap.children(vars.button_element);
                    $menu = $wrap.children(vars.menu_element);
                    // Визуализация
                    $wrap
                        .addClass(vars.wrap_class)
                        .trigger('dropdown.render');
                    $menu
                        .addClass(vars.menu_class)
                        .css('display', 'none');
                    $button.addClass(vars.button_class);
                    // Открытие закрытие меню
                    switch (vars.event) {
                        // При наведении
                        case 'hover':
                            $wrap.on('mouseenter.dropdow', function () {
                                open($(this));
                            }).on('mouseleave.dropdown', function () {
                                close($(this));
                            });
                            break;
                        // При клике
                        default:
                            $button.on('click.dropdown', function () {
                                var $this_wrap = $(this).parent($wrap);
                                if($this_wrap.hasClass(vars.open_class)) {
                                    close($this_wrap);
                                } else {
                                    open($this_wrap);
                                }
                            });
                            // При клике вне меню закрываем его
                            $(document).on('click.dropdown', function (event) {
                                if ($(event.target).closest($wrap).length) return;
                                close($wrap);
                                event.stopPropagation();
                            });
                            break;
                    }
                });
            },
            update: function(content) {
                // !!!
            },
            destroy: function() {
                var $wrap, vars;
                // Обёртка
                $wrap = $(this);
                vars = $wrap.data('dropdown');
                console.log(vars)
                alert(vars);// undefained
            }
        };
        // Вызов методов
        // Если запрашиваемы метод существует, вызываем его
        if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        // Если передан обьект или ничего, ызываем метод init
        } else if (typeof method === 'object' || !method) {
            return methods.init.apply(this, arguments);
        // Если метода не существует, выдаём ошибку
        } else {
            $.error('Метод с именем ' +  method + ' не существует для jQuery.dropdown');
        }
        // Функция открытия меню
        function open(element) {
            element
                .addClass(vars.open_class)
                .trigger('open.dropdown');
            // Анимация
            switch (vars.animate) {
                case 'slide':
                    element
                        .children(vars.menu_element)
                        .stop(true,true)
                        .slideDown(vars.animate_duraction)
                        .css('display', 'block');
                    break;
                case 'fade':
                    element
                        .children(vars.menu_element)
                        .stop(true,true)
                        .fadeIn(vars.animate_duraction)
                        .css('display', 'block');
                    break;
                default:
                    element
                        .children(vars.menu_element)
                        .css('display', 'block');
                    break;
            }
        }
        // Функция закрытия меню
        function close(element) {
            element
                .removeClass(vars.open_class)
                .trigger('close.dropdown');
            // Анимация
            switch (vars.animate) {
                case 'slide':
                    element
                        .children(vars.menu_element)
                        .stop(true,true)
                        .slideUp(vars.animate_duraction);
                    break;
                case 'fade':
                    element
                        .children(vars.menu_element)
                        .stop(true,true)
                        .fadeOut(vars.animate_duraction);
                    break;
                default:
                    element
                        .children(vars.menu_element)
                        .css('display', 'none');
                    break;
            }
        }
    };
$(function(){
  $("[data-dropdown]").DropDown() //автозапуск плагина
});
}(jQuery));
$(function(){
//$(".menu").DropDown()
//.DropDown('destroy');
});
  </script>
</head>
<body>
<div class="menu" data-dropdown='{"event":""}' >
      <a href="#">Открыть</a>
      <ul>
        <li><a href="#">Пункт 1</a></li>
        <li><a href="#">Пункт 2</a></li>
        <li><a href="#">Пункт 3</a></li>
      </ul>
    </div>
</body>
</html>
 | 
	
		
 То что надо спасибо. 
	 | 
	
		
 Алексей Петрович, 
	сложно соблюсти правильный формат data-dropdown рекомендую прогонять через 
<script>
document.write(JSON.stringify({event:''}))
 </script>
кавычки важны тогда из дата получится сразу обьект  | 
	
		
 Я умею этим пользоваться. 
	Да и ктому же есть онлайн генераторы. Ещё раз спасибо.  | 
| Часовой пояс GMT +3, время: 14:29. |