关于 JavaScript & jQuery 的插件开发

 

  最近在温故 JavaScript 的面向对象,于是乎再次翻开了《JavaScript高级程序设计》第3版,了解到其中常见的设计模式,以前刚出道时遗留下来的困惑和不解,同时也茅塞顿开豁然开朗了,每一次翻阅每一次都有新的认识。

  之前写过 jQuery 插件,其实其中原理也很简单,不过我在想原生 JavaScript 插件的我应该要怎么写?网上的教程略显复杂,我自己理解来说就是把一些属性跟方法封装起来可以随时复用吧。

  不知道用 构造函数+原型模式 来封装一个函数(类)然后随时调用,把它当作一个插件(这个想法我也不知道正不正确,因为很少用原生 JS 写插件),在接口传参达到复用目的。(如果这种想法有错误,恳请大神们严厉指正)

好了,直接上码:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>JavaScript 简单选项卡插件</title>
<style>
.tabbox input {
background-color: #FFF;
}
.tabbox input.active {
background-color: #000;
color: #FFF;
}
.tabbox div {
display: none;
width: 200px; height: 200px;
background-color: #CCC;
}
</style>
</head>
<body>
<section id="tabBox1" class="tabbox">
<input class="active" type="button" value="tab1" />
<input type="button" value="tab2" />
<input type="button" value="tab3" />
<div style="display:block;">tab-cont1</div>
<div>tab-cont2</div>
<div>tab-cont3</div>
</section>
<br>
<section id="tabBox2" class="tabbox">
<input class="active" type="button" value="tab1" />
<input type="button" value="tab2" />
<input type="button" value="tab3" />
<div style="display:block;">tab-cont1</div>
<div>tab-cont2</div>
<div>tab-cont3</div>
</section>
<script>
window.onload = function () {
new Tabs("tabBox1");
new Tabs("tabBox2");
};
var Tabs = function(ID) {
var _this = this;
var oDiv = document.getElementById(ID);
this.aBtn = oDiv.getElementsByTagName("input");
this.aDiv = oDiv.getElementsByTagName("div");
for(var i = 0; i < this.aBtn.length; i++) {
this.aBtn[i].index = i;
this.aBtn[i].onclick = function() {
_this.fnClick(this);
};
}
};
Tabs.prototype.fnClick = function(oBtn) {
for(var i = 0; i < this.aBtn.length; i++) {
this.aBtn[i].className = ''
this.aDiv[i].style.display = "none";
}
oBtn.className = "active";
this.aDiv[oBtn.index].style.display = "block";
}
</script>
</body>
</html>

刚出道的我看过一本书 《锋利的jQuery》第2版在这本书里面了解到了 jQuery 插件开发,首先在开发之前先简单了解一下它的特点:

1. 使用闭包

(function($) {
// Code goes here
})(jQuery);

可能我们有时候会见到这种写法

;(function($) {
// Code goes here
})(jQuery);

在最前面多了一个 ; 分号,这是因为我们开发插件一般都会用前端自动化工程打包发布版本,会压缩和合并一些代码,加上  分号是为了避免代码压缩和与其它代码合并混淆时候出现报错,所以就加了一个  分号与前面代码分隔出来,各自执行不干扰。

这是 jQuery 官方的插件开发规范要求,使用这种编写方式有什么好处呢?

  1. 避免全局依赖;
  2. 避免第三方破坏;
  3. 兼容 jQuery 操作符 '$ ' 和 'jQuery '。

对于这种写法不理解?没关系,我们换个写法,其实它等同于:

var jq = function($) {
// Code goes here
};
jq(jQuery);

这样写清楚了吧?

2. 扩展
jQuery 提供了 2 个供用户扩展的 ‘基类’  $.extend 和 $.fn.extend;
$.extend 用于扩展自身方法,如 $.ajax , $.getJSON 等, $.fn.extend 则是用于扩展 jQuery 类,包括方法和对 jQuery 对象的操作。为了保持 jQuery 的完整性,我比较趋向于使用 $.fn.extend 进行插件开发而尽量少使用$.extend;

