這篇文章主要介紹“JavaScript下jquery的使用方法”,在日常操作中,相信很多人在JavaScript下jquery的使用方法問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”JavaScript下jquery的使用方法”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
懷來(lái)網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),懷來(lái)網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為懷來(lái)數(shù)千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的懷來(lái)做網(wǎng)站的公司定做!
本文粗燥的實(shí)現(xiàn)jquery
的ready、each、bind、``$.fn.extend、$.extend
初始化$
(function (win) { var _$ = function (selector, context) { /** * 通常咱們定義一個(gè) 函數(shù) var Fun = function(){} * 然后定義一個(gè) Fun.prototype.init = function(){} * 那么咱們調(diào)用init 的時(shí)候 得先要實(shí)例化對(duì)象 var f = new Fun() * 然后f.init() * 這里就省去了 var $ = new $() */ return new _$.prototype.Init(selector, context); }; _$.prototype = { //初始化$ Init: function (selector, context) { this.elements = []; /** * 傳入的類型是function 就執(zhí)行ready事件,如果是document 就將document對(duì)象插入到this.elements * 主要就是判斷$(document).ready 和 $(function(){}) 這兩種的ready事件的寫(xiě)法 */ if (typeof selector === "function") { this.elements.push(document); this.ready(selector); } else { var context = context || document; var isDocument = (ele) => Object.prototype.toString.call(ele) == "[object HTMLDocument]" || "[object Document]"; if (isDocument(selector)) { this.elements.push(selector); } else { /** * 如果是字符串的話就查詢?cè)摴?jié)點(diǎn) $('.class') | $('#id') */ if (context.querySelectorAll) { var arr = context.querySelectorAll(selector); for (var i = 0; i < arr.length; i++) { this.elements.push(arr[i]); } } } } }, //實(shí)現(xiàn)each each: function (callback) {}, //實(shí)現(xiàn)ready ready: function (callback) {}, //實(shí)現(xiàn)bind bind: function (type, callback) {}, }; /** * 讓兩個(gè)作用域不一樣的對(duì)象共享一個(gè)方法,讓他們的原型指向一致,即Init.prototype = _$.prototype * 那么原型一致之后 就可以共享this.elements 屬性了。 */ _$.prototype.Init.prototype = _$.prototype; window.$ = _$; })(window || global);
ready
//實(shí)現(xiàn)ready ready: function (callback) { var isDocument = (ele) => Object.prototype.toString.call(ele) == '[object HTMLDocument]' || '[object Document]' //如果已經(jīng)取得了節(jié)點(diǎn) if (isDocument(this.elements[0])) { if (document.addEventListener) { //判斷火狐、谷歌 /** * DOM樹(shù)構(gòu)建完成的時(shí)候就會(huì)執(zhí)行DOMContentLoaded * 頁(yè)面上所有的DOM,樣式表,腳本,圖片,flash都已經(jīng)加載完成了,才會(huì)觸發(fā)window.onload * 這也就是$(document).ready() 比 window.onload 執(zhí)行早的原因 * * arguments.callee 博客里面有一篇文章 [js-遞歸] 里面專門(mén)講到了,這里不再解釋了 */ document.addEventListener('DOMContentLoaded', function () { document.removeEventListener('DOMContentLoaded', arguments.callee, false) callback() }, false) } else if (document.attachEvent) { //判斷IE document.attachEvent('onreadystatechange', function () { if (document.readyState == 'complete') { document.detachEvent('onreadystatechange', arguments.callee); callback() } }) } else if (document.lastChild == document.body) { //body已經(jīng)加載完了,就直接回調(diào)了 callback() } } },
each
//實(shí)現(xiàn)each each: function (callback) { if (this.elements.length > 0) { for (var i = 0; i < this.elements.length; i++) { callback.call(this, this.elements[i], i); } } },
bind
//實(shí)現(xiàn)bind bind: function (type, callback) { if (document.addEventListener) { //判斷火狐、谷歌 this.each(function (item, i) { item.addEventListener(type, callback, false) }) } else if (document.attachEvent) { //判斷IE this.each(function (item, i) { item.attachEvent('on' + type, callback) }) } else { this.each(function (item, i) { //其他瀏覽器 egg: item.onclick = function(){} item['on' + type] = callback }) } }
$.fn.extend/$.extend
$.fn.extend
是為查詢的節(jié)點(diǎn)對(duì)象擴(kuò)展方法,是基于$
的原型擴(kuò)展的方法
$.extend
是擴(kuò)展常規(guī)方法,是$的靜態(tài)方法
官方給出解釋:
jQuery.extend()
: Merge the contents of two or more objects together into the first object.(把兩個(gè)或者更多的對(duì)象合并到第一個(gè)當(dāng)中)
jQuery.fn.extend()
:Merge the contents of an object onto the jQuery prototype to provide new jQuery instance methods.(把對(duì)象掛載到jQuery
的prototype
屬性,來(lái)擴(kuò)展一個(gè)新的jQuery
實(shí)例方法)
$.fn.extend
方法的初衷是我們擴(kuò)展之后可以用$("").newMetod()
這樣訪問(wèn),實(shí)際上就是給$
原型加一個(gè)extend
方法。這中間的fn
其實(shí)類似于命名空間的作用,沒(méi)什么實(shí)際的意義。為的是和$.extend
作區(qū)分
$.fn.extend
; (function (win) { ... _$.prototype.Init.prototype = _$.prototype; _$.fn = _$.prototype; //把對(duì)象掛載到j(luò)Query的prototype屬性 var isObj = (o) => Object.prototype.toString().call(o) === '[object Object]'; $.fn.extend = function (obj) { if (isObj(obj)) { for (var i in obj) { this[i] = obj //注意這里的this指向是 $.prototype } } }
$.extend
var isObj = (o) => Object.prototype.toString().call(o) === '[object Object]'; ... _$.extend = function (obj) { if (isObj(obj)) { for (var i in obj) { this[i] = obj[i]; //注意這里的this指向是 $ } } }
這倆看上去一模一樣啊,沒(méi)啥區(qū)別,注釋里面已經(jīng)說(shuō)了,this
指向不同。咱們來(lái)看個(gè)例子:
<!DOCTYPE html> <html> <head> <title>jQuery.extend()與jQuery.fn.extend()區(qū)別</title> <meta charset="utf-8" /> <script type="text/javascript" src="jquery.js"></script> <!-- 開(kāi)始擴(kuò)展 --> <script type="text/javascript"> (function ($) { $.extend({ sayHello: function () { console.log("Hello"); }, }); $.fn.extend({ sayHello: function () { console.log("Hello"); }, }); })(jQuery); </script> <!-- 調(diào)用 --> <script type="text/javascript"> $(document).ready(function () { //$.extend擴(kuò)展調(diào)用 $.sayHello(); //$.fn.extend擴(kuò)展調(diào)用 $("#test").sayHello(); }); </script> </head> <body> <div id="test"></div> </body> </html>
這樣以來(lái)就看的很明白了。jQuery.extend(object);
為擴(kuò)展jQuery
類本身,為自身添加新的方法。$.xxx()
jQuery.fn.extend(object);
給jQuery
對(duì)象添加方法$('#test').xxx()
$.extend
常見(jiàn)用法
//在jquery全局對(duì)象中擴(kuò)展一個(gè)net命名空間。 $.extend({ net: {} }); //方法擴(kuò)展到之前擴(kuò)展的Jquery的net命名空間中去。 $.extend($.net, { sayHello: function () { console.log("Hello"); }, }); //extend方法還有一個(gè)重載原型 //extend(boolean,dest,src1,src2,src3...),第一個(gè)參數(shù)boolean代表是否進(jìn)行深度拷貝 var a = { protocol: "http", hash: { a: 1, b: 2 } }; var b = { host: "chuchur.com", hash: { b: 1, c: 2 } }; var result = $.extend(true, {}, a, b); console.log(result); //{ protocol: 'http',host: 'chuchur.com', hash: { a: 1, b: 1,c:2 } } var result = $.extend(false, {}, a, b); console.log(result); //{ protocol: 'http',host: 'chuchur.com', hash: { b: 1, c:2 } }
完整代碼
(function (win) { var _$ = function (selector, context) { /** * 通常咱們定義一個(gè) 函數(shù) var Fun = function(){} * 然后定義一個(gè) Fun.prototype.init = function(){} * 那么咱們調(diào)用init 的時(shí)候 得先要實(shí)例化對(duì)象 var f = new Fun() * 然后f.init() * 這里就省去了 var $ = new $() */ return new _$.prototype.Init(selector, context); }; _$.prototype = { //初始化$ Init: function (selector, context) { this.elements = []; /** * 傳入的類型是function 就執(zhí)行ready事件,如果是document 就將document對(duì)象插入到this.elements * 主要就是判斷$(document).ready 和 $(function(){}) 這兩種的ready事件的寫(xiě)法 */ if (typeof selector === "function") { this.elements.push(document); this.ready(selector); } else { var context = context || document; var isDocument = (ele) => Object.prototype.toString.call(ele) == "[object HTMLDocument]" || "[object Document]"; if (isDocument(selector)) { this.elements.push(selector); } else { /** * 如果是字符串的話就查詢?cè)摴?jié)點(diǎn) $('.class') | $('#id') */ if (context.querySelectorAll) { var arr = context.querySelectorAll(selector); for (var i = 0; i < arr.length; i++) { this.elements.push(arr[i]); } } } } }, //實(shí)現(xiàn)each each: function (callback) { if (this.elements.length > 0) { for (var i = 0; i < this.elements.length; i++) { callback.call(this, this.elements[i], i); } } }, //實(shí)現(xiàn)ready ready: function (callback) { var isDocument = (ele) => Object.prototype.toString.call(ele) == "[object HTMLDocument]" || "[object Document]"; //如果已經(jīng)取得了節(jié)點(diǎn) if (isDocument(this.elements[0])) { if (document.addEventListener) { //判斷火狐、谷歌 /** * DOM樹(shù)構(gòu)建完成的時(shí)候就會(huì)執(zhí)行DOMContentLoaded * 頁(yè)面上所有的DOM,樣式表,腳本,圖片,flash都已經(jīng)加載完成了,才會(huì)觸發(fā)window.onload * 這也就是$(document).ready() 比 window.onload 執(zhí)行早的原因 * * arguments.callee 博客里面有一篇文章 js-遞歸里面專門(mén)講到了,這里不再解釋了 */ document.addEventListener( "DOMContentLoaded", function () { document.removeEventListener( "DOMContentLoaded", arguments.callee, false ); callback(); }, false ); } else if (document.attachEvent) { //判斷IE document.attachEvent("onreadystatechange", function () { if (document.readyState == "complete") { document.detachEvent("onreadystatechange", arguments.callee); callback(); } }); } else if (document.lastChild == document.body) { //body已經(jīng)加載完了,就直接回調(diào)了 callback(); } } }, //實(shí)現(xiàn)bind bind: function (type, callback) { if (document.addEventListener) { //判斷火狐、谷歌 this.each(function (item, i) { item.addEventListener(type, callback, false); }); } else if (document.attachEvent) { //判斷IE this.each(function (item, i) { item.attachEvent("on" + type, callback); }); } else { this.each(function (item, i) { //其他瀏覽器 egg: item.onclick = function(){} item["on" + type] = callback; }); } }, }; /** * 讓兩個(gè)作用于不一樣的對(duì)象共享一個(gè)方法,讓他們的原型指向一直,即Init.prototype = _$.prototype * 那么指向之后 就可以共享this.elements 屬性了。 */ _$.prototype.Init.prototype = _$.prototype; var isObj = (o) => Object.prototype.toString().call(o) === "[object Object]"; $.fn.extend = function (obj) { if (isObj(obj)) { for (var i in obj) { this[i] = obj; //注意這里的this指向是 $.prototype } } //....這里是簡(jiǎn)寫(xiě) }; _$.extend = function (obj) { if (isObj(obj)) { for (var i in obj) { this[i] = obj[i]; //注意這里的this指向是 $ } } //....這里是簡(jiǎn)寫(xiě) }; window.$ = _$; })(window || global);
到此,關(guān)于“JavaScript下jquery的使用方法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
網(wǎng)頁(yè)標(biāo)題:JavaScript下jquery的使用方法
網(wǎng)頁(yè)鏈接:http://muchs.cn/article34/gjsdpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、自適應(yīng)網(wǎng)站、網(wǎng)站排名、網(wǎng)站營(yíng)銷、面包屑導(dǎo)航、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)