内容转载自 http://www.css88.com/archives/4821

扩展jQuery插件和方法的作用是非常强大的,它可以节省大量开发时间。这篇文章将概述jQuery插件开发的基本知识,最佳做法和常见的陷阱。

入门

编写一个jQuery插件开始于给jQuery.fn加入​​新的功能属性,此处添加的对象属性的名称就是你插件的名称

jQuery.fn.myPlugin = function(){

  //你自己的插件代码

};

用户非常喜欢的$符号哪里去了? 它仍然存在,但是,为了避免和其他JavaScript库冲突,我们最好将jQuery传递给一个自我执行的封闭程序,jQuery在此程序中映射为$符号,这样可以避免$号被其他库覆写。

(function ($) {
$.fn.m​​yPlugin = function () {
//你自己的插件代码
};
})(jQuery);

在这个封闭程序中,我们可以无限制的使用$符号来表示jQuery函数。

环境

现在,我们可以开始编写实际的插件代码。 但是,在这之前,我们必须得对插件所处的环境有个概念。 在插件的范围里, this关键字代表了这个插件将要执行的jQuery对象, 这里容易产生一个普遍的误区,因为在其他包含callback的jQuery函数中,this关键字代表了原生的DOM元素。这常常会导致开发者误将this关键字无谓的包在jQuery中,如下所示。

