1.请问如何写JQuery插件
一、类级别($.extend)
类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(。),相当于静态方法。
开发扩展其方法时使用$.extend方法,即jQuery.extend(object);
二、对象级别
对象级别则可以理解为基于对象的拓展,如$("#table").changeColor(。); 这里这个changeColor呢,就是基于对象的拓展了。
开发扩展其方法时使用$.fn.extend方法,即jQuery.fn.extend(object);
三、jQuery插件开发过程
1、定义作用域:为插件定义私有作用域,外部代码不能直接访问插件内部的代码,插件内部的代码不污染全局变量、
2、为jQuery扩展一个插件:为jQuery的实例添加一个宽展方法。该宽展方法可以接收一些参数。
3、设置默认值:为扩展方法设置默认值,一般会将默认属性对象定义为defaults。使用$.extend(defaults,options)将默认值和传入的参数进行合并。
4、支持jQuery的连接调用:循环把每个元素返回。
5、插件里的方法:为了使代码结构化可视化,需要用到function。在插件里的方法不能被外界调用。
6、自定义回调函数:使用call和apply方法执行回调函数。
2.如何编写jquery插件
编写插件的目的是给已经有的一系列方法或函数做一个封装,以便在其他地方重复使用,提高开发效率和方便后期维护。
本文将详细介绍如何编写jQuery插件类型jQuery的插件主要分为3种类型1、封装对象方法这种插件是将对象方法封装起来,用于对通过选择器获取的jQuery对象进行操作,是最常见的一种插件。此类插件可以发挥出jQuery选择器的强大优势,有相当一部分的jQuery的方法,都是在jQuery脚本库内部通过这种形式“插”在内核上的,例如:parent()方法、appendTo()方法等。
这些方法在现在来看都是jQuery本身自带的方法了。平时,我们是可以直接拿来就用的,只需引入jQuery库就行2、封装全局函数可以将独立的函数加到jQuery命名空间下,如常用的jQuery.ajax()、去首尾空格的jQuery.trim()方法等,都是jQuery内部作为全局函数的插件附加到内核上去的3、选择器插件虽然jQuery的选择器十分强大,但是在少数情况下,还是会需要用到选择器插件来扩充一些自己喜欢的选择器要点1、jQuery插件的文件名推荐命名为jQuery.[插件名].js,以免和其他JS库插件混淆2、所有的对象方法都应当附加到jQuery.fn对象上,而所有的全局函数都应当附加到jQuery对象本身上3、在插件内部的this指向的是当前通过选择器获取的jQuery对象,而不像一般方法那样,如click,内部的this指向的是DOM元素4、可以通过this.each来遍历所有的元素5、所有的方法或函数插件,都应当以分号结尾。
否则压缩的时候可能出现问题。为了稳妥些,甚至可以在插件头部先加上一个分号,以免他人不规范的代码影响自身的插件代码6、插件应该返回一个jQuery对象,以保证插件的可链式操作7、避免在插件内部使用$作为jQuery对象的别名,而应使用完整的jQuery来表示,避免冲突。
当然,也可以利用闭包来回避这种问题,使插件内部继续使用$作为jQuery的别名闭包利用闭包的特性,即可以避免内部临时变量影响全局空间,又可以在插件内容继续使用$作为jQuery的别名。常见的jQuery插件都是以下这种形式的:(function(){/*这里放置代码*/})();首先定义一个匿名函数function(){/*这里放置代码*/},然后用括号括起来,变成(function(){/*这里放置代码*/})这种形式,最后通过()这个运算符来执行。
可以传递参数进行,以供内部函数使用//为了更好的兼容性,开始前有个分号;(function($){ //此处将$作为匿名函数的形参/*这里放置代码,可以使用$作为jQuery的缩写别名*/})(jQuery); //这里就将jQuery作为实参传递给匿名函数了上面的代码是一种常见的jQuery插件的结构插件机制jQuery提供了两个用于拓展jQuery功能的方法,即jQuery.fn.extend()方法和jQuery.extend()方法。jQuery.fn.extend()方法用于拓展封装对象方法的插件,jQuery.extend()方法用于拓展封装全局函数的插件和选择器插件。
这两个方法都接受一个参数,类型为Object。Object对象的"名/值对"分别代表"函数或方法名/函数主体"【jQuery.fn.extend()】jQuery.fn.extend()方法用于将一个对象的内容合并到jQuery的原型,以提供新的jQuery实例方法【jQuery.extend()】jQuery.extend()方法用一个或多个其他对象来扩展一个对象,然后返回被扩展的对象jQuery.extend( target [, object1 ] [, objectN ] )例如,合并settings对象和options对象,修改并返回settings对象var settings = {validate:false,limit:5,name:"foo"};var options = {validate:true,name:"bar"};var newOptions = jQuery.extend(settings,options);console.log(newOptions);//Object {validate: true, limit: 5, name: "bar"}jQuery.extend()方法经常被用于设置插件方法的一系列默认参数function foo(options){options=jQuery.extend({name:"bar",length:5,dataType:"xml"},options);如果用户调用foo()方法的时候,在传递的参数options对象设置了相应的值,那么就使用设置的值,否则使用默认值通过使用jQuery.extend()方法,可以很方便地用传入的参数来覆盖默认值。
此时,对方法的调用依旧保持一致,只不过要传入的是一个映射而不是一个参数列表。这种机制比传统的每个参数都去检测的方式不仅灵活而且更加简洁。
此外使用命名参数意味着再添加新选项也不会影响过去编写的代码,从而使开发者使用起来更加直观明了。
3.如何写一个jquery 插件
jquery插件开发模式jquery插件一般有三种开发方式:通过$.extend()来扩展jQuery通过$.fn 向jQuery添加新的方法通过$.widget()应用jQuery UI的部件工厂方式创建第一种$.extend()相对简单,一般很少能够独立开发复杂插件,第三种是一种高级的开发模式,本文也不做介绍。
第二种则是一般插件开发用到的方式,本文着重讲讲第二种。插件开发第二种插件开发方式一般是如下定义$.fn.pluginName = function() { //your code here}插件开发,我们一般运用面向对象的思维方式例如定义一个对象var Haorooms= function(el, opt) { this.$element = el, this.defaults = { 'color': 'red', 'fontSize': '12px', 'textDecoration':'none' }, this.options = $.extend({}, this.defaults, opt)}//定义haorooms的方法haorooms.prototype = { changecss: function() { return this.$element.css({ 'color': this.options.color, 'fontSize': this.options.fontSize, 'textDecoration': this.options.textDecoration }); }}$.extend({}, this.defaults, opt)有{}主要是为了创建一个新对象,保留对象的默认值。
$.fn.myPlugin = function(options) { //创建haorooms的实体 var haorooms= new Haorooms(this, options); //调用其方法 return Haorooms.changecss();}调用这个插件直接如下就可以$(function() { $('a').myPlugin({ 'color': '#2C9929', 'fontSize': '20px' });})上述开发方法的问题上面的开发方法存在一个严重的问题,就是定义了一个全局的Haorooms,这样对于插件的兼容等等各个方面都不好。万一别的地方用到了Haorooms,那么你的代码就悲催了!现在我们把上面的代码包装起来,用一个自调用匿名函数(有时又叫块级作用域或者私有作用域)包裹,就不会出现这个问题了!包括js插件的开发,也是一样的,我们用一个自调用匿名函数把自己写的代码包裹起来,就可以了!包裹方法如下:(function(){})()用上面的这个包裹起来,就可以了。
但是还有一个问题,当我们研究大牛的代码的时候,前面经常看到有“;”,那是为了避免代码合并等不必要的错误。例如,我们随便定义一个函数:var haoroomsblog=function(){}(function(){ })()由于haoroomsblog这个函数后面没有加分号,导致代码出错,为了避免这类情况的发生,通常这么写!;(function(){ })()把你的插件代码包裹在上面里面,就是一个简单的插件了。
(注js插件和jquery插件都是如此)还有一个问题把你的插件包裹在;(function(){ })()基本上可以说是完美了。但是为了让你开发的插件应用更加广泛,兼容性更加好,还要考虑到用插件的人的一些特殊的做法,例如,有些朋友为了避免jquery和zeptojs冲突,将jquery的前缀“$”,修改为“jQuery”,还有些朋友将默认的document等方法修改。
为了让你的插件在这些东西修了了的情况下照常运行,那么我们的做法是,把代码包裹在如下里面:;(function($,window,document,undefined){ //我们的代码。
})(jQuery,window,document);就可以避免上面的一些情况了!至此,你开发的插件就算完美了。
4.如何写jquery插件
jQuery 如何写插件 -jQuery插件的开发包括两种:一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法。
jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级别的插件开发,即给jQuery对象添加方法。下面就两种函数的开发做详细的说明。
1、类级别的插件开发类级别的插件开发最直接的理解就是给jQuery类添加类方法,可以理解为添加静态方法。典型的例子就是$.AJAX()这个函数,将函数定义于jQuery的命名空间中。
关于类级别的插件开发可以采用如下几种形式进行扩展:1.1 添加一个新的全局函数添加一个全局函数,我们只需如下定义:jQuery.foo = function() { alert('This is a test. This is only a test.'); }; 1.2 增加多个全局函数添加多个全局函数,可采用如下定义:Java代码 收藏代码jQuery.foo = function() { alert('This is a test. This is only a test.'); }; jQuery.bar = function(param) { alert('This function takes a parameter, which is "' + param + '".'); }; 调用时和一个函数的一样的:jQuery.foo();jQuery.bar();或者$.foo();$.bar('bar');1.3 使用jQuery.extend(object); jQuery.extend({ foo: function() { alert('This is a test. This is only a test.'); }, bar: function(param) { alert('This function takes a parameter, which is "' + param +'".'); } }); 1.4 使用命名空间虽然在jQuery命名空间中,我们禁止使用了大量的javaScript函数名和变量名。但是仍然不可避免某些函数或变量名将于其他jQuery插件冲突,因此我们习惯将一些方法封装到另一个自定义的命名空间。
jQuery.myPlugin = { foo:function() { alert('This is a test. This is only a test.'); }, bar:function(param) { alert('This function takes a parameter, which is "' + param + '".'); } }; 采用命名空间的函数仍然是全局函数,调用时采用的方法: $.myPlugin.foo(); $.myPlugin.bar('baz');通过这个技巧(使用独立的插件名),我们可以避免命名空间内函数的冲突。2、对象级别的插件开发对象级别的插件开发需要如下的两种形式:、形式1: (function($){ $.fn.extend({ pluginName:function(opt,callback){ // Our plugin implementation code goes here. } }) })(jQuery); 形式2:(function($) { $.fn.pluginName = function() { // Our plugin implementation code goes here. }; })(jQuery); 上面定义了一个jQuery函数,形参是$,函数定义完成之后,把jQuery这个实参传递进去.立即调用执行。
这样的好处是,我们在写jQuery插件时,也可以使用$这个别名,而不会与prototype引起冲突.2.1 在JQuery名称空间下申明一个名字这是一个单一插件的脚本。如果你的脚本中包含多个插件,或者互逆的插件(例如: $.fn.doSomething() 和 $.fn.undoSomething()),那么你需要声明多个函数名字。
但是,通常当我们编写一个插件时,力求仅使用一个名字来包含它的所有内容。我们的示例插件命名为“highlight“ $.fn.hilight = function() { // Our plugin implementation code goes here. }; 我们的插件通过这样被调用: $('#myDiv').hilight(); 但是如果我们需要分解我们的实现代码为多个函数该怎么办?有很多原因:设计上的需要;这样做更容易或更易读的实现;而且这样更符合面向对象。
这真是一个麻烦事,把功能实现分解成多个函数而不增加多余的命名空间。出于认识到和利用函数是javascript中最基本的类对象,我们可以这样做。
就像其他对象一样,函数可以被指定为属性。因此我们已经声明“hilight”为jQuery的属性对象,任何其他的属性或者函数我们需要暴露出来的,都可以在"hilight" 函数中被声明属性。
稍后继续。2.2 接受options参数以控制插件的行为让我们为我们的插件添加功能指定前景色和背景色的功能。
我们也许会让选项像一个options对象传递给插件函数。例如: // plugin definition $.fn.hilight = function(options) { var defaults = { foreground: 'red', background: 'yellow' }; // Extend our default options with those provided. var opts = $.extend(defaults, options); // Our plugin implementation code goes here. }; 我们的插件可以这样被调用:$('#myDiv').hilight({ foreground: 'blue' });2.3 暴露插件的默认设置我们应该对上面代码的一种改进是暴露插件的默认设置。
这对于让插件的使用者更容易用较少的代码覆盖和修改插件。接下来我们开始利用函数对象。
// plugin definition $.fn.hilight = function(options) { // Extend our default options with those provided. // Note that the first arg to extend is an empty object - // this is to keep from overriding our "defaults" object. var opts = $.extend({}, $.fn.hilight.defaults, options); // Our plugin implementation code goes here. }; // plugin defaults - added as a property on our plugin function $.fn.hilight.defaults = { foreground: 'red', background: 'yellow' }; 现在使用者可以包含像这样的一行在他们的脚本里://这个只需要调用一次,且不一定要在ready块中调用$.fn.hilight.defaults.foreground = 'blue'; 接下来我们可以像这样使用插件的方法,结果它设置蓝色的前景色:$('#myDiv').hilight(); 如你所见,我们允许使用。
5.jQuery怎么编写插件呢
jQuery插件的开发包括两种:一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法。
jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级别的插件开发,即给jQuery对象添加方法。下面就两种函数的开发做详细的说明。
1、类级别的插件开发类级别的插件开发最直接的理解就是给jQuery类添加类方法,可以理解为添加静态方法。典型的例子就是$.AJAX()这个函数,将函数定义于jQuery的命名空间中。
关于类级别的插件开发可以采用如下几种形式进行扩展:1.1 添加一个新的全局函数添加一个全局函数,我们只需如下定义:Java代码 jQuery.foo = function() { alert('This is a test. This is only a test.'); }; 1.2 增加多个全局函数添加多个全局函数,可采用如下定义:Java代码 jQuery.foo = function() { alert('This is a test. This is only a test.'); }; jQuery.bar = function(param) { alert('This function takes a parameter, which is "' + param + '".'); }; 调用时和一个函数的一样的:jQuery.foo();jQuery.bar();或者$.foo();$.bar('bar'); 1.3 使用jQuery.extend(object);Java代码 jQuery.extend({ foo: function() { alert('This is a test. This is only a test.'); }, bar: function(param) { alert('This function takes a parameter, which is "' + param +'".'); } }); 1.4 使用命名空间虽然在jQuery命名空间中,我们禁止使用了大量的javaScript函数名和变量名。但是仍然不可避免某些函数或变量名将于其他jQuery插件冲突,因此我们习惯将一些方法封装到另一个自定义的命名空间。
Java代码 jQuery.myPlugin = { foo:function() { alert('This is a test. This is only a test.'); }, bar:function(param) { alert('This function takes a parameter, which is "' + param + '".'); } }; 采用命名空间的函数仍然是全局函数,调用时采用的方法: $.myPlugin.foo(); $.myPlugin.bar('baz'); 通过这个技巧(使用独立的插件名),我们可以避免命名空间内函数的冲突。2、对象级别的插件开发对象级别的插件开发需要如下的两种形式:、形式1: Java代码 (function($){ $.fn.extend({ pluginName:function(opt,callback){ // Our plugin implementation code goes here. } }) })(jQuery); 形式2:Java代码 (function($) { $.fn.pluginName = function() { // Our plugin implementation code goes here. }; })(jQuery); 上面定义了一个jQuery函数,形参是$,函数定义完成之后,把jQuery这个实参传递进去.立即调用执行。
这样的好处是,我们在写jQuery插件时,也可以使用$这个别名,而不会与prototype引起冲突.2.1 在JQuery名称空间下申明一个名字这是一个单一插件的脚本。如果你的脚本中包含多个插件,或者互逆的插件(例如: $.fn.doSomething() 和$.fn.undoSomething()),那么你需要声明多个函数名字。
但是,通常当我们编写一个插件时,力求仅使用一个名字来包含它的所有内容。我们的示例插件命名为“highlight“ Java代码 $.fn.hilight = function() { // Our plugin implementation code goes here. }; 我们的插件通过这样被调用: $('#myDiv').hilight(); 但是如果我们需要分解我们的实现代码为多个函数该怎么办?有很多原因:设计上的需要;这样做更容易或更易读的实现;而且这样更符合面向对象。
这真是一个麻烦事,把功能实现分解成多个函数而不增加多余的命名空间。出于认识到和利用函数是javascript中最基本的类对象,我们可以这样做。
就像其他对象一样,函数可以被指定为属性。因此我们已经声明“hilight”为jQuery的属性对象,任何其他的属性或者函数我们需要暴露出来的,都可以在"hilight" 函数中被声明属性。
稍后继续。2.2 接受options参数以控制插件的行为让我们为我们的插件添加功能指定前景色和背景色的功能。
我们也许会让选项像一个options对象传递给插件函数。例如: Java代码 // plugin definition $.fn.hilight = function(options) { var defaults = { foreground: 'red', background: 'yellow' }; // Extend our default options with those provided. var opts = $.extend(defaults, options); // Our plugin implementation code goes here. }; 我们的插件可以这样被调用: $('#myDiv').hilight({ foreground: 'blue' }); 2.3 暴露插件的默认设置我们应该对上面代码的一种改进是暴露插件的默认设置。
这对于让插件的使用者更容易用较少的代码覆盖和修改插件。接下来我们开始利用函数对象。
Java代码 // plugin definition $.fn.hilight = function(options) { // Extend our default options with those provided. // Note that the first arg to extend is an empty object - // this is to keep from overriding our "defaults" object. var opts = $.extend({}, $.fn.hilight.defaults, options); // Our plugin implementation code goes here. }; // plugin defaults - added as a property on our plugin function $.fn.hilight.defaults = { foreground: 'red', background: 'yellow' }; 现在使用者可以包含像这样的一行在他们的脚本里: //这个只需要调用一次,且不一定要在ready块中调用 $.fn.h。
6.怎样编写一个jQuery插件
为了方便用户创建插件,jquery提供了jQuery.extend()和jQuery.fn.extend()方法。
1. jQuery.extend() 方法有一个重载。 jQuery.extend(object) ,一个参数的用于扩展jQuery类本身,也就是用来在jQuery类/命名空间上增加新函数,或者叫静态方法,例如jQuery内置的 ajax方法都是用jQuery.ajax()这样调用的,有点像 “类名.方法名” 静态方法的调用方式。
下面我们也来写个jQuery.extend(object)的例子://扩展jQuery对象本身 jQuery.extend({ "minValue": function (a, b) { ///《summary> /// 比较两个值,返回最小值 ///《/summary> return a 《 b ? a : b; }, "maxValue": function (a, b) { ///《summary> /// 比较两个值,返回最大值 ///《/summary> return a > b ? a : b; } }); //调用 var i = 100; j = 101; var min_v = $.minValue(i, j); // min_v 等于 100 var max_v = $.maxValue(i, j); // max_v 等于 101重载版本:jQuery.extend([deep], target, object1, [objectN]) 用一个或多个其他对象来扩展一个对象,返回被扩展的对象。 如果不指定target,则给jQuery命名空间本身进行扩展。
这有助于插件作者为jQuery增加新方法。 如果第一个参数设置为true,则jQuery返回一个深层次的副本,递归地复制找到的任何对象。
否则的话,副本会与原对象共享结构。 未定义的属性将不会被复制,然而从对象的原型继承的属性将会被复制。
参数 deep: 可选。如果设为true,则递归合并。
target: 待修改对象。 object1: 待合并到第一个对象的对象。
objectN: 可选。待合并到第一个对象的对象。
示例1:合并 settings 和 options,修改并返回 settings。var settings = { validate: false, limit: 5, name: "foo" };var options = { validate: true, name: "bar" };jQuery.extend(settings, options);结果:settings == { validate: true, limit: 5, name: "bar" }示例2:合并 defaults 和 options, 不修改 defaults。
var empty = {};var defaults = { validate: false, limit: 5, name: "foo" };var options = { validate: true, name: "bar" };var settings = jQuery.extend(empty, defaults, options);结果:settings == { validate: true, limit: 5, name: "bar" }empty == { validate: true, limit: 5, name: "bar" }这个重载的方法,我们一般用来在编写插件时用自定义插件参数去覆盖插件的默认参数。jQuery.fn.extend(object)扩展 jQuery 元素集来提供新的方法(通常用来制作插件)。
首先我们来看fn 是什么东西呢。查看jQuery代码,就不难发现。
jQuery.fn = jQuery.prototype = { init: function( selector, context ) {。..};};原来 jQuery.fn = jQuery.prototype,也就是jQuery对象的原型。
那jQuery.fn.extend()方法就是扩展jQuery对象的原型方法。我 们知道扩展原型上的方法,就相当于为对象添加”成员方法“,类的”成员方法“要类的对象才能调用,所以使用 jQuery.fn.extend(object)扩展的方法, jQuery类的实例可以使用这个“成员函数”。
jQuery.fn.extend(object)和jQuery.extend(object)方法一 定要区分开来。
7.jquery 插件写法,怎么写插件
。
转载请注明出处育才学习网 » jquery插件代码怎么写