jQuery 插件开发

本文详细介绍了jQuery插件的三种开发模式:通过.extend()扩展静态方法、向$.fn添加新方法以及使用$.widget()创建部件。并通过具体示例展示了如何实现参数接收、面向对象插件开发及利用命名空间避免全局污染。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天被别人问懂不懂jQuery 自定义控件,没能答的上来,感觉自己有点low。所以今天百度下,马上把这块知识补上。
原文:
http://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html
https://www.cnblogs.com/dc10101/archive/2012/05/03/2481004.html

jQuery插件有三种开发模式:

1.通过 .extend()jQuery 符号调用,不需要选中DOM元素($(“example”).myfunction()).

例子:

$.extend({
sayHello:function(name){
     /*主要处理代码*/
  }
})
$.sayHello();
$.sayHello('do');

这个种方式用来定义一些辅助方法,或者用在定义一次然后在程序中多次调用的情况。

2.$.fn 向jQuery添加新的方法

第二张有点像jquery的长用风格,可以选中dom对象,插件函数全部作用到这个dom对象上。

基本格式:
$.fn.plugName = function(){
this.css('color','red');//this指向的是jquery选中的元素对象
this.each(function(){
 $(this).append(''+$(this).attr('href'));
})
}

支持链式调用:只需要函数最后返回这个jquery对象选中的对象(return this)。

链式结构比如:$("this").style().show(),为了不打破链式结构,style()函数最后返回的肯定是$('this'),才能让 $('this').show() 成立。

让插件接收参数
使用者可以不传递参数,插件里面会给出参数的默认值。

$.fn.myPlugin() = function(options){
    var defaults = {
     'color':'red',
     'fontSize':'12px'
 };
 var settings = $.extend({},defaults, options);// 合并参数到jquery里面,默认最后合并到第一个参数上
 return this.css({
 'color':settings.color,
 'fontSize':settings.fontSize
});// 等效于最后 return this
}

面向对象的插件开发

//定义Beautifier的构造函数
var Beautifier = function(ele, opt) {
    this.$element = ele,
    this.defaults = {
        'color': 'red',
        'fontSize': '12px',
        'textDecoration':'none'
    },
    this.options = $.extend({}, this.defaults, opt)
}
//定义Beautifier的方法
Beautifier.prototype = {
    beautify: function() {
        return this.$element.css({
            'color': this.options.color,
            'fontSize': this.options.fontSize,
            'textDecoration': this.options.textDecoration
        });
    }
}
//在插件中使用Beautifier对象
$.fn.myPlugin = function(options) {
    //创建Beautifier的实体
    var beautifier = new Beautifier(this, options);
    //调用其方法
    return beautifier.beautify();
}

命名空间
为了不污染全局命名空间,始终用自调函数包裹自己的代码。

(function() {
    //定义Beautifier的构造函数
    var Beautifier = function(ele, opt) {
        this.$element = ele,
        this.defaults = {
            'color': 'red',
            'fontSize': '12px',
            'textDecoration': 'none'
        },
        this.options = $.extend({}, this.defaults, opt)
    }
    //定义Beautifier的方法
    Beautifier.prototype = {
        beautify: function() {
            return this.$element.css({
                'color': this.options.color,
                'fontSize': this.options.fontSize,
                'textDecoration': this.options.textDecoration
            });
        }
    }
    //在插件中使用Beautifier对象
    $.fn.myPlugin = function(options) {
        //创建Beautifier的实体
        var beautifier = new Beautifier(this, options);
        //调用其方法
        return beautifier.beautify();
    }
})();

bug:当前面的函数没有用分号结束时会导致匿名函数报错。
解决方法:在匿名函数前面加分号。
将系统变量以参数形式传递到插件内部:

function($,window,document,undefined){})(jQuery,window,document);

3.$.widget() 应用jQuery UI的部件工厂方式创建
模板:

