jQuery赋予了我们很强大的插件自定义的功能,可以作为我们的武器库,应用到所有的网页中,使用的语法比较有意思,下面是对它的一些探讨.

遵循以下的原则:

1 IIFE 创建一个jQuery的scope

(function($){}(jQuery))

2 namespace要唯一.

$.widget('custom.colorize')

  custom为命名空间,colorize为插件名

3 default options

options:{red:255,green:0,blue:0,change:null,random:null}

  三个属性(red,green,blue),两个方法(change,random)初始化

4 可扩展option,使用工厂方法会自动进行检测输入参数和扩展.比如

$('#div1').colorize({
green:128,
random:function(event, ui) {
return ui.green > 128;
}
})

  就会将option扩展为:

option = {
red:255,
green:128,
blue:0,
change:null,
random:function(event, ui) {
return ui.green > 128;
}
}

  本质使用的应该是 $.extend({},default,options) 方法

5 添加私有方法:

(function($){
$.widget("custom.colorize",{
options:{
red:255,
green:0,
blue:0,
change:null,
random:null
},
// constructor
_create:function() {
this.element
.addClass("custom-colorize");
this.changer = $('<button>',{text:'change','class':'custom-colorize-changer'})
.appendTo(this.element)
.button(); // 绑定点击事件在该button上
this._on(this.charger, {
click:"random"
});
this._refresh();
}, // 更新,render
_refresh: function() {
this.element.css('background-color',`rgb(${this.options.red},${this.options.green},${this.options.blue})`); // 触发回调函数change
this._trigger('change');
},
//销毁
_destroy: function() {
this.changer.remove();
this.element
.removeClass('custom-colorize')
.enableSelection()
.css('background-color', 'transparent');
},
// 设置,包含所有参数合并
_setOptions:function(){
this._superApply(arguments);
this._refresh();
},
// 设置,部分参数
_setOption:function(key,value){
if(/ref|green|blue/.test(key) && (value < 0 || value > 255)) {
return;
}
this._super(key,value);
}
});
}(jQuery))

6 公有方法,添加一个随机的方法

