在园子里有很多关于jQuery插件的文章,尤其 以下2篇文章:

不定义JQuery插件,不要说会JQuery

jQuery插件开发精品教程,让你的jQuery提升一个台阶

这2位大神基础讲的很清楚,在这里就不多说了,主要那个小需求来练练:

需求说明一个标题插件,可以通过后端取数,自定义标题,自定义样式

讨论:插件通常不都是加载一下就不操作了,比如表格插件,加载数据,刷新等等。

今天练习的控件就简单给大家理理写控件的思路,(有问题,有意见大家指出。)

; (function ($) {
$.fn.cyTitle = function (options) {
//一些操作
return new cyTitle(options);
}
function cyTitle(Options) {
//这里定义插件属性
$.extend(this, Options);
this.init(Options);
}
cyTitle.prototype = {
init: function () {
//这里构建插件内容
}
}
})(jQuery)

每个插件都应该包含以上部分,这个就不多说了(上面2为大神的文章说的很清楚),从实际编写出发。 (demo)

点击加载控件列出标题(未定义标题),点击刷新更改标题(ajax取数)。

下面一步步看代码:

(本来请求txt的结果发现博客园不能上传和请求,放着runjs上也只能是js文件了。。。)

    <div style="border: 1px dotted #888; width: 300px; height: 100px;">
<input type="button" class="cyTitleCore" title="load" value="加载控件" />
&nbsp;
<input type="button" class="cyTitleCore" title="ref" value="刷新" />
<div id="div1cyTitle"></div>
</div>
<script type="text/javascript">
$(function () {
$(".cyTitleCore").click(function () {
core[$(this).attr("title")]();
})
var core = {
load: function () {
this.list = $("#div1cyTitle").cyTitle({
background: "#888"
});
},
ref: function () {
//这里直接调用插件的ref方法来刷新取数
if (this.list) {
this.list.ondatabind = function (that, e) {
e.url = "Service.js"; //指定取数的url
e.params = { //指定取数的参数
"id": (+new Date())
};
}
this.list.ref();
}
}
}
})
</script>

上面是加载控件和刷新的调用;

首先点击加载按钮可以看到是调用了插件cyTitle,并且指定背景色。先不看刷新,来看看插件到底怎么写的!

    $.fn.cyTitle = function (options) {
options = options || {};
var domEl = this.get(0); //获得绑定元素的dom对象
if (!domEl) throw "未找到绑定元素!";
if (domEl["cyTitle"]) { //这里如果调用元素的dom对象上有这个控件就直接返回 (避免了在同一个元素上多次调用出BUG)
return domEl["cyTitle"];
}
options.el = domEl; //这里在构建插件的时候直接用this.el就能访问元素的dom对象 return new cyTitle(options);
}
    function cyTitle(Options) {
//这里定义插件属性
$.extend(this, Options);
this.ajaxType = "get";
this.el.cyTitle = this; //把控件放着dom元素的cyTitle属性上
this.ondatabind = null; //ajax取数的绑定方法
this.init(Options);
}
cyTitle.prototype = {
init: function () {
this.load(); //加载控件
},
load: function () {
$(this.el).append("<h1>" + (this.text || "未知") + "</h1>"); //如果指定了Options.text就显示指定的内容
this.ref(); //调用ajax取数(类似与表格插件第一次加载)
},
ref: function () {
this.bgCss();
var e = {
url: null
};
this.doEvt("ondatabind", e); //这里调用前面定义的取数方法的内容(url, params)
//依次类推我们可以写绑定前(在绑定方法前面调用),绑定后(执行异步后调用) 等等
if (e.url) {
var my = this;
$[this.ajaxType](e.url, e.params, function (res) {
if (res) {
$(my.el).find("h1").text(res);
}
},'html');
}
},
doEvt: function (name, p) {
if (this[name]) {
this[name](this, p);
}
return this;
},
bgCss: function () {
$(this.el).css("background", this.background);
}
};

以上就是整个插件的内容,

优点:

  1. 在用一个元素上绑定n次都不会出现错误。
  2. 可以自定义取数,从新加载数据。
  3. 可以在原型上扩张,自己需要的功能。

用一个demo练习编写插件,才知道其中的乐趣,先说到这里。谢谢

实在忙,最近搞了个girhub.io博客写了个滚动条插件。有兴趣的可以看看内涵demo