function ($){
          function foo () {}
          $.widget('命名空间.插件名',$.继承插件的命名空间.插件名,{/*snip*/});
   }(jQuery);

其中命名空间是可选的,要不要继承别的widget也是可选的。大头是后面snip的部分,这也是下文要讲的。 一般来说工具函数写在widget外面比较合适,但如果你想要这些工具函数被子类继承,则需要写在widget里面。卸载widget里面的,就有public和private之分。
在外调用private方法:

   var instance = $('<div>');
instance.mywidget('publicFunction'); // work
instance.mywidget('_privateFunction'); // silently fail
instance.data('mywidget')._privateFunction(); // work
$.mynamespace.mywidget.prototype._privateFunction(); // work

widget factiory 实现了一种单例模式,不允许在同一个j’Query 对象上多次实例化。
当调用$(xxx).widgetName()进行初始化的时候,会执行以下代码。

var instance = $.data( this,name );
if ( instance ){
    instance.option ( options || {} )._init();
} else {
    $.data( this, name,new object( options , this));
}

若调用$(XX).widgetName(‘destroy’)进行销毁的时候,执行以下代码
this.element
. unbind(“.”+this.widgetName)
.removeDate( this. widgetName);

完整例子:

$.widget( "custom.progressbar", {
    options: {
        value: 0
    },
    _create: function() {
        this.options.value = this._constrain(this.options.value);
        this.element.addClass( "progressbar" );
        this.refresh();
    },
    _setOption: function( key, value ) {
        if ( key === "value" ) {
            value = this._constrain( value );
        }
        this._super( key, value );
    },
    _setOptions: function( options ) {
        this._super( options );
        this.refresh();
    },
    refresh: function() {
        var progress = this.options.value + "%";
        this.element.text( progress );
        if ( this.options.value == 100 ) {
            this._trigger( "complete", null, { value: 100 } );
        }
    },
    _constrain: function( value ) {
        if ( value > 100 ) {
            value = 100;
        }
        if ( value < 0 ) {
            value = 0;
        }
        return value;
    },
    _destroy: function() {
        this.element
            .removeClass( "progressbar" )
            .text( "" );
    }
});

参考:
http://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html
https://www.cnblogs.com/dc10101/archive/2012/05/03/2481004.html
http://www.runoob.com/jqueryui/jqueryui-widget-extend.html

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 在 Linux 系统中,查找域名或主机名对应的 IP 地址是网络管理中的一项基础且关键任务,对于排查网络故障、调试网络问题以及监控网络服务是否正常运行等场景都非常重要。本文将介绍五种在 Linux 终端查询域名 IP 地址的方法。 首先,dig 命令(全称 Domain Information Groper)是一个功能强大的 DNS 查询工具,能够向 DNS 服务器发送查询请求并获取详细的响应信息。如果需要查询单个域名的 IP 地址,可以使用命令 dig 2daygeek.com +short 。此外,还可以通过编 bash 脚本,将包含域名的文本文件中的域名逐个读取,然后利用 dig 命令进行查询,从而实现批量查询域名 IP 地址的功能。 其次,host 命令是一个简单易用的 DNS 查询工具,主要用于将域名解析为 IP 地址。要获取某个域名的 IP 地址,直接使用 host 2daygeek.com 即可。如果只想显示 IP 地址部分,可以通过管道结合 grep 和 sed 命令来实现,例如:host 2daygeek.com | grep "has address" | sed s/has address/-/g 。 再者,nslookup 命令也是一种常用的 DNS 查询工具,它支持交互式查询 DNS 信息。通过 nslookup 2daygeek.com 可以查询域名的 IP 地址。若要以非交互式的方式只显示 IP 地址,可以使用命令 nslookup 2daygeek.com | awk /^Address:/ {print $2} 。 另外,fping 命令与传统的 ping 命令不同,它不会直接进行 DNS 查询,而是通过发送 ICMP Echo Request(pi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值