3. 选择器
jQuery 提供了功能强大,并兼容多种 css 版本的选择器,不过发现很多同学在使用选择器时并未注重效率的问题。

  1. 尽量使用Id选择器,jQuery的选择器使用的 API 都是基于 getElementById 或 getElementsByTagName,因此可以知道 效率最高的是 Id 选择器,因为 jQuery 会直接调用 getElementById 去获取 dom,而通过样式选择器获取 jQuery 对象时往往会使用 getElementsByTagName 去获取然后筛选;
  2. 样式选择器应该尽量明确指定 tagName, 如果开发人员使用样式选择器来获取 dom,且这些 dom 属于同一类型,例如获取所有 className 为 jquery 的 div,那么我们应该使用的写法是 $("div.jquery") 而不是 $(".jquery"),这样写的好处非常明显,在获取 dom 时 jQuery 会获取 div 然后进行筛选,而不是获取所有 dom 再筛选;
  3. 避免迭代,很多同学在使用 jQuery 获取指定上下文中的 dom 时喜欢使用迭代方式,如 $(".jquery .child"),获取 className 为j query 的 dom 下的所有 className为 child 的节点,其实这样编写代码付出的代价是非常大 的,jQuery 会不断的进行深层遍历来获取需要的元素,即使确实需要,我们也应该使用诸如 $(selector,context), $('selector1>selector2'), $(selector1).children(selector2), $(selctor1).find(selector2) 之类的方式。

让我们看看其中的基础框架:

//为避免冲突,将我们的方法用一个匿名方法包裹起来
;(function($) {
//扩展这个方法到jQuery
$.fn.extend({
//插件名字
pluginname: function() {
//遍历匹配元素的集合
return this.each(function() {
//在这里编写相应代码进行处理
});
}
});
//传递jQuery到方法中,这样我们可以使用任何JavaScript中的变量来代替"$"
})(jQuery);

根据上面的代码,我来写一个简单的 jQuery 插件:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>jQuery 简单选项卡插件</title>
<style>
.tabbox input {
background-color: #FFF;
}
.tabbox input.active {
background-color: #000 !important;
color: #FFF !important;
}
.tabbox div {
display: none;
width: 200px; height: 200px;
}
</style>
</head>
<body>
<section id="tabBox1" class="tabbox">
<input class="active" type="button" value="tab1" />
<input type="button" value="tab2" />
<input type="button" value="tab3" />
<div style="display:block;">tab-cont1</div>
<div>tab-cont2</div>
<div>tab-cont3</div>
</section>
<br>
<section id="tabBox2" class="tabbox">
<input class="active" type="button" value="tab1" />
<input type="button" value="tab2" />
<input type="button" value="tab3" />
<div style="display:block;">tab-cont1</div>
<div>tab-cont2</div>
<div>tab-cont3</div>
</section>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script src="js/jQuery.tabBox.js"></script>
</body>
</html>

jQuery.tabBox.js

;(function($) {
$.fn.extend({
//插件名称 - Tabs
Tabs: function (options) {
//参数和默认值
var defaults = {
tabMenuColor: "#FFF", //选项卡按钮的背景颜色
tabBoxColor: "#CCC", //选项卡内容区的背景颜色
currentActive: 'active' //选项卡按钮选中样式(class名称)
};
var options = $.extend(defaults, options);
return this.each(function () {
var o = options;
//获得当前对象(最外层(父层)为看作一个整体对象,用它操作其内部的dom元素)
var obj = $(this);
//得到obj中的input对象
var aMenus = $("input", obj);
//得到obj中的div对象
var aBoxs = $("div", obj);
//为按钮绑定切换方法
aMenus.on("click",function() {
var mthis = $(this);
var currIndex = mthis.index();
mthis.addClass(o.currentActive).siblings().removeClass(o.currentActive);
aBoxs.hide().eq(currIndex).show();
});
//改变切换卡样式
aMenus.css("backgroundColor",o.tabMenuColor);
aBoxs.css("backgroundColor",o.tabBoxColor);
});
}
});
})(jQuery);

使用插件:

$(function() {
//使用默认参数
$("#tabBox1").Tabs();
//使用自定义参数
$("#tabBox2").Tabs({
tabMenuColor: "#940",
tabBoxColor: "#360"
});
});

好了,该码上都码了,写的比较仓促,后面会慢慢的优化这篇文章,若有低级问题恳请大神们严厉指正。

