关于 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. Linux Command Line 备忘

    1. 如果要删除目录, rmdir or rm -d 或许可以删除空目录,但是只有 rm -R 可以把目录以及其内容连带删除! 2. 查看文件大小: ls -l --block-size=G 还可以换 ...

  2. json数据的jquery操作和asp.net后台操作

    jquery操作 json对象创建 var item0={"a":"val1","b":"val2"}; json对象字 ...

  3. soapUI 在多个测试套件 testsuite 里,多个testcase里传值如何实现

        1.首先 要添加一个全局 自定义变量 Custom Properties   2.用transfer property 将取来的值 放入到变量 getToken 里   3.在另一个testc ...

  4. Android模仿QQ空间图片上传——原理

    MainActivity.class package com.example.imagedemotext; import java.io.ByteArrayOutputStream; import j ...

  5. UVa 814邮件传输代理的交互

    好吧,终于知道原来string有这么多用法,map可以通过vector来映射多个数 #include <iostream> #include <string> #include ...

  6. php使用redis存储

    一.Redis扩展模块 # wget https://codeload.github.com/phpredis/phpredis/zip/develop -O phpredis.zip # unzip ...

  7. HDU 1312 Red and Black --- 入门搜索 DFS解法

    HDU 1312 题目大意: 一个地图里面有三种元素,分别为"@",".","#",其中@为人的起始位置,"#"可以想象 ...

  8. 软件推荐 - Source Insight

    一直以来从事的开发工作,涉及的范围很杂,乱七八糟的都有,其中有一项占据了比较长的时间,那就是固件程序的开发,不涉及操作系统,也就是一般意义上大家所说的裸跑程序.​用过的芯片杂七杂八,比较主要的有Ate ...

  9. java.lang.OutOfMemoryError: unable to create new native thread如何解决

    工作中碰到过这个问题好几次了,觉得有必要总结一下,所以有了这篇文章,这篇文章分为三个部分:认识问题.分析问题.解决问题. 一.认识问题: 首先我们通过下面这个 测试程序 来认识这个问题:运行的环境 ( ...

  10. PHP-网页跳转的几种方式

    本文总结了跳转到指定网页的几种方式. 1.利用PHP的header函数Location响应头, header是用来向浏览器返回HTTP响应头(详细请看HTTP协议详解) <?php header ...