1.(function($){...})(jQuery)、(function(arg){})(param)、(function(){})()、$(document).ready(function(){...})------函數的自執行
都是是匿名函數,function($){...}參數爲$、function(arg){...}參數爲arg,function(){...}無參。
調用匿名函數時,是在函數後面括號和實參的,因爲操做符的優先級,函數自己也須要用括號,(至關於函數自執行,即定義了一個匿名函數,而後又調用該函數,該函數的實參爲jQuery)
(function($){...})(jQuery)(在形參使用$,是爲了避免與其餘庫衝突,因此實參用jQuery),
其實就等於 var fn = function($){....};
fn(jQuery),
注意:fn是不存在的,那個函數直接定義,而後就運行了。
(function($){...})(jQuery)做用:用來定義一些須要預先定義好的函數,
這種匿名函數寫法的最大好處是造成閉包,使得在(function($) {…})(jQuery)內部定義的函數和變量只能在此範圍內有效。
2.$(function(){…}); jQuery(function($) {…}); $(document).ready(function(){…})------DOM對象加載完後執行
做用都同樣,都是用來在DOM加載完成以後 運行\執行 那些預行定義好的函數.
總結:
$(function(){ })用於存放操做DOM對象的代碼,執行其中代碼時DOM對象已存在。不可用於存放開發插件的代碼,因 爲jQuery對象沒有獲得傳遞,外部經過jQuery.method也調用不了其中的方法(函數)。
(function($){ })(jQuery);用於存放開發插件的代碼,執行其中代碼時DOM不必定存在,因此直接自動執行DOM操做的代碼 請當心使用。
3.jQuery爲開發插件提供了兩個方法:$.fn.extend(object)和$.extend(object):
3.1 $.extend(object):
$.xxx=function(options){}用於爲jQuery類添加一個方法xxx,而 $.extend(object)用於爲jQeury類添加多個方法,效果都是同樣的,是爲了擴展 jQuery類自己 ,爲該類添加一些新的方法(靜態方法),使用jQuery自己就可調用該方法,爲jQuery類添加的方法都是全局函數。如:
//爲jquery添加多個方法
$.extend({
add:function(a,b){return a+b;},
minus:function(a,b){return a-b;}
});
$.add(3,4);//7
$.minus(5,2)//3 javascript
//爲Jquery添加一個方法
$.getData = function (options) {
var opts = $.extend(true, {}, $.fn.loadMore.defaults, options);
$.ajax({
url: opts.url,
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: "{groupNumber:" + opts.groupNumber + "}",
success: function (data, textStatus, xhr) {
if (data.d) {
// We need to convert JSON string to object, then
// iterate thru the JSON object array.
$.each($.parseJSON(data.d), function () {
$("#result").append('<li id="">' +
this.Id + ' - ' + '<strong>' +
this.Name + '</strong>' + ' — ' + '<span class="page_message">' +
this.Comment + '</span></li>');
});
$('.animation_image').hide();
options.groupNumber++;
options.loading = false;
}
},
error: function (xmlHttpRequest, textStatus, errorThrown) {
options.loading = true;
console.log(errorThrown.toString());
}
}); css
也可用於定義命名空間:雖然在jQuery命名空間中,咱們禁止使用javascript函數名和變量名,但仍然不可避免某些函數名或變量名將與其餘jQuery插件衝突,所以咱們習慣將一些方法封裝到另外一個自定義的命名空間: $.myPlugin={ foo:function(){alert('This is a test')}, bar:function(){alert('This is another test')}
}
$.myPlugin.foo();
$.myPlugin.bar();
$.extend函數除了給jQuery類添加新方法外, 還有2個重載原型:
1)Jquery的擴展方法原型:$.extend(dest,src1,src2,src3...);
含義是將src1,src2,src3...合併到dest中,返回值爲合併後的dest,由此能夠看出該方法合併後,是修改了dest的結構的。
若是想要獲得合併的結果卻又不想修改dest的結構,能夠以下使用: var newSrc=$.extend({},src1,src2,src3...)//也就是將"{}"做爲dest參數,這樣就能夠將src1,src2,src3...進行合併,而後將合併結果返回給newSrc了
eg:var result=$.extend({},{name:"Tom",age:21},{name:"Jerry",sex:"Boy"}) ,合併後結果:result={name:"Jerry",age:21,sex:"Boy"},
即後面的參數若是和前面的參數存在相同的名稱,那麼後面的會覆蓋前面的參數值。html
2)$.extend(boolean,dest,src1,src2,src3...)或$.extend(boolean,{},src1,src2,src3...):
做用也是將將src1,src2,src3...合併到dest中,返回值爲合併後的dest,第一個參數表示是否進行深度遞歸合併:即若是第一個參數爲true,且多個對象的某個同名屬性也都是對象,則該「屬性對象」的屬性也進行合併(後面覆蓋前面相同屬性的值),
若是第一個參數爲false,且多個對象的某個同名屬性也都是對象,則只取最後一個同名屬性中的屬性的值:如
var result=$.extend( true, {},
{ name: "John", location: {city: "Boston",county:"USA"} },
{ last: "Resig", location: {state: "MA",county:"China"} } );
結果爲:result={name:"John",last:"Resig",location:{city:"Boston",state:"MA",county:"China"}}
var result=$.extend( false, {},
{ name: "John", location:{city: "Boston",county:"USA"} },
{ last: "Resig", location: {state: "MA",county:"China"} });
結果爲:
result={name:"John",last:"Resig",location:{state:"MA",county:"China"}}java
4.$.fn.extend(object) :$.fn = jQuery.prototype
$.fn.xxx用於添加單個方法xxx,而$.fn.extend 用於添加多個方法,效果都是同樣的。爲 jQuery對象 添加方法,擴展jQuery對象,即爲jQuery類添加一些「成員函數」, 只有jQuery類的實例對象才能夠調用這些「成員函數」,如:
$.fn.extend({
alertWhileClick: function () {
$(this).click(function() {
alert($(this).val())
})
},
inputblur: function () {
$(this).blur(function () {
alert($(this).val())
})
}
})
//$(「#input1″).alertWhileClick();
$(「#input1″).inputblur();
//$(「#input1″) 爲一個jQuery實例,當它調用成員方法 alertWhileClick後,便實現了擴展,每次被點擊時它會先彈出目前編輯裏的內容 jquery
用於開發對象級別的插件: // 建立一個閉包
(function($){
// 插件的定義
$.fn.hilight = function(options){
// build main options before element iteration
var opts = $.extend({},$.fn.hilight.defaults.options);
// iteration and reformar each matched element
return this.each(function(){
$this = $(this);
// build element specific options
var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
$this.css({
backgroundColor: o.background,
color: o.foreground
});
var markup = $this.html();
// call our format function
markup = $.fn.hilight.format(markup);
$this.html(markup);
});
};
// 私有函數:debugging
function debug($obj) {
if (window.console && window.console.log)
window.console.log('hilight selection count: ' + $obj.size());
};
// 定義暴露format函數
$.fn.hilight.format = function(txt) {
return '<strong>' + txt + '</strong>';
};
// 插件的defaults
$.fn.hilight.defaults = {
foreground: 'red',
background: 'yellow'
};
})
}
// 閉包結束
})(jQuery);
//使用該插件:$.fn.hilight.defaults.foreground = "blue"; $("myDiv").hilight(); ajax
};