(function ($) {
$.fn.m​​yPlugin = function () { //此处没有必要将this包在$号中如$(this),因为this已经是一个jQuery对象。
//$(this)等同于 $($('#element')); this.fadeIn('normal', function () { //此处callback函数中this关键字代表一个DOM元素 }); };
})(jQuery); $('#element').myPlugin();

现在,我们理解了jQuery插件的基础知识,让我们写一个插件,做一些事情。

(function ($) {

    $.fn.m​​axHeight = function () {

        var max = 0;

        this.each(function () {
max = Math.max(max, $(this).height());
}); return max;
};
})(jQuery); var tallest = $('div').maxHeight(); //返回高度最大的div元素的高度

在公司的security project(Umbraco), Search功能使用了APIController, 然后写了一个JQuery 插件 Search来填充search result page

Search result page HTML 代码

@inherits Umbraco.Web.Mvc.UmbracoTemplatePage<SearchResults>
@{
Layout = "_InnerLayout.cshtml"; Html.RequiresJs("~/scripts/view.search.js", 2);
}
@Model.Content.LocalisedContent.Body <section id="searchListing" class="row search">
<div id="resultsArea" class="search-results"> <div id="NoResultsMessage" style="display:none;">
<p class="results-title">@Html.Raw(Umbraco.GetDictionaryValue("NoResultsFor")) '<strong class="search-term"></strong>'</p>
</div> <div id="HasResultsMessage" style="display:none;">
<p class="results-title">@Html.Raw(Umbraco.GetDictionaryValue("SearchResultsFor")) '<strong class="search-term"></strong>'</p>
</div> <div class="results" id="SearchResultsContainer">
<article class="row">
<a href="#">
<div>
<h2></h2>
<p></p> <p class="link">@Html.Raw(Umbraco.GetDictionaryValue("ReadMore")) ›</p>
</div>
</a>
</article>
</div> <ul class="pagination">
<li><a href="#" class="prev"><i class="gi icon-arrow"></i></a></li>
<li class="page"><a href="#"></a></li>
<li><a href="#" class="next"><i class="gi icon-arrow"></i></a></li>
</ul> </div>
</section>

用JQuery 写的插件Search 如下   (view.search.js)

(function ($) {
$.fn.Search = function (options) {
return this.each(function () {
var search = $(this); search.resultsArea = search.find("#resultsArea"); search.noResultsMessage = search.resultsArea.find("#NoResultsMessage");
search.hasResultsMessage = search.resultsArea.find("#HasResultsMessage");
search.resultsContainer = search.resultsArea.find("#SearchResultsContainer"); search.searchResultTemplate = search.resultsContainer.find("article").clone(); search.queryField = $("input[name='search']"); search.searchTermLabel = $(".search-term"); search.oldTerm = undefined;
search.term = search.queryField.val(); // Paging elements
search.paginationWrapper = search.resultsArea.find('ul.pagination');
search.pageTemplate = search.paginationWrapper.find('.page').clone();
search.pagePrevious = search.paginationWrapper.find('.prev');
search.pageNext = search.paginationWrapper.find('.next'); // Page tracking
search.pageSize = 5;
search.pageNumber = 1;
search.totalPages = 0; // Sets up pagination for search results.
search.paginate = function (data) {
/* PagedResults looks like this:
data {
items,
pageNumber,
pageSize,
totalItems,
totalPages
}
*/
search.totalPages = data.totalPages;
search.paginationWrapper.find('.page').remove();
if (search.totalPages > 1) {
search.pagePrevious.toggle(data.pageNumber > 1);
search.pageNext.toggle(data.pageNumber < search.totalPages); for (i = 1; i < search.totalPages + 1; i++) {
var page = search.pageTemplate.clone();
var link = page.find('a');
if (i == data.pageNumber)
page.addClass('active');
page.data('page', i);
link.text(i); search.pageNext.parent().before(page).before('\n\r');
} search.paginationWrapper.show(0);
} else {
search.paginationWrapper.hide(0);
}
} search.previous = function (evt) {
return search.goToPage(evt, search.pageNumber - 1);
} search.next = function (evt) {
return search.goToPage(evt, search.pageNumber + 1);
} search.goToPage = function (evt, pageNumber) {
search.pageNumber = pageNumber || $(this).data('page');
if (search.pageNumber > search.totalPages) search.pageNumber = search.totalPages - 1;
if (search.pageNumber < 1) search.pageNumber = 1; search.search();
return false;
} // filter change handler
search.handleQuery = function (evt) { search.term = $(this).val();
if (search.oldTerm != search.term) {
search.oldTerm = search.term;
search.search();
}
return false;
} search.search = function () {
search.resultsArea.addClass("loading"); $.ajax({
type: "GET",
url: "/umbraco/api/SearchApi/GetSearchResults/",
dataType: "json",
data: {
filter: search.term,
pageNumber: search.pageNumber,
pageSize: search.pageSize
},
success: function (data) {
search.searchTermLabel.text(search.term);
search.noResultsMessage.hide();
search.hasResultsMessage.hide();
search.paginate(data);
search.resultsContainer.empty(); if (!data.items || data.items.length == 0) {
search.noResultsMessage.show();
}
else {
// Binding search result to UI
for (var i = 0; i < data.items.length; i++) {
var result = data.items[i];
var resultTemplate = search.searchResultTemplate.clone(); _populateContent(result, resultTemplate); search.resultsContainer.append(resultTemplate);
}
search.hasResultsMessage.show();
}
},
complete: function () {
search.searchTermLabel.text(search.term);
search.resultsArea.removeClass("loading");
}
});
}; _populateContent = function (result, template) {
var titleElem = $(template.find("h2"));
var linkElem = $(template.find("a"));
linkElem.attr("href", result.url);
titleElem.html(result.title); template.find("p").first().html(result.content);
}; search.queryField.on("keyup", search.handleQuery); // Setup pagination triggers.
search.pagePrevious.on("click", search.previous);
search.pageNext.on("click", search.next); // Bind to all future page clicks.
search.paginationWrapper.on('click', 'li.page', search.goToPage); search.search();
});
}
}(jQuery)); $(function () {
$('section.search').Search();
});

 

JQuery学习使用笔记 -- JQuery插件开发的更多相关文章

  1. jQuery学习之二 jQuery选择器

    一.jQuery选择器是什么1.CSS选择器2.jQuery选择器 二.jQuery选择器的优势1.简洁的写法2.支持从CSS1到CSS3选择器3.完善的处理机制  传统js选择器假如要操作的元素不存 ...

  2. [2016-10-24]jQuery学习回顾笔记1.0

    一.如何把 jQuery 添加到网页 <script> 标签应该位于页面的 <head> 部分. <head> <script src="jquer ...

  3. jquery学习之笔记一

    jquery是继prototype后一个很好用的javascript库.jquery是一个轻量级的库,拥有强大的选择器,出色的DOM操作,可靠的事件处理,完善的兼容性和链式操作等功能. window. ...

  4. jQuery学习-什么是jquery? Js与jquery之间的关系 Jquery选择器

    1.  什么是jQuery以及学习的意义等 jQuery是一个js库 JS库是什么? 把常用的方法,进行封装,封装到一个单独的js文件当中,要用的时候直接调用. 学习jQuery主要学什么? 学习jQ ...

  5. jQuery学习一:jQuery中的ready和load事件

    //ready事件 $(document).ready(function(){ 代码........ }); //ready事件简写: $(function(){ 代码........ }); //l ...

  6. 【jQuery学习日记】jQuery实现滚动动画

    需要实现的效果 样式分析: 2个主要部分,头部的标题和导航部分,和主要的功能实现区域: 1.头部 <div id="header"> <h1>动漫视频< ...

  7. jQuery学习笔记之插件开发(4)

    jQuery学习笔记之插件开发(4) github源码地址 插件:了让原有功能的增强. 1.插件的种类(3种):局部.全局.选择器插件 1.1封装对象方法的插件 这种类型的插件是把一些常用或者重复使用 ...

  8. jquery学习笔记---jquery插件开发

    http://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html jquery插件开发:http://www.cnblogs.com/damonla ...

  9. jquery学习笔记-----插件开发的编写总结

    一.对jQuery对象的扩展 ;(function($){ $.fn.extend(  { fun1:abc,fun2:1bc … } ) })(jQuery) 这里采用立即执行模式,即不用调用也能执 ...

随机推荐

  1. tomcat web.xml 配置

    1<web-app> 2<error-page> 3<error-code>404</error-code> 4<location>/Not ...

  2. 对于oracle监听器的配置

    oracle 的 net configuration  assist中配置完第一项的监听程序配置(对应文件listener.ora)之后,还要重新配置下第三项本地网络服务名配置(对应文件tnsname ...

  3. 【转】零基础写Java知乎爬虫之进阶篇

    转自:脚本之家 说到爬虫,使用Java本身自带的URLConnection可以实现一些基本的抓取页面的功能,但是对于一些比较高级的功能,比如重定向的处理,HTML标记的去除,仅仅使用URLConnec ...

  4. HDU 4612 Warm up (边双连通分量+DP最长链)

    [题意]给定一个无向图,问在允许加一条边的情况下,最少的桥的个数 [思路]对图做一遍Tarjan找出桥,把双连通分量缩成一个点,这样原图就成了一棵树,树的每条边都是桥.然后在树中求最长链,这样在两端点 ...

  5. HDU 3746 Cyclic Nacklace 环形项链(KMP,循环节)

    题意: 给一个字符串,问:要补多少个字符才能让其出现循环?出现循环是指循环节与字符串长度不相等.比如abc要补多个变成abcabc.若已经循环,输出0. 思路: 根据最小循环节的公式,当len%(le ...

  6. POJ 3259 Wormholes 虫洞(负权最短路,负环)

    题意: 给一个混合图,求判断是否有负环的存在,若有,输出YES,否则NO.有重边. 思路: 这是spfa的功能范围.一个点入队列超过n次就是有负环了.因为是混合图,所以当你跑一次spfa时发现没有负环 ...

  7. 当前,思路+进展+idea+下一步要做的工作

    1.在phy+版本中,downweighting操作后,是如何计算相关系数的. 2.这里的算法的自适应,体现在哪里?3.在引入PCA之后,这里有一个维度的选择的过程,这个标准是如何定义的? 4.在NP ...

  8. JavaScript备忘录-原型

    function Person() { this.name = "fs"; } Person.prototype.sayHello = function () { return & ...

  9. UVa 11300 Spreading the Wealth 分金币

    圆桌旁坐着 n 个人,每个人都有一定数量的金币,金币总数能够被 n 整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值,比如 n = 4, ...

  10. 未能加载文件或程序集“Oracle.DataAccess, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"

    转载自原文 未能加载文件或程序集"Oracle.DataAccess, Version=2.112.1.0,..." 若本机的Oracle版本是32位系统,则在调用Oracle数据 ...