资讯专栏INFORMATION COLUMN

自定义jquery插件

AnthonyHan / 2271人阅读

摘要:的编写并没有想象中的难,下面通过编写一个拥有属性和一些回调函数的简单插件介绍下如何编写。

在当前这个前端mv**框架盛行的年代,翻译这样一篇关于如何编写jquery插件的文章好像显得有点多余和那么的不接时代,不过还是自私点,努力翻译一把起码可以提高自己(<_>)。

jquery非常棒,它兼容性好,入门简单,让我们在处理终端交互的时候来的轻而易举,同时他还有非常庞大的插件库,几乎你能想到的功能都能找到对应的插件。

但是,我们的业务需求是千变万化的,万一我们需要的功能找不到或者说找不到非常合适的插件的时候,我们该怎么办?或者当项目渐渐庞大起来的时候,你想把通用的功能封装起来的时候,我们该怎么办(这个时候请你假装忘记:amd,cmd,es6module)?按照jquery的思路,这个时候就可以通过自定义插件来解决了。

jquery plugin的编写并没有想象中的难,下面通过编写一个拥有属性和一些回调函数的简单插件介绍下如何编写jquery plugin

创建文件目录
# 准备基本环境
mkdir jquery-plugin-sample
cd jquery-plugin-sample
mkdir src
cd src
echo "" > index.js
# 文件结构如下
.
├── LICENSE
├── src
│   └── index.js # 这文件就是用来编写插件具体内容
插件的代码结构
;(function($){
    $.fn.helloWorld = function(){
        //Future home of "Hello, World!"
    }
})(jQuery)

上面的代码干了3件事情

代码被封装在一个 (function(){}) self-enclosed 中,这样保证了内部变量不会和全局环境相互影响

我们将jQuery作为参数传递给了内部函数,这样做的目的是避免和其他库也声明了 $相互冲突

我们通过$.fn定义了我们的插件,并且命名为helloWorld

在插件中实线一些功能

在编写功能之前,先基于webpack构建一个本地调试环境 本地环境构建

// src/index.js
;(function($){
    $.fn.helloWorld = function(){
        this.each(function(){ //1
            $(this).text("Hello World")//2
        })
    }
})(jQuery);

上面的代码需要注意2个地方

1处的this代表就是jqueryDom 对象对象本身,因此不需要 $(this)来进行转换

2处的this由于遍历时候的回调中的this指向dom本身,因此需要$(this)转换为jquery对象

// 测试插件功能
// demo/demo.js
import $ from "jquery";
import "../src";

$(document).ready(()=>{
  // 找到页面的dom
  $(".demo-wrap li").helloWorld();
})

此时,对应的浏览器页面应该会出现如图一样的结果,OK,一个非常简单的插件构建完成,该插件的功能就是将选中的dom的text 替换为Hello World, 这个插件合格吗?

完善插件的功能

我们都知道jquery还有一个非常好的特性,就是api支持链式调用$("div").text("hell").addClass("red");那么我们自己写的插件是否满足这个特性呢?通过测试代码很明显,这个helloWorld插件不满足这个特性,因此不是一个合格的插件,需要稍微处理下才能满足

// 修改 src/index.js
;(function($){
    $.fn.helloWorld = function(){
        return this.each(function(){
            $(this).text("Hello World")
        })
    }
})(jQuery);

OK,到这里为止,一个jquery插件才算真正到完成。

扩展插件,让插件可以接收参数
;(function($){
    $.fn.helloWorld = function(customText){
        return this.each(function(){
            $(this).text(customText)
        })
    }
})(jQuery);

OK,现在可以将选中到dom到内容修改为你传入到任何东西了

终极插件

虽然上面我们扩展了插件,可以满足根据输入到内容修改匹配到dom的内容,但是如果需要样式呢?需要修改字体大小呢?需要添加回调函数呢?所以,参数必须是个对象的形式,Ok,立马修改代码

;(function($){
    $.fn.helloWorld = function(options){
        var settings = $.extend({
          text:"Hello World",
          color:null,
          fontStyle:null,
          complete:null
        },options)
        return this.each(function(){
            $(this).text(settings.text);
            if(settings.color){
              $(this).css( "color", settings.color );
            }
            if(settings.fontStyle){
              $(this).css( "font-style", settings.fontStyle );
            }
            if ( $.isFunction( settings.complete ) ) {
              settings.complete.call( this );
            }
        })
    }
})(jQuery);
// 测试代码 demo/demo.js
import $ from "jquery";
import "../src";
$(document).ready(()=>{
  // 找到页面的dom
  $(".demo-wrap li").helloWorld({
    color:"red",
    complete:()=>{
      console.log("sds")
    }
  }).addClass();
})
总结

