Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.02.2019, 09:41
Аспирант
Отправить личное сообщение для alex-romanov Посмотреть профиль Найти все сообщения от alex-romanov
 
Регистрация: 02.02.2019
Сообщений: 67

Как работают дополнительные методы в jQuery
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="css/style.css" type='text/css'  />
    <script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
    <script type="text/javascript" src="js/jquery-ui.js"></script>
    <script type="text/javascript" src="js/my-plugin.js"></script>
    <script type="text/javascript" src="js/script.js"></script>
</head>
<body class="shadow">
 
 
<h3>Click on Paragraph</h3>
<button name="red">Установить - Red</button>
<button name="green">Установить - Green</button>
<button name="blue">Установить - Blue</button>
<button name="reset">Сбросить цвет</button>
<button name="destroy">Вернуть по умолчанию</button>
<br/>
<p>
    Искусство появилось почти сразу же после появления человечества,
    и на протяжении веков было создано множество величайших
    произведений в живописи, скульптуре и других сферах искусства.
    Какие из них считать самыми лучшими, вопрос очень спорный,
    ведь даже эксперты расходятся во мнениях на этот счет.
    Мы же сегодня попробуем составить список десяти наиболее
    известных произведений искусства за все время.
</p>
<p>
    Каменные монолитные статуи, расположенные на острове Пасхи в Тихом океане.
    Считается, что статуи были созданы аборигенами острова
    между 1250 и 1500 годами нашей эры.
</p>
<p>
    Одна из наиболее известных древнегреческих скульптурных работ,
    созданная где-то между 130 и 100 годами до нашей эры.
    Мраморная скульптура была обнаружена в 1820 году на острове Милос.
</p>
 
</body>
</html>



плагин

(function ($) {
 
    /*значение по умолчанию - ЗЕЛЁНЫЙ */
    var defaults = {color: 'green'};
 
    var methods = {
 
        init: function (params) {
            /*актуальные настройки, будут индивидуальными
            при каждом запуске*/
            var options = $.extend({},
                defaults,
                params);
 
            /*инициализируем один раз
            * data() — это хороший способ отслеживать
            * состояние переменных для каждого элемента.
            *   Рекомендуется использовать один объектный литерал,
            *  который будет объединять все ваши переменные
            *  под одной крышей и вы будете обращаться к
            *  этому объекту через одно пространство имён.*/
 
            var init = $(this).data('myPlugin');
 
            if (init) {
                return this;
            } else {
 
                $(this).data('myPlugin', true);
 
                return this.on("click.myPlugin", function () {
 
                    $(this).css('color', options.color);
                });
            }
        },
 
        /* Устанавливаем цвет*/
        color: function (color) {
            $(this).css('color', color);
        },
 
        /* Меняем на цвет, который мы считаем цветом по умолчанию*/
        reset: function () {
            $(this).css('color', 'black');
        },
 
        destroy: function () {
 
            /* var resetMethods = methods.reset;
             $(resetMethods).apply(this);*/
 
            methods.reset.apply(this);
            /*указывает на то, что нужно отсоединить все
            * обработчики, привязанные к пространству имен ".myPlugin"*/
            $(this).off(".myPlugin");
        }
    };
 
    $.fn.myPlugin = function (method) {
 
        /* если запрашиваемый метод существует, мы его вызываем,
        * все параметры, кроме имени метода прийдут в метод,
        * this (то есть контекст, полученный в точке вызвова),
         * будет использоваться в вызываемом методе*/
        if (methods[method]) {
 
           /*Извлекает диапазон значений и возвращает его в виде нового массива.*/
            var rangeValues = Array.prototype.slice;
 
           /* Метод call позволяет указать объект,
              на который будет ссылаться this во время вызова Функции.
            Метод call применяется к функции, в параметре получает объект.
           Помимо контекста, в параметры передаем параметр функции.
           (который был указан нами в точке вызова плагина, при вызове
            текущей функции, например  ' $('p').myPlugin('color', color);'*/
            var callMethod = rangeValues.call(arguments, 1);
 
            var currentMethod = methods[method];
 
            var readyFunction = currentMethod.apply(this, callMethod);
 
            return readyFunction;
 
             //   return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
 
        } else if (typeof method === 'object' || !method) {
            /* если первым параметром при вызове плагина указан объект,
              либо параметров нет, тогда вызываем метод init,
               для первоначальной настройки плагина*/
            return methods.init.apply(this, arguments);
        } else {
            /* если условия не выполнились, тогда указываем, что запрашиваемый метод,
            * остутсвует в данном плагине*/
            $.error('Метод "' + method + '" не найден в плагине jQuery.myPlugin');
        }
    };
 
})(jQuery);


