How to Create a Basic Plugin

Sometimes you want to make a piece of functionality available throughout your code.

For example, perhaps you want a single method you can call on a jQuery selection that performs a series of operations on the selection.

In this case, you may want to write a plugin.

link How jQuery Works 101: jQuery Object Methods

Before we write our own plugins, we must first understand a little about how jQuery works. Take a look at this code:

$( "a" ).css( "color", "red" );

This is some pretty basic jQuery code, but do you know what's happening behind the scenes?

Whenever you use the $ function to select elements, it returns a jQuery object.

This object contains all of the methods you've been using (.css(), .click(), etc.) and all of the elements that fit your selector.

The jQuery object gets these methods from the $.fn object.

This object contains all of the jQuery object methods, and if we want to write our own methods, it will need to contain those as well.

Basic Plugin Authoring

Let's say we want to create a plugin that makes text within a set of retrieved elements green.

All we have to do is add a function called greenify to $.fn and it will be available just like any other jQuery object method.

$.fn.greenify = function() {
this.css( "color", "green" );
}; $( "a" ).greenify(); // Makes all the links green.

Notice that to use .css(), another method, we use this, not $( this ).

This is because our greenify function is a part of the same object as .css().

Chaining

This works, but there are a couple of things we need to do for our plugin to survive in the real world.

One of jQuery's features is chaining, when you link five or six actions onto one selector.

This is accomplished by having all jQuery object methods return the original jQuery object again (there are a few exceptions: .width() called without parameters returns the width of the selected element, and is not chainable).

Making our plugin method chainable takes one line of code:

通过return this来实现链式调用

$.fn.greenify = function() {
this.css( "color", "green" );
return this;
} $( "a" ).greenify().addClass( "greenified" );

Protecting the $ Alias and Adding Scope

The $ variable is very popular among JavaScript libraries, and if you're using another library with jQuery, you will have to make jQuery not use the $ with jQuery.noConflict().

However, this will break our plugin since it is written with the assumption that $ is an alias to the jQuery function.

To work well with other plugins, and still use the jQuery $ alias, we need to put all of our code inside of an Immediately Invoked Function Expression, and then pass the function jQuery, and name the parameter $:

因为不同的插件可能依赖的jQuery版本不同,所以写自己的插件的时候,把jQuery作为参数进行传递【这里还涉及到了iife的概念】

(function ( $ ) {

    $.fn.greenify = function() {
this.css( "color", "green" );
return this;
}; }( jQuery ));

In addition, the primary purpose of an Immediately Invoked Function is to allow us to have our own private variables.

Pretend we want a different color green, and we want to store it in a variable.

iife可以允许我们使用自己的私有变量

(function ( $ ) {

    var shade = "#556b2f";

    $.fn.greenify = function() {
this.css( "color", shade );
return this;
}; }( jQuery ));

Minimizing Plugin Footprint

It's good practice when writing plugins to only take up one slot within $.fn.

This reduces both the chance that your plugin will be overridden, and the chance that your plugin will override other plugins.

In other words, this is bad:

坏的示例

(function( $ ) {

    $.fn.openPopup = function() {
// Open popup code.
}; $.fn.closePopup = function() {
// Close popup code.
}; }( jQuery ));

It would be much better to have one slot, and use parameters to control what action that one slot performs.

确保一个入口

(function( $ ) {

    $.fn.popup = function( action ) {

        if ( action === "open") {
// Open popup code.
} if ( action === "close" ) {
// Close popup code.
} }; }( jQuery ));

Using the each() Method

Your typical jQuery object will contain references to any number of DOM elements, and that's why jQuery objects are often referred to as collections.

If you want to do any manipulating with specific elements (e.g. getting a data attribute, calculating specific positions) then you need to use .each() to loop through the elements.

$.fn.myNewPlugin = function() {

    return this.each(function() {
// Do something to each element here.
}); };

Notice that we return the results of .each() instead of returning this.

Since .each() is already chainable, it returns this, which we then return.

This is a better way to maintain chainability than what we've been doing so far.

Accepting Options

As your plugins get more and more complex, it's a good idea to make your plugin customizable by accepting options.

The easiest way to do this, especially if there are lots of options, is with an object literal.

Let's change our greenify plugin to accept some options.

(function ( $ ) {

    $.fn.greenify = function( options ) {

        // This is the easiest way to have default options.
var settings = $.extend({
// These are the defaults.
color: "#556b2f",
backgroundColor: "white"
}, options ); // Greenify the collection based on the settings variable.
return this.css({
color: settings.color,
backgroundColor: settings.backgroundColor
}); }; }( jQuery ));

Example usage:

$( "div" ).greenify({
color: "orange"
});

The default value for color of #556b2f gets overridden by $.extend() to be orange.

这里涉及到了extend的使用,第一个参数是target object,第二个参数是要被合并到target的object。 数组的话,通过key value进行匹配,相同的key的value会被第二个参数里的数值进行覆盖。

Putting It Together

Here's an example of a small plugin using some of the techniques we've discussed:

(function( $ ) {

    $.fn.showLinkLocation = function() {

        this.filter( "a" ).each(function() {
var link = $( this );
link.append( " (" + link.attr( "href" ) + ")" );
}); return this; }; }( jQuery )); // Usage example:
$( "a" ).showLinkLocation();