关于jquery插件 入门的更多相关文章

  1. jQuery插件入门

    一:导言 有些WEB开发者,会引用一个JQuery类库,然后在网页上写一写("#"),("#"),("."),写了几年就对别人说非常熟悉JQ ...

  2. jQuery 插件入门

    先看http://www.cnblogs.com/lideng/p/3605551.html http://www.cnblogs.com/xcj26/p/3345556.html (非常细致  很多 ...

  3. 从零开始学习jQuery (一) 入门篇

    本系列文章导航 从零开始学习jQuery (一) 入门篇 一.摘要 本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案,  即使你会使用jQuery也能在阅读中发现些 ...

  4. jQuery插件:跨浏览器复制jQuery-zclip

    jQuery-zclip是一个复制内容到剪贴板的jQuery插件,使用它我们不用考虑不同浏览器和浏览器版本之间的兼容问题.jQuery-zclip插件需要Flash的支持,使用时记得安装Adobe F ...

  5. jQuery插件开发入门

    扩展jQuery插件和方法的作用是非常强大的,它可以节省大量开发时间.这篇文章将概述jQuery插件开发的基本知识,最佳做法和常见的陷阱. 入门 编写一个jQuery插件开始于给jQuery.fn加入 ...

  6. jQuery的入门与简介

    jQuery的入门与简介<思维导图>   <初学者请各位高手指点指点> jQuery是继Prototype之后又一个优秀的JavaScript库,在JavaScript基础上我 ...

  7. jQuery UI 入门之实用实例分享

    jQuery UI 入门 jQuery UI 简介 jQuery UI 是一个建立在 jQuery JavaScript 库上的小部件和交互库,您可以使用它创建高度交互的 Web 应用程序.无论您是创 ...

  8. jQuery UI 入门之实用实例

    jQuery UI 入门 jQuery UI 简介 jQuery UI 是一个建立在 jQuery JavaScript 库上的小部件和交互库,您可以使用它创建高度交互的 Web 应用程序.无论您是创 ...

  9. python 全栈开发,Day58(bootstrap组件,bootstrap JavaScript 插件,后台模板,图表插件,jQuery插件库,Animate.css,swiper,运行vue项目)

    一.bootstrap组件 无数可复用的组件,包括字体图标.下拉菜单.导航.警告框.弹出框等更多功能. 组件和插件的区别? 插件:一个功能,比如js文件 组件:html css js 组件包含插件 面 ...

随机推荐

  1. mapreduce入门之wordcount注释详解

    mapreduce版本:0.2.0之前 说明: 该注释为之前学习时找到的一篇,现在只是在入门以后对该注释做了一些修正以及添加. 由于版本问题,该代码并没有在集群环境中运行,只将其做为理解mapredu ...

  2. 对UIWebView的学习

    建工程,建一个类WebViewController 继承于UIViewController WebViewController设置为根视图控制器 WebViewController遵守UIWebVie ...

  3. SAP采购订单屏幕增强

    转自<http://blog.csdn.net/heng0757/article/details/8073875> 为采购订单增加一个页标签,在其中放入客户自定义字段, 1. CMOD 增 ...

  4. int除以int 得到double类型值

    double serviceability =(double)(count1+count2)/sum; 需要进行强转 除数 这样得到的值就是double类型了

  5. 原生js获取鼠标坐标方法全面讲解:clientX/Y,pageX/Y,offsetX/Y,layerX/Y,screenX/Y【转】

    关于js鼠标事件综合各大浏览器能获取到坐标的属性总共以下五种 event.clientX/Y event.pageX/Y event.offsetX/Y event.layerX/Y event.sc ...

  6. UVA 11997 STL 优先队列

    题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  7. HDU 2096 小明A+B --- 水题

    HDU 2096 /* HDU 2096 小明A+B --- 水题 */ #include <cstdio> int main() { #ifdef _LOCAL freopen(&quo ...

  8. 利用Web服务器网络打洞

    好了有些标题党了.这里想说的是:某些网络,除了http 80服务,其它端口的服务都被限制了,这个时候可以用http web服务器来进行代理转发. 以Apache为例,支持ssh登录到其它服务器的配置如 ...

  9. C中的基本数据类型和变量

    C语言中的数据类型 基本数据类型 1) 整型 (int   %d) 2) 字符型 (char  %c) 3) 浮点型 %d ①. 单精度浮点型(float) ②. 双精度浮点型(double) 2.指 ...

  10. 越狱Season 1-Episode 10: Sleight of Hand

    Season 1, Episode 10: Sleight of Hand -John: Bellick. Bellick What's going on? 这里发生什么了 -Berwick: Tha ...