好的,我们都知道如何编写jQuery插件:http://docs.jquery.com/Plugins/Authoring
有人可以使用方法和默认设置建议纯Javascript 模板插件吗?
我希望它能够使用单个节点和节点数组(querySelectorAll
)
这样的事情:
var PluginName = function(selector){
...
}
并称之为:
var dropdown = new PluginName('.dropdown');
能够关闭所有下拉菜单:
dropdown.close();
答案 0 :(得分:18)
我一直在使用带有inits和public方法的模块模式。不是jQuery插件模式的完全匹配匹配,但是非常可扩展且工作得非常好。刚刚更新了UMD / CommonJS / AMD /等等。
您结帐my starter template here,然后查看working example here。
为了更好的衡量,这里有完整的模板:
/**
*
* Name v0.0.1
* Description, by Chris Ferdinandi.
* http://gomakethings.com
*
* Free to use under the MIT License.
* http://gomakethings.com/mit/
*
*/
(function (root, factory) {
if ( typeof define === 'function' && define.amd ) {
define(factory);
} else if ( typeof exports === 'object' ) {
module.exports = factory;
} else {
root.Plugin = factory(root); // @todo Update to plugin name
}
})(this, function (root) {
'use strict';
//
// Variables
//
var exports = {}; // Object for public APIs
var supports = !!document.querySelector && !!root.addEventListener; // Feature test
// Default settings
var defaults = {
someVar: 123,
callbackBefore: function () {},
callbackAfter: function () {}
};
//
// Methods
//
/**
* Merge defaults with user options
* @private
* @param {Object} defaults Default settings
* @param {Object} options User options
* @returns {Object} Merged values of defaults and options
*/
var extend = function ( defaults, options ) {
for ( var key in options ) {
if (Object.prototype.hasOwnProperty.call(options, key)) {
defaults[key] = options[key];
}
}
return defaults;
};
/**
* A simple forEach() implementation for Arrays, Objects and NodeLists
* @private
* @param {Array|Object|NodeList} collection Collection of items to iterate
* @param {Function} callback Callback function for each iteration
* @param {Array|Object|NodeList} scope Object/NodeList/Array that forEach is iterating over (aka `this`)
*/
var forEach = function (collection, callback, scope) {
if (Object.prototype.toString.call(collection) === '[object Object]') {
for (var prop in collection) {
if (Object.prototype.hasOwnProperty.call(collection, prop)) {
callback.call(scope, collection[prop], prop, collection);
}
}
} else {
for (var i = 0, len = collection.length; i < len; i++) {
callback.call(scope, collection[i], i, collection);
}
}
};
/**
* Remove whitespace from a string
* @private
* @param {String} string
* @returns {String}
*/
var trim = function ( string ) {
return string.replace(/^\s+|\s+$/g, '');
};
/**
* Convert data-options attribute into an object of key/value pairs
* @private
* @param {String} options Link-specific options as a data attribute string
* @returns {Object}
*/
var getDataOptions = function ( options ) {
var settings = {};
// Create a key/value pair for each setting
if ( options ) {
options = options.split(';');
options.forEach( function(option) {
option = trim(option);
if ( option !== '' ) {
option = option.split(':');
settings[option[0]] = trim(option[1]);
}
});
}
return settings;
};
// @todo Do something...
/**
* Initialize Plugin
* @public
* @param {Object} options User settings
*/
exports.init = function ( options ) {
// feature test
if ( !supports ) return;
// @todo Do something...
};
//
// Public APIs
//
return exports;
});
答案 1 :(得分:9)
我想说你想要一个JavaScript类。
var PluginName = function(selector){
// Constructor here
this.el = document.querySelector(selector);
}
PluginName.prototype.close = function(){
console.log(this.el);
}
PluginName.prototype.anotherMethod = function(){
console.log(this.el);
}
然后你可以这样做:
var dropdown = new PluginName('.dropdown');
dropdown.close();
dropdown.anotherMethod();
插件的一种常见做法是在构造函数中传递选项对象。这样您就可以优雅地参数化某些行为。例如:
var dropdown = new PluginName({el:'.dropdown',slideInterval:1000, effect:'fade'});
答案 2 :(得分:4)
查找javascript原型继承。
function PluginName(selector) {
this.node = document.querySelector(selector);
if (this.node == null) {
// whoops node not found! Handle Error
}
return this;
}
PluginName.prototype.close = function() {
this.var = "blah";
// do stuff
}
var myPlugin = new Plugin(".selector")
此网站还有很棒的javascript设计模式 - http://addyosmani.com/resources/essentialjsdesignpatterns/book/