This handy plugin goes through all anchors in the collection and appends the href attribute in parentheses.

<!-- Before plugin is called: -->
<a href="page.html">Foo</a> <!-- After plugin is called: -->
<a href="page.html">Foo (page.html)</a>

Our plugin can be optimized though:

(function( $ ) {

    $.fn.showLinkLocation = function() {

        this.filter( "a" ).append(function() {
return " (" + this.href + ")";
}); return this; }; }( jQuery ));

We're using the .append() method's capability to accept a callback, and the return value of that callback will determine what is appended to each element in the collection.

Notice also that we're not using the .attr() method to retrieve the href attribute, because the native DOM API gives us easy access with the aptly named href property.

How to Create a Basic Plugin 如何写一个基础的jQuery插件的更多相关文章

  1. 大前端工程化之写一个简单的webpack插件

    今天写一个简单的webpack插件,来学习一下webpack插件 webpack插件机制可以使开发者在webpack构建过程中加入自己的行为,来针对自己项目中的一些需求做一些定制化 首先我们得知道一个 ...

  2. IDEA Plugin,写一个看股票指数和K线的插件

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 没招了,不写点刺激的,你总是不好好看! 以前,我不懂.写的技术就是技术内容,写的场景 ...

  3. How to Create a Basic Plugin

    Sometimes you want to make a piece of functionality available throughout your code. For example, per ...

  4. jquery ----> How to Create a Basic Plugin (翻译)

    http://learn.jquery.com/plugins/basic-plugin-creation/ 如何创建一个基本的插件 有时候你想在整个代码中提供一些功能. 例如,也许你想要一个单一的方 ...

  5. jQuery-How to Create a Basic Plugin

    官方插件:http://learn.jquery.com/plugins/basic-plugin-creation/ $.extend方法和$.fn.extend方法都可以用来扩展jQuery功能. ...

  6. 写一个简单的JQ插件(例子)

    虽然现在 vue angular react 当道啊但是那 JQ还是有一席之地很多很多的小单位啊.其实还会用到 我也放一个例子吧虽然我也不是很肯定有没有人写的比我更好啊但是我相信 我这个还是蛮实用的 ...

  7. 写一个vue的滚动条插件

    组件源码如下: vue-scroll.vue <template> <div class="vue-scroll" ref="vueScrollW&qu ...

  8. 写一个限制上传文件大小和格式的jQuery插件

    在客户端上传文件,通常需要限制文件的尺寸和格式,最常用的做法是使用某款插件,一些成熟的插件的确界面好看,且功能强大,但美中不足的是:有时候会碰到浏览器兼容问题.本篇就来写一个"原生态&quo ...

  9. 案例实战之如何写一个webpack plugin

    案例实战之如何写一个webpack plugin 1.写一个生成打包文件目录的file.md文件 // 生成一个目录项目目录的文件夹 class FileListPlugin { constructo ...

随机推荐

  1. linux:用户和组文件解释(/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow)

    一.用户文件:/etc/passwd [root@pinfun6 ~]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash 1 2 3 4 5 6 7 | ...

  2. Jade学习(一)之特性、安装

    前言 流行的模板 PHP:Smarty SimpleTemplate Xtemplate Savant Java:Velocity FreeMarker Jbyte C#:Dotiquid Sharp ...

  3. wex5 windowDialog组件

    windowDialog组件可以实现页面跳转 xid:windowDialog src:$UI/lohas/detailedknowledge.w 父页:myknowledge.w Model.pro ...

  4. 使用Servlet实现验证码

    没有验证码带来的问题 对特定用户不断登录破解密码. 对某个网站创建账户. 对某个网站提交垃圾数据. 对某个网站刷票.  通过验证码由用户肉眼识别其中的验证码信息,从而区分用户是人还是计算机. 定义: ...

  5. js 学习二 字符串常用方法

    1.字符串长度 string.length var browserType = 'mozilla'; browserType.length; //7 2在字符串中查找子字符串 string.index ...

  6. shell脚本之删除内容相同的重复文件

    #!/bin/bash #!当前文件夹下,删除内容相同的重复文件,只保留重复文件中的一个. ls -lS --time-style=long-iso | awk 'BEGIN{ getline;get ...

  7. 转载:PHP编程规范

    PHP-FIG 在说啥是PSR-[0-4]规范的之前,我觉得我们有必要说下它的发明者和规范者:PHP-FIG,它的网站是:www.php-fig.org.就是这个联盟组织发明和创造了PSR-[0-4] ...

  8. Wasserstein Generative Adversarial Nets (WGAN ) and CGAN

    GAN目前是机器学习中非常受欢迎的研究方向.主要包括有两种类型的研究,一种是将GAN用于有趣的问题,另一种是试图增加GAN的模型稳定性. 事实上,稳定性在GAN训练中是非常重要的.起初的GAN模型在训 ...

  9. CentOS7 配置阿里云yum源,非常之简单

    1.进入yum的文件夹 命令:cd   /etc/yum.repos.d/ 2.下载wget 命令:yum -y install wget 命令:yum install bash-completion ...

  10. VM10 不能安装VMware tools的解决方法

    当安装VMware tools,提示"正在进行简易安装时,无法手动启动VMware TOOLS安装",把CD-ROM设置成自动检测就可以了.