Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.06.2015, 03:16
Профессор
Отправить личное сообщение для Decode Посмотреть профиль Найти все сообщения от Decode
 
Регистрация: 31.01.2015
Сообщений: 576

Создание плагина на нативном JavaScript
В jQuery все просто — создается новый метод для объекта jQuery.

jQuery.fn.myPlugin = function() {
  // Тут пишем код
};

А как то же самое сделать на нативном JS? Т.е. допустим, вызвать у какого-нибудь элемента метод myPlugin.
document.querySelector('element').myPlugin()

Правильно ли будет создавать метод в Element.prototype?
Element.prototype.myPlugin = function {
  // ...
};
Ответить с цитированием
  #2 (permalink)  
Старый 06.06.2015, 12:09
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Пример кода плагина
var myPlugin = function () {
        function myPlugin(params) {
                if (!(this instanceof myPlugin)) {
                        return new myPlugin(params);
                }
                this.initialize.apply(this, arguments);
        }
        myPlugin.prototype = {
                initialize: function (arg) {
                        this.text = arg.text;
                },
                message: function () {
                        alert(this.text);
                }
        };
        return myPlugin;
}();

myPlugin({text: 'работаем'}).message();

Последний раз редактировалось Vlasenko Fedor, 06.06.2015 в 12:13.
Ответить с цитированием
  #3 (permalink)  
Старый 06.06.2015, 16:42
Профессор
Отправить личное сообщение для Decode Посмотреть профиль Найти все сообщения от Decode
 
Регистрация: 31.01.2015
Сообщений: 576

Poznakomlus, спасибо, но это я знаю.

Вот допустим есть плагин fullPage. Он вызывается у элемента так:
$('#fullpage').fullpage({options});

Сам плагин написан так:
$.fn.fullpage = function(options) {
   // ...
}

Я имею ввиду как сделать то же самое только нативным JS? Чтоб у определенного элемента вызвать метод.
document.getElementById('fullpage').fullpage({options});
Ответить с цитированием
  #4 (permalink)  
Старый 06.06.2015, 17:07
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

$ - это функция
<div id="fullpage">My text</div>
<script>
var $ = function () {
        function myPlugin(tag) {
                if (!(this instanceof myPlugin)) {
                        return new myPlugin(tag);
                }
                this.el = document.getElementById(tag);
        }
        myPlugin.prototype.message = function () {
                alert(this.el.innerHTML);
        };
        return myPlugin;
}();
$('fullpage').message();
</script>

Таким образом вы изменяете прототип всех html элементов, так делать не рекомендуется, потому, что это может сделать кто то другой да и есть решение выше
<div id="fullpage">My text</div>
<script>
Element.prototype.message = function () {
    alert(this.innerHTML);
};
document.getElementById('fullpage').message();
</script>

Последний раз редактировалось Vlasenko Fedor, 06.06.2015 в 17:11.
Ответить с цитированием
  #5 (permalink)  
Старый 06.06.2015, 18:17
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Лучше классом делать.

(function(window) {
   window.MyPlugin = function(element) {
      this.element = element;
   }
   myPlugin.prototype.myMethod = function() {
      //...
   }
})(window);



var elem = document.getElementById('elem');
var test = new MyPlugin(elem);
test.myMethod();

Последний раз редактировалось ruslan_mart, 06.06.2015 в 18:21.
Ответить с цитированием
  #6 (permalink)  
Старый 01.12.2016, 14:03
Новичок на форуме
Отправить личное сообщение для 23keks23 Посмотреть профиль Найти все сообщения от 23keks23
 
Регистрация: 01.12.2016
Сообщений: 2

Poznakomlus, твой вариант с функцией myPlugin работает отлично. Но что если я хочу передать класс элемента, а этих элементов будет несколько? Пока решение нашел вот такое, но по мне это "колхоз", собственно пример ниже:

var myPlugin = function () {
	function init(css) {
		if (!(this instanceof init)) {
			return new init(css);
		}

		if (typeof css == "object") this.els = [css];
		else this.els = document.querySelectorAll(css);
	}

	init.prototype.message = function (args) {
		[ ].forEach.call(this.els, function (el) {
			console.log(el);
		});
	}

	return init;
} ();


<button class="popup_message">A pop-up message with a warning</button>
<button class="popup_message">A pop-up message with a confirm</button>

<script>
	var res = jPlugin('.popup_message').message(args);
</script>
Ответить с цитированием
  #7 (permalink)  
Старый 02.12.2016, 00:23
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Сообщение от 23keks23
Но что если я хочу передать класс элемента, а этих элементов будет несколько
<div id="test"></div>
<div id="test2"></div>
<script>
function MyTest(tag) {
    var self = this instanceof MyTest
        ? this
        : Object.create(MyTest.prototype);
    self.init.apply(self, arguments);
    return self;
}
MyTest.prototype = {
    init: function (tag) {
        if (tag && typeof tag === 'string') {
            var self = this;
            this._element = document.querySelector(tag);
            if (!this._element) {
                throw Error("MyTest: element with this tag isn't found");
            }
            this._element.addEventListener('click', function () {
                if(typeof self._callback === 'function') self._callback(self.value);
            });
        } else {
            throw Error("MyTest: tag is not string");
        }
    },
    get value() {
        return this._value;
    },
    set value(value) {
        this._value = value;
        this._element.innerHTML = value;
    },
    onclick: function (callback) {
        this._callback = callback;
    }
};
// Используем
var foo = MyTest('#test');
foo.value = 555;
foo.onclick(function (value) {
    alert(value);
});
var foo2 = MyTest('#test2');
foo2.value = 777;
foo2.onclick(function (value) {
    alert(value);
});
</script>
Ответить с цитированием
  #8 (permalink)  
Старый 02.12.2016, 09:32
Новичок на форуме
Отправить личное сообщение для 23keks23 Посмотреть профиль Найти все сообщения от 23keks23
 
Регистрация: 01.12.2016
Сообщений: 2

Poznakomlus, вот эта строка (15)
this._element = document.querySelector(tag);

находит самый первый элемент с селектором tag, для того что бы найти все элементы используют querySelectorAll(tag), но тогда в this._element будет массив. Как обработать каждый из элементов? У тебя блоки с ID а я хочу понять как тоже самое сделать с одинаковым CLASS например для
<div class="test"></div> 
<div class="test"></div>
Ответить с цитированием
  #9 (permalink)  
Старый 02.12.2016, 10:12
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

function MyTest(element) {}

если у каждого должны быть свои свойства, то передавайте element
пройдясь по всем элементам инициализируйте их индивидуальные свойства
Ответить с цитированием
  #10 (permalink)  
Старый 02.12.2016, 11:47
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Еще примеры (собственные велосипеды )
https://jsfiddle.net/vlasenkofedor/jLprM/
https://jsfiddle.net/vlasenkofedor/uRj7c/
https://jsfiddle.net/vlasenkofedor/UFmLf/
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание новой вкладки в браузере через Javascript. mshdn Javascript под браузер 6 04.03.2014 03:58
Как загрузить JavaScript после создание DOM? Jeremen Общие вопросы Javascript 6 24.08.2012 21:54
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34
Создание Новой Библиотеки JavaScript Rudolf Eremyan Элементы интерфейса 9 21.09.2009 22:45