(function($){
$.widget("custom.colorize",{
//公有方法,可被colorize('random')访问
random:function(){
let color = {
red: Math.floor(Math.random() * 256),
green: Math.floor(Math.random() * 256),
blue: Math.floor(Math.random() * 256)
};
if (this._trigger("random",event,colors) !== false) {
this.option(colors);
}
}
});

  然后来看一下怎么使用这个插件:

// 初始化默认参数
$('#my-widget1').colorize(); // 初始化并带有参数
$('#my-widget2').colorize({
green: 128,
random: function(event, ui) {
return ui.green > 128;
}
}); // 点击enable或disable
$('#disable').on('click',function(){
if ($(':custom-colorize').colorize('option','disabled')) {
$(':custom-colorize').colorize('enable');
} else {
$(':custom-colorize').colorize('disable');
}
}); // 点击设置运行后参数
$('#grenn').on('click',function() {
$(':custom-colorize').colorize('option', {
red: 64,
green: 250,
blue: 8
});
});

值得注意的是:

1 内置的插件selector, 如果是使用的工厂方法创建的插件,可以使用$(':插件名称')来获取所有应用了该插件的所有实例(instance),

2 使用"enable"和"disable"作为参数来操作插件是否有效

3 random里的ui是jQuery UI对象,详情请参见 https://jqueryui.com/

代码来自jQuery官方文档:http://jqueryui.com/widget/

希望对你有所帮助!

jQuery中的自定义插件之----工厂方法(Factory Widget)的更多相关文章

  1. Jquery中each的三种遍历方法

    Jquery中each的三种遍历方法 $.post("urladdr", { "data" : "data" }, function(dat ...

  2. jquery中交替点击事件toggle方法的使用示例

    jquery中交替点击事件toggle方法中有两个参数,分别是要交替执行的事件.如果不传参默认是显示隐藏功能,下面有个不错的示例,感兴趣的朋友可以参考下 复制代码代码如下: $('#clickId‘) ...

  3. jquery中获取iframe的id的方法:

    jquery中获取iframe的id的方法: var frameId = window.frameElement && window.frameElement.id || ''; al ...

  4. jQuery中detach&&remove&&empty三种方法的区别

    jQuery中empty&&remove&&detach三种方法的区别 empty():移除指定元素内部的所有内容,但不包括它本身 remove():移除指定元素内部的 ...

  5. Spring 通过工厂方法(Factory Method)来配置bean

    Spring 通过工厂方法(Factory Method)来配置bean 在Spring的世界中, 我们通常会利用bean config file 或者 annotation注解方式来配置bean. ...

  6. 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)

    在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...

  7. jQuery命名空间和自定义插件的的多种方法

    jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jquery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级 ...

  8. jquery中隐藏div的几种方法

    //jQuery中的显示.隐藏方法 $("#id").show()://表示display:block,    $("#id").hide()://表示disp ...

  9. JQuery中serialize()、serializeArray()和param()方法示例介绍

    在项目中做form表单提交的时候,如果参数比较少,可以通过jquery一个个取得,但是当 form表参数很多的情况下,还是一一取得的话无疑是加大了工作量,那我们需要咱们获取到表单的所有参数呢,幸好,j ...

随机推荐

  1. 5、flask之信号和mateclass元类

    本篇导航: flask实例化参数 信号 metaclass元类解析 一.flask实例化参数 instance_path和instance_relative_config是配合来用的:这两个参数是用来 ...

  2. JAVAEE——BOS物流项目06:分页查询、分区导出Excel文件、定区添加、分页问题总结

    1 学习计划 1.分区组合条件分页查询 n 分区分页查询(没有过滤条件) n 分区分页查询(带有过滤条件) 2.分区导出 n 页面调整 n 使用POI将数据写到Excel文件 n 通过输出流进行文件下 ...

  3. 【Unity3D技术文档翻译】第1.3篇 创建 AssetBundles

    上一章:[Unity3D技术文档翻译]第1.2篇 为打包 AssetBundles 准备资产 本章原文所在章节:[Unity Manual]→[Working in Unity]→[Advanced ...

  4. java-redis集合数据操作示例(三)

    redis系列博文,redis连接管理类的代码请跳转查看<java-redis字符类数据操作示例(一)>. 一.集合类型缓存测试类 public class SetTest { /** * ...

  5. Egret学习笔记 (Egret打飞机-8.敌机和主角飞机发射子弹)

    经过前面几章的准备,我们差不多已经具备了一个基本的框架,这一章我们就开始添砖加瓦了. 敌机定时发射一个子弹,子弹的方向是从上到下,但是发射子弹的代码应该放在哪儿呢? 从面向对象编程的思想来说,子弹是敌 ...

  6. wpf 如何让控件左右移动

    通过DoubleAnimation可以让控件进行左右移动. <Canvas x:Name="canvas_Shape" HorizontalAlignment="S ...

  7. C++学习笔记第三天:类、虚函数、双冒号

    类 class Box { public: double length; // 盒子的长度 double breadth; // 盒子的宽度 double height; // 盒子的高度 }; 类成 ...

  8. 静态编译程序 依赖于 Qt 和 Opencv 静态库 会出现 jpeg jpg 图像格式保存崩溃的情况,这是什么原因?

    双方依赖的 jpeg 静态库源码版本冲突,重新静态编译库,都采用一致版本即可.

  9. 顺便说说webservice

    webservice这玩意框架也挺多的.就这玩意我知道cxf,axis2,jersey.通过jdk也能产生webservie.感觉这东西太多,有时间知道点就写点吧.先挖坑在此

  10. 极限学习机︱R语言快速深度学习进行回归预测

    本文转载于张聪的博客,链接:https://ask.hellobi.com/blog/zason/4543. 深度学习在过去几年,由于卷积神经网络的特征提取能力让这个算法又火了一下,其实在很多年以前早 ...