内容转载自 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. MySQL学习笔记一

    MySQL 学习笔记 一 一.数据库简单介绍 1. 按照数据库的发展时间顺序,主要出现了以下类型数据库系统: Ø 网状型数据库 Ø 层次型数据库 Ø 关系型数据库 Ø 面向对象数据库 上面4中数据库系 ...

  2. servlet应用具体实例

    web,xml应用文件 1.<filter>参数 <filter> <filter-name>encodingFilter</filter-name> ...

  3. HDU 4923

    题目大意: 给出一串序列Ai{0,1},求一个序列Bi[0,1](Bi<Bi+1),使得sigama(Ai-Bi)^2最小 思路: 若B相同,则取A的平均数可使方差最小 若B有序,   若A== ...

  4. CSS效果

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs& ...

  5. js spin 加载动画(loading)

    js spin 加载动画 最近做页面ajax加载是又用到loading动画,还好有一个spin.js 具体的包大家可以去http://fgnass.github.com/spin.js/下载, 如果想 ...

  6. 给Java新手的一些建议----Java知识点归纳(Java基础部分)

    写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,希望可以给 ...

  7. 【转】android Apk打包过程概述_android是如何打包apk的

    最近看了老罗分析android资源管理和apk打包流程的博客,参考其他一些资料,做了一下整理,脱离繁琐的打包细节和数据结构,从整体上概述了apk打包的整个流程.   流程概述: 1.打包资源文件,生成 ...

  8. link 参数

    -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possi ...

  9. [Papers]NSE, $u_3$, Lebesgue space [NNP, QM, 2002; Zhou, JMPA, 2005]

    $$\bex u_3\in L^p(0,T;L^q(\bbR^3)),\quad \frac{2}{p}+\frac{3}{q}=\frac{1}{2},\quad 6< q\leq \inft ...

  10. [Everyday Mathematics]20150104

    设 $a>0$, $$\bex x_1=1,\quad x_{n+1}=x_n+an\prod_{i=1}^n x_i^{-\frac{1}{n}}. \eex$$ 试证: $$\bex \vl ...