老实说,我不知道如何缩短标题。
通过学习SlidesJS插件的源码,我学会了如何编写一个 jQuery插件。当我遇到新事物时,我只是问了我的好朋友谷歌,大多数时候都得到了满意的答案。不过老实说,我从来没有努力过。我所知道的$
是(可能)是一个简写的 jQuery 对象构造函数,$()
并且jQuery()
在包含 jQuery 的情况下也是一样的。
不过,最近,我试图了解 jQuery 背后的科学以及如何编写一个好的jQuery 插件。我遇到了一篇非常好的文章,其中作者列出了几个用于创建 jQuery 插件的模板。由于其余的太复杂了,我无法理解,我喜欢第一个:轻量级的开始。现在,这里是上述模板的代码。
/*!
* jQuery lightweight plugin boilerplate
* Original author: @ajpiano
* Further changes, comments: @addyosmani
* Licensed under the MIT license
*/
// the semi-colon before the function invocation is a safety
// net against concatenated scripts and/or other plugins
// that are not closed properly.
;(function ( $, window, document, undefined ) {
// undefined is used here as the undefined global
// variable in ECMAScript 3 and is mutable (i.e. it can
// be changed by someone else). undefined isn't really
// being passed in so we can ensure that its value is
// truly undefined. In ES5, undefined can no longer be
// modified.
// window and document are passed through as local
// variables rather than as globals, because this (slightly)
// quickens the resolution process and can be more
// efficiently minified (especially when both are
// regularly referenced in your plugin).
// Create the defaults once
var pluginName = 'defaultPluginName',
defaults = {
propertyName: "value"
};
// The actual plugin constructor
function Plugin( element, options ) {
this.element = element;
// jQuery has an extend method that merges the
// contents of two or more objects, storing the
// result in the first object. The first object
// is generally empty because we don't want to alter
// the default options for future instances of the plugin
this.options = $.extend( {}, defaults, options) ;
this._defaults = defaults;
this._name = pluginName;
this.init();
}
Plugin.prototype.init = function () {
// Place initialization logic here
// You already have access to the DOM element and
// the options via the instance, e.g. this.element
// and this.options
};
// A really lightweight plugin wrapper around the constructor,
// preventing against multiple instantiations
$.fn[pluginName] = function ( options ) {
return this.each(function () {
if (!$.data(this, 'plugin_' + pluginName)) {
$.data(this, 'plugin_' + pluginName,
new Plugin( this, options ));
}
});
}
})( jQuery, window, document );
我已将评论包括在内,以便在我的问题中引用它们。
我有一个粗略的想法,为什么window
并且document
已经包含在包装插件的匿名函数的参数中(我不知道还能调用什么),因为它在评论中给出了它有点缩短了执行时间。但这是如何工作的?包装插件的上述匿名函数的任何参数都会传递到哪里?这些在插件中是如何解决的?
通常,我会这样做$(window).resize(function(){})
,但在这种情况下不起作用。如果我console.log(window)
在插件函数内部执行,它会显示“未定义”。
这让我想到了另一个问题:什么是未定义的?它不是分配给未在范围内定义的对象的数据类型吗?它如何作为参数传递?论点不是必须是对象吗?评论里写了几行关于这个,但我一个字都看不懂:<所以我们可以确保它的值是真正的未定义> whaaa?
总结一下:
- 究竟是什么意思
function($)
? - 为什么我应该包含
window
,document
和undefined
作为 的参数function($)
? - 如果我这样做,我如何访问实际
window
和document
对象? undefined
什么,为什么?
请对我放轻松。我从来没有为了编写应用程序的明确目的而将编程语言作为一门学科。我学习了基本的 C 语言,用于为微型核心微控制器编写面向硬件的低级例程,仅此而已。我确实广泛地学习了 C++ 和一点点 Java。只是为了让你知道会发生什么。