内容转载自 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. Codeforces Round #248 (Div. 2) C. Ryouko's Memory Note (vector 替换)

    题目链接 题意:给m个数字, 这些数字都不大于 n,  sum的值为相邻两个数字 差的绝对值.求这n个数字里把一个数字 用 其中另一个数字代替以后, 最小的sum值. 分析:刚开始以为两个for 最坏 ...

  2. Google发布SSLv3漏洞简要分析报告

    今天上午,Google发布了一份关于SSLv3漏洞的简要分析报告.根据Google的说法,该漏洞贯穿于所有的SSLv3版本中,利用该漏洞,黑客可以通过中间人攻击等类似的方式(只要劫持到的数据加密两端均 ...

  3. Java [leetcode 7] Reverse Integer

    问题描述: Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return -321 Ha ...

  4. uestc 1725 吴神数

    // 筛选法// 先求出 sqrt(1<<31)内的素数// 然后筛选出符合要求的数// 详情见代码注释// #pragma comment(linker, "/STACK:10 ...

  5. 《C++ Primer 4th》读书笔记 第8章-标准IO库

    原创文章,转载请注明出处:http://www.cnblogs.com/DayByDay/p/3936457.html

  6. Mybatis学习——一对多关联表查询

    1.实体类 public class Student { private int id; private String name; } public class Classes { private i ...

  7. source insight 的使用

    一,新建工程:project-->new project --> ok--> ok--> close 完成项目的添加 二,sourceInsight的使用 1.跳转到标识定义处 ...

  8. 强大的日志分析工具 -- NSLogger

    转:http://www.cnblogs.com/yingkong1987/p/3329945.html 强大的日志分析工具 -- NSLogger 源码:https://github.com/fpi ...

  9. [Everyday Mathematics]20150128

    求极限 $$\bex \lim_{x\to 0}\sex{\frac{e^x+e^{2x}+\cdots+e^{nx}}{n}}^\frac{1}{x}. \eex$$

  10. bzoj 1109 [POI2007]堆积木Klo(LIS)

    [题意] n个数的序列,删除一个数后序列左移,求最后满足i==a[i]的最大个数. [思路] 设最终得到a[i]==i的序列为s,则s应满足: i<j,a[i]<a[j],i-a[i]&l ...