вызов плагина

$(document).ready(function () {
 
    $('p').myPlugin();
  //  $('p').myPlugin();
 
    /*указывает на то, что в качестве селекторо,
    * используется наличие элемента button, но при этом указывается
    * условие, что событие click и его обработчик,
    * должне сработать для элементов button c 0 по 2 (одинаковые элементы в
    * DOM-структуре, имеют порядковый номер), то есть не более 3-го номера*/
    $('button:lt(3)').click(function(){
        var color = this.name;
        /*вызываем метод color, из указанного плагина,
        *'color' - это аргумент, который указывает на имя метода
        * из массива методов в плагине;
        * color - Содержит название цвета, которое нужно передать в
         * вызываемый метод плагина*/
        $('p').myPlugin('color', color);
    });
 
    /* если элемент button, имеет индекс 3 (то есть 4-й элемент)
     * в массиве элементов button, тогда запускаем другой обработчик */
    $('button:eq(3)').click(function(){
        $('p').myPlugin('reset');
    });
 
    /* если элемент button, имеет индекс 4 (то есть 5-й элемент)
     * в массиве элементов button, тогда запускаем другой обработчик */
    $('button:eq(4)').click(function(){
        $('p').myPlugin('destroy');
    });
 
});



Вопросы:

/*Извлекает диапазон значений и возвращает его в виде нового массива.*/
            var rangeValues = Array.prototype.slice;


что это такое, диапазон каких значений ?

var currentMethod = methods[method];


Это сформированный объект, который содержит данные о запрашиваемом методе ?
Что это за структура и что он содержит ?

var readyFunction = currentMethod.apply(this, callMethod);


" Метод apply позволяет указать объект, на который будет ссылаться this во время вызова Функции. "

Так метод call() то же самое делает.

В чем же отличие ?


destroy: function () {
 
            /* var resetMethods = methods.reset;
             $(resetMethods).apply(this);*/
 
            methods.reset.apply(this);
            /*указывает на то, что нужно отсоединить все
            * обработчики, привязанные к пространству имен ".myPlugin"*/
            $(this).off(".myPlugin");
        }


Вообще не понятно, что делает данный метод

reset() для чего здесь.

И еще вопрос, я оставлял комментарии в плагине, я правильно понял суть работы участок кода ?

https://thimbleprojects.org/alex-r/637863

Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 15.02.2019, 10:55
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,723

Сообщение от alex-romanov
что это такое, диапазон каких значений ?
Тех, что были ему переданы (в вашем случае это список аргументов).
https://developer.mozilla.org/ru/doc...ts/Array/slice

Сообщение от alex-romanov
Это сформированный объект, который содержит данные о запрашиваемом методе ?
Что это за структура и что он содержит ?
"currentMethod" это ссылка на свойство, название которого лежит в переменной "method", объекта "methods".
Т.к. значения свойств у объекта methods только функции, то и значение переменной currentMethod - функция либо undefined (если такого свойства у объекта нет).

Сообщение от alex-romanov
Так метод call() то же самое делает.
Методы "call" и "apply" вызывают функцию с подменой контекста (слова "this") этой функции на переданное первым аргументом значение.
https://developer.mozilla.org/ru/doc.../Function/call

