JQuery学习使用笔记 -- JQuery插件开发
内容转载自 http://www.css88.com/archives/4821
扩展jQuery插件和方法的作用是非常强大的,它可以节省大量开发时间。这篇文章将概述jQuery插件开发的基本知识,最佳做法和常见的陷阱。
入门
编写一个jQuery插件开始于给jQuery.fn加入新的功能属性,此处添加的对象属性的名称就是你插件的名称
jQuery.fn.myPlugin = function(){
//你自己的插件代码
};
用户非常喜欢的$符号哪里去了? 它仍然存在,但是,为了避免和其他JavaScript库冲突,我们最好将jQuery传递给一个自我执行的封闭程序,jQuery在此程序中映射为$符号,这样可以避免$号被其他库覆写。
(function ($) {
$.fn.myPlugin = function () {
//你自己的插件代码
};
})(jQuery);
在这个封闭程序中,我们可以无限制的使用$符号来表示jQuery函数。
环境
现在,我们可以开始编写实际的插件代码。 但是,在这之前,我们必须得对插件所处的环境有个概念。 在插件的范围里, this关键字代表了这个插件将要执行的jQuery对象, 这里容易产生一个普遍的误区,因为在其他包含callback的jQuery函数中,this关键字代表了原生的DOM元素。这常常会导致开发者误将this关键字无谓的包在jQuery中,如下所示。
(function ($) {
$.fn.myPlugin = function () {
//此处没有必要将this包在$号中如$(this),因为this已经是一个jQuery对象。
//$(this)等同于 $($('#element'));
this.fadeIn('normal', function () {
//此处callback函数中this关键字代表一个DOM元素
});
};
})(jQuery);
$('#element').myPlugin();
现在,我们理解了jQuery插件的基础知识,让我们写一个插件,做一些事情。
(function ($) {
$.fn.maxHeight = 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插件开发的更多相关文章
- jQuery学习之二 jQuery选择器
一.jQuery选择器是什么1.CSS选择器2.jQuery选择器 二.jQuery选择器的优势1.简洁的写法2.支持从CSS1到CSS3选择器3.完善的处理机制 传统js选择器假如要操作的元素不存 ...
- [2016-10-24]jQuery学习回顾笔记1.0
一.如何把 jQuery 添加到网页 <script> 标签应该位于页面的 <head> 部分. <head> <script src="jquer ...
- jquery学习之笔记一
jquery是继prototype后一个很好用的javascript库.jquery是一个轻量级的库,拥有强大的选择器,出色的DOM操作,可靠的事件处理,完善的兼容性和链式操作等功能. window. ...
- jQuery学习-什么是jquery? Js与jquery之间的关系 Jquery选择器
1. 什么是jQuery以及学习的意义等 jQuery是一个js库 JS库是什么? 把常用的方法,进行封装,封装到一个单独的js文件当中,要用的时候直接调用. 学习jQuery主要学什么? 学习jQ ...
- jQuery学习一:jQuery中的ready和load事件
//ready事件 $(document).ready(function(){ 代码........ }); //ready事件简写: $(function(){ 代码........ }); //l ...
- 【jQuery学习日记】jQuery实现滚动动画
需要实现的效果 样式分析: 2个主要部分,头部的标题和导航部分,和主要的功能实现区域: 1.头部 <div id="header"> <h1>动漫视频< ...
- jQuery学习笔记之插件开发(4)
jQuery学习笔记之插件开发(4) github源码地址 插件:了让原有功能的增强. 1.插件的种类(3种):局部.全局.选择器插件 1.1封装对象方法的插件 这种类型的插件是把一些常用或者重复使用 ...
- jquery学习笔记---jquery插件开发
http://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html jquery插件开发:http://www.cnblogs.com/damonla ...
- jquery学习笔记-----插件开发的编写总结
一.对jQuery对象的扩展 ;(function($){ $.fn.extend( { fun1:abc,fun2:1bc … } ) })(jQuery) 这里采用立即执行模式,即不用调用也能执 ...
随机推荐
- svn is already under version control问题解决
svn ci 时出现 xx is already under version control,然后无法提交,出现这个问题的原因是你所提交的文件或目录是其他SVN的东西,即下面有.svn的目录,需要先把 ...
- POJ2135 最小费用最大流模板题
练练最小费用最大流 此外此题也是一经典图论题 题意:找出两条从s到t的不同的路径,距离最短. 要注意:这里是无向边,要变成两条有向边 #include <cstdio> #include ...
- iphone 如何清空UIWebView的缓存
iphonecachingapplicationcookiescacheperformance I actually think it may retain cached information ...
- 完整cocos2d-x编译Andriod应用过程
作者:何卫 转载请注明,原文链接:http://www.cnblogs.com/hewei2012/p/3366969.html 其他平台移植:http://cocos2d.cocoachina.co ...
- 05day2
05day1 没什么可说,一道模拟水题,两道裸的模板题.05day2 是几天以来最难的一次. 圆排列 动态规划 [问题描述] 有 N 个人顺时针围在一圆桌上开会,他们对身高很敏感. 因此决定想使得 ...
- 四、oracle基本sql语句和函数详解
一.oracle常用数据类型 一. 数据定义语言(ddl) 数据定义语言ddl(data definition language)用于改变数据库结构,包括创建.更改和删除数据库对象. 用于操纵表结构 ...
- Oracle中将小数转换成字符丢零.截取小数.除数为零解决法
如下所示,前面少个0 SQL>select money from users where username ='LEI'; money --------- .3256 解决方法: SQL> ...
- 屏蔽页面js报的错误
有时候,某些js的错误,确实没有什么大影响,但是这个又实在没办法. 一般,下下策采取 <script language="javascript"> function k ...
- Android Message和obtainMessage的区别
类概述 定义一个包含任意类型的描述数据对象,此对象可以发送给Handler.对象包含两个额外的int字段和一个额外的对象字段,这样可以使得在很多情况下不用做分配工作. 尽管Message的构造器是公开 ...
- 通过js检测到iframe,使父窗口重定向到index -----------???----------------------
通过js检测到iframe,使父窗口重定向到index -----------???---------------------- 如果本身已将在iframe中,那么重定向的页面应该直接添加到父级ifr ...