如何用正确的姿势编写jQuery插件的更多相关文章

  1. 编写jQuery插件--实现返回顶部插件

    国庆过去一周多了,作为IT界的具有严重’工作狂‘性质的宅人,居然还没走出玩耍的心情,拖了程序猿的脚后跟了.最近工作不顺,心情不佳,想吐槽下公司,想了还是厚道点,以彼之道还施彼身,觉得自己也和他们同流合 ...

  2. 编写jQuery插件(一)——插件约定及插件中的闭包

    编写插件的目的是给已经有的一系列方法或函数做一个封装,以便在其他地方重复使用,提高开发效率和方便后期维护. 在编写jQuery插件的时候,我们一般会遵循一些约定: jQuery插件推荐命名为:jque ...

  3. 自己编写jQuery插件之表单验证

    自己编写jQuery插件之表单验证 吐个嘈先:最近状态不咋滴,真是什么都不想干,不想上班,做什么都没动力,觉得没意思.不想这样,不想这样,快让这种情绪消失吧,忽忽.... 表单验证在项目中用的还是比较 ...

  4. 自己编写jQuery插件之Tab切换

    自己编写jQuery插件之 Tabs切换 jquery ui 带有Tabs切换插件,但其css样式太难维护,引用的东西太多,因此就自己写了个. 起初我Html代码架子是这样的: <div cla ...

  5. 编写jQuery插件的方法和注意点

    编写jQuery插件的方法和注意点 插件的种类 jQuery的插件主要分为3种类型. 1. 封装对象方法的插件 这种插件是将对象方法封装起来,用于对通过选择器获取的jQuery对象进行操作,是最常见的 ...

  6. 如何编写JQuery 插件详解

    转载自:http://blog.sina.com.cn/s/blog_6154bf970101jam7.html 如今做web开发,jquery 几乎是必不可少的,就连vs神器在2010版本开始将Jq ...

  7. 如何编写jQuery插件

    要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样,得平台者得天下.苹果,微软,谷歌等巨头,都有各自的平台及生态圈 ...

  8. 编写jQuery 插件

    编写jQuery Plugin,要设置默认值,并允许用户修改默认值,或者运行是传入其他值. 最终,我们得出编写一个jQuery插件的原则: 给$.fn绑定函数,实现插件的代码逻辑: 插件函数最后要 r ...

  9. 编写jquery插件的分享

    一.类级别($.extend) 类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(...),相当于静态方法. 开发扩展其方法时使用$.extend方法,即jQuery.extend(o ...

随机推荐

  1. Hadoop基础-Apache Avro串行化的与反串行化

    Hadoop基础-Apache Avro串行化的与反串行化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Apache Avro简介 1>.Apache Avro的来源 ...

  2. Codeforces 877 D. Olya and Energy Drinks

    http://codeforces.com/contest/877/problem/D   D. Olya and Energy Drinks time limit per test 2 second ...

  3. node的“宏任务(macro-task)”和“微任务(micro-task)”机制

    macrotask 和 microtask 表示异步任务的两种分类.在挂起任务时,JS 引擎会将所有任务按照类别分到这两个队列中,首先在 macrotask 的队列(这个队列也被叫做 task que ...

  4. 说明你javascript写的很烂的5个问题

    Javascript在互联网上名声很臭,但你又很难再找到一个像它这样如此动态.如此被广泛使用.如此根植于我们的生活中的另外一种语言.它的低学习门槛让很多人都称它为学前脚本语言,它另外一个让人嘲笑的东西 ...

  5. python初步学习-python 模块之 json

    json 模块 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写.一般API返回的数据大多是 JSON.XML,如果返回JSON的话,将获取 ...

  6. [转]QVector与QByteArray——Qt的写时复制(copy on write)技术

    我们在之前的博文QVector的内存分配策略与再谈QVector与std::vector——使用装饰者让std::vector支持连续赋值中简单聊了聊QVector内存分配和赋值方面的一点东西,今天接 ...

  7. node.js、git、bootstrap等安装配置

    纯记录 一,安装node.js 1 官方网址 http://nodejs.org/  点击install 下载node-v0.10.22-x86.msi 2 安装,修改安装目录到d盘,一路next,无 ...

  8. 【bzoj题解】2186 莎拉公主的困惑

    题目传送门. 题意:求\([1,n!]\)中与\(m!\)互质的数的个数,对质数\(R\)取模,\(n\geq m\). 答案应该等于\(\frac{n!}{m!}\phi(m!)=\frac{n!} ...

  9. Flip Bits

    Determine the number of bits required to flip if you want to convert integer n to integer m. Notice ...

  10. USB设备被识别流程【转】

    转自:http://blog.csdn.net/myarrow/article/details/8286876 USB模块包括usb core,host,hub,device驱动,其中hub会启动一个 ...