Сообщение от alex-romanov
Вообще не понятно, что делает данный метод
Вызывается значение свойства "reset" (значение - функция) объекта "methods" с подменой контекста (слова "this") на переданное (скорее всего HTMLElement).
Далее удаляется listener события "myPlugin".
Ответить с цитированием
  #3 (permalink)  
Старый 16.02.2019, 03:11
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от alex-romanov
плагин... вызова плагина... вызове плагина указан... настройки плагина... данном плагине... в плагине... вызов плагина... указанного плагина... в плагине... метод плагина... в плагине, я...
Это не плагин, это метод расширения. Это такой метод, добавляемый к существующему классу в месте, отличном от объявления класса.

Вместо того, чтобы расширять существующий jQuery, вы можете создать свою собственную «jquery». В вашем коде много раз создаётся $(this), почему бы тогда не наследовать от jQuery. Вот ваш пример с цветом...

<!doctype html>
<html>
<head>
	<meta charset="utf-8">
	<script src="https://code.jquery.com/jquery-latest.js"></script>
	<script>

class MyColorJQuery extends jQuery {
	constructor(selector, context) {
		super(selector, context);
		this.__proto__ = MyColorJQuery.prototype;

		this.options = this.constructor.defaultOptions;

		if(!this.data("my-color")) {
			this.data("my-color", this);
			this.on("click.my-color", () => this.color(this.options.color));
		}
	}

	static get defaultOptions() {
		return {
			color: "green"
		};
	}

	setOptions(options) {
		this.extend(this.options, options);
		return this;
	}

	color(color) {
		return this.css("color", color);
	}

	reset() {
		return this.css("color", "black");
	}

	destroy() {
		this.reset();
		this.off(".my-color");
		return this;
	}
}

$(() => {
	const p = new MyColorJQuery("p").setOptions({ color: "deeppink" });

	$("button:lt(3)").click(function() {
		const color = this.name;
		p.color(color);
	});

	$("button:eq(3)").click(function() {
		p.reset();
	});

	$("button:eq(4)").click(function() {
		p.destroy();
	});
});

	</script>
</head>
<body>

<h3>Click on Paragraph</h3>
<button name="red">Установить - Red</button>
<button name="green">Установить - Green</button>
<button name="blue">Установить - Blue</button>
<button name="reset">Сбросить цвет</button>
<button name="destroy">Вернуть по умолчанию</button>

<p>
	Искусство появилось почти сразу же после появления человечества,
	и на протяжении веков было создано множество величайших
	произведений в живописи, скульптуре и других сферах искусства.
	Какие из них считать самыми лучшими, вопрос очень спорный,
	ведь даже эксперты расходятся во мнениях на этот счет.
	Мы же сегодня попробуем составить список десяти наиболее
	известных произведений искусства за все время.
</p>
<p>
	Каменные монолитные статуи, расположенные на острове Пасхи в Тихом океане.
	Считается, что статуи были созданы аборигенами острова
	между 1250 и 1500 годами нашей эры.
</p>
<p>
	Одна из наиболее известных древнегреческих скульптурных работ,
	созданная где-то между 130 и 100 годами до нашей эры.
	Мраморная скульптура была обнаружена в 1820 году на острове Милос.
</p>

</body>
</html>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Плагин jQuery - как сгенерить событие? maxapet jQuery 1 31.08.2015 09:44
jQuery UI -> selectmenu, как установить вручную selected? Pit jQuery 3 28.05.2015 17:31
Как установить дефотлтное значение в jquery autocomplette? heksen jQuery 1 28.02.2015 17:24
Как работают операции сравнения > < == >= <= с различными типами данных? almac Общие вопросы Javascript 3 29.06.2012 14:07
Как сделать плагин jQuery в виде объекта? SkaN jQuery 12 28.06.2012 12:31