灵活封装jquery插件,不但可以抽取公用代码同时可以很好的保证全局环境的干净。另外,这篇文字虽然是翻译的文字,不过demo是自己手写的,有需要的可以去github上下载 jquery-plugin-sample,也可以通过 npm install xxw-jquery-plugin-sample 来测试代码

本地环境构建
cd jquery-plugin-sample
npm init -y
yarn add webpack webpack-dev-server babel-core babel babel-preset-env html-webpack-plugin babel-loader -D
mkdir demo
cd demo
echo "" > index.ejs
echo "" > demo.js
# 文件结构如下
.
├── LICENSE
├── demo
│   ├── demo.js
│   └── index.ejs
├── package.json
├── readme.md
├── src
│   └── index.js
└── yarn.lock
// 编写webpack.config.js
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const babel_options ={
  presets:[
    ["env",{
      "targets": {
        "browsers": ["last 4 versions", "safari >= 7"]
      }
    }]
  ]
}
module.exports = {
  entry:"./demo/demo.js",
  output:{
    path:path.resolve(__dirname,"./dist"),
    filename:"index.js"
  },
  module:{
    rules:[
      // es6 语法解析
      {
        test:/.js$/,
        exclude: /(node_modules|bower_components)/,
        use:[
          {
            loader:"babel-loader",
            options:babel_options
          }
        ]
      }
    ]
  },
  plugins:[
    new HtmlWebpackPlugin({
      template:"./demo/index.ejs",
      filename:"index.html"
    })
  ],
  externals: {
    "jquery": "jQuery"
  },
  devServer: {
    host: "127.0.0.1",
    port: 3000
  }
};
// 编写ejs,添加jquery cdn
 

  
    
    test jquery pllugin
    
  
  

  
# 启动项目
yarn webpack-dev-server
Project is running at http://127.0.0.1:3000/
webpack output is served from /
Hash: 137d7a562cabec2c7996
Version: webpack 3.10.0
Time: 1053ms
     Asset       Size  Chunks                    Chunk Names
  index.js     324 kB       0  [emitted]  [big]  main
index.html  266 bytes          [emitted]

在浏览器中输入 http://127.0.0.1:3000/ 访问测试页面

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/90618.html

相关文章

  • 前端知识点总结——JQ

    摘要:前端知识点总结什么是第三方的极简化的操作的函数库第三方下载极简化是操作的终极简化个方面增删改查事件绑定动画效果操作学习还是在学,只不过简化了函数库中都是函数,用函数来解决一切问题为什么使用操作的终极简化解决了大部分浏览器兼容性问题凡是让用的 前端知识点总结——JQ 1.什么是jQuery: jQuery: 第三方的极简化的DOM操作的函数库 第三方: 下载 极简化: 是DOM操作的...

    jayzou 评论0 收藏0
  • jQuery插件开发

    摘要:所以要先了解一下插件的三种开发方式通过来扩展通过向添加新的方法通过应用的部件工厂方式创建第三种方法是用来开发更高级的部件的。 jQuery插件开发模式 说到jQuery插件的编写,起初我把它当做封装一个方法那样简单,这显然是错的,因为这让我一开始完全不知道如何下手去编写一个插件。所以要先了解一下jQuery插件的三种开发方式: 通过$.extend()来扩展jQuery 通过$.fn...

    wall2flower 评论0 收藏0
  • 手把手教你JQuery插件的写法和规范

    摘要:示例合并和,修改并返回。例如我们插件里面需要有个方法来检测用户调用插件时传入的参数是否符合规范。私有方法,检测参数是否合法调用调用调用者覆盖插件暴露的共公方法调用自定义高亮插件 本文实例讲述了jQuery插件编写步骤。分享给大家供大家参考,具体如下: 如今做web开发,jquery 几乎是必不可少的,就连vs神器在2010版本开始将Jquery 及ui 内置web项目里了。至于使用jq...

    Alex 评论0 收藏0
  • [转载]jQuery插件开发详细教程

    摘要:本教程可能不是最精品的,但一定是最细致的。插件开发下面我们就来看第二种方式的插件开发。然后我们的插件代码在这个方法里面展开。 要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统。这好比大公司们争相做平台一样,得平台者得天下。苹果,微软,谷歌等巨头,都有各自的平台及生态圈。 学会使用jQuery并不难,因为它简单易学,并且相信你接触...

    kevin 评论0 收藏0
  • jQuery Ajax应用与常用插件

    jQuery 实现Ajax应用 使用load()方法异步请求数据 使用load()方法通过Ajax请求加载服务器中的数据,并把返回的数据放置到指定的元素中,它的调用格式为: load(url,[data],[callback]) 参数url为加载服务器地址,可选项data参数为请求时发送的数据,callback参数为数据请求成功后,执行的回调函数 使用getJSON()方法异步加载JSON格式数...

    bingchen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<