摘要:無參數(shù)當(dāng)前當(dāng)前文檔中其所在在位置從開始工具函數(shù)函數(shù)函數(shù)包裝器可以不用了工具函數(shù)通過類名來選取元素父級對象類名獲取到的節(jié)點(diǎn)數(shù)組事件添加函數(shù)需要綁定事件的對象事件類型事件觸發(fā)執(zhí)行的函數(shù)標(biāo)準(zhǔn)修改下指向的問題最后選擇
VQuery-封裝自己的JQuery
標(biāo)簽(空格分隔): JS
封裝自己的jQuery--vQuery vQurey選擇器 VQuery類elements屬性,存儲選擇的元素
參數(shù)typeof的使用判斷傳入?yún)?shù)的類型
字符串
class/id/tagname
函數(shù)事件綁定-
對象
直接插入
//VQuery選擇器 function VQuery(vArg) { //用來保存選擇的元素 this.elements = []; switch (typeof vArg) { //當(dāng)傳入函數(shù)時(shí). case "function": myAddEvent(window, "load", vArg); break; case "string": //傳入字符串時(shí). switch (vArg.charAt(0)) { case "#": //id var obj = document.getElementById(vArg.substring(1)); this.elements.push(obj); break; case ".": //class this.elements = getByClassName(document, vArg.substring(1)); break; default: //tagName this.elements = document.getElementsByTagName(vArg); } break; case "object": this.elements.push(vArg); break; } }VQuery事件 綁定事件 click方法.綁定點(diǎn)擊事件
/** * 元素點(diǎn)擊方法 * @param {Function} fn 點(diǎn)擊后執(zhí)行的函數(shù) */ VQuery.prototype.click = function (fn) { for (var i = 0, len = this.elements.length; i < len; i++) { myAddEvent(this.elements[i], "click", fn); } };顯示隱藏方法.hide/show.改變display屬性
/** * 顯示元素,display:block */ VQuery.prototype.show = function () { for (var i = 0, len = this.elements.length; i < len; i++) { this.elements[i].style.display = "block"; } }; /** * 隱藏元素,display:none */ VQuery.prototype.hide = function () { for (var i = 0, len = this.elements.length; i < len; i++) { this.elements[i].style.display = "none"; } };hover方法.鼠標(biāo)移入移出時(shí)
/** * 鼠標(biāo)移入移出方法 * @param {Function} fnOver 鼠標(biāo)移入執(zhí)行的函數(shù) * @param {Function} fnOut 鼠標(biāo)移出執(zhí)行的函數(shù) */ VQuery.prototype.hover = function (fnOver, fnOut) { for (var i = 0, len = this.elements.length; i < len; i++) { myAddEvent(this.elements[i], "mouseover", fnOver); myAddEvent(this.elements[i], "mouseout", fnOut); } };
解決函數(shù)中的this問題
call/apply可以動態(tài)修改對象的this指向.
知乎如何理解和熟練運(yùn)用js中的call及apply?
toggle方法.切換點(diǎn)擊記數(shù)
//使用匿名函數(shù)包裝器來給每個(gè)對象創(chuàng)建局部變量 (function (obj) { var count = 0; myAddEvent(obj, "click", function () { alert(count++); }); })(this.elements[i]);
arguments的使用
toggle方法,切換,接收任意個(gè)參數(shù),不斷在參數(shù)間循環(huán).例:點(diǎn)擊顯示隱藏
*/
VQuery.prototype.toggle = function () {
var _arguments = arguments;
for (var i = 0, len = this.elements.length; i < len; i++) {
addToggle(this.elements[i]);
}
function addToggle(obj) {
var count = 0; myAddEvent(obj, "click", function () { _arguments[count++ % _arguments.length].call(obj); });
}
};
簡單形式 -- 設(shè)置/獲取
獲取計(jì)算后的樣式
/** * 設(shè)置與獲取元素樣式的方法: * 接受1個(gè)或者2個(gè)參數(shù)(1個(gè)參數(shù)時(shí):返回傳入屬性名對應(yīng)的的樣式值,兩個(gè)參數(shù):為傳入的樣式名為設(shè)置樣式值) * @param {String} attr 設(shè)置或獲取的樣式名 * @param {String} value 樣式值(可選) */ VQuery.prototype.css = function (attr, value) { if (arguments.length == 2) { for (var i = 0, len = this.elements.length; i < len; i++) { this.elements[i].style[attr] = value; } } else { //1個(gè)參數(shù)時(shí)返回獲取到的樣式 return getStyle(this.elements[0], attr); } };attr方法,設(shè)置或獲取屬性
/** * 屬性設(shè)置與獲取方法,與css方法基本一致. * @param {String} attr 設(shè)置或獲取的屬性名 * @param {String} value 屬性值(可選) * @returns {String} 一個(gè)參數(shù)時(shí),返回對應(yīng)的屬性值 */ VQuery.prototype.attr = function (attr, value) { if (arguments.length == 2) { for (var i = 0, len = this.elements.length; i < len; i++) { this.elements[i][attr] = value; } } else { return this.elements[0][attr]; } }eq方法-減少匹配元素的集合為指定的索引的哪一個(gè)元素。
/**取其中的第n個(gè)對象-方法-減少匹配元素的集合為指定的索引的哪一個(gè)元素。 * @param {Number} n 需要的第幾個(gè)元素 * @returns {Object} 返回獲取到的vquery元素 */ VQuery.prototype.eq = function (n) { //必須使用$包裝.使返回的節(jié)點(diǎn)從普通對象變得vquery的元素(普通對象沒有vQuery方法) return $(this.elements[n]); };find方法-查找當(dāng)前對象的后代元素.
/** * 把a(bǔ)rr2內(nèi)的元素添加到arr1 * 把類數(shù)組對象或數(shù)組轉(zhuǎn)變?yōu)閿?shù)組.(不需要類數(shù)組元素支持Array的方法) * @param {Array} arr1 轉(zhuǎn)變后的數(shù)組 * @param {Object} arr2 類數(shù)組對象或數(shù)組 */ function appendArr(arr1, arr2) { for (var i = 0, len = arr2.length; i < len; i++) { arr1.push(arr2[i]); } } /** * 查找當(dāng)前對象的后代元素. * @param {String} str class名或標(biāo)簽名 * @returns {Object} 獲取到的對象集合 */ VQuery.prototype.find = function (str) { var aResult = []; for (var i = 0, len = this.elements.length; i < len; i++) { switch (str.charAt(0)) { case ".": //class var aEle = getByClassName(this.elements[i], str.substring(1)); appendArr(aResult, aEle); break; default: //標(biāo)簽 var aEle = this.elements[i].getElementsByTagName(str); // aResult = aResult.concat[aEle];//這樣做會出錯(cuò),因?yàn)閍Ele并不是一個(gè)真正的數(shù)組,必須使用下面的方法 appendArr(aResult, aEle); } } //必須這么做,因?yàn)椴贿@樣做返回的是節(jié)點(diǎn)集合,不具有VQuery的方法和屬性 var newVquery = $(); newVquery.elements = aResult; return newVquery; };index方法--當(dāng)前元素在其同級元素中的位置
/** * 獲取當(dāng)前元素在同輩元素的位置 * @param {Object} obj 需要獲取的對象 * @returns {Number} 獲取到的索引值 */ function getIndex(obj) { var aBrother = obj.parentNode.children; for (var i = 0, len = aBrother.length; i < len; i++) { if (aBrother[i] == obj) { return i; } } } /**返回相對于它同輩元素的位置的索引值。無參數(shù) * @returns {Number} 當(dāng)前當(dāng)前文檔中其所在在位置,從0開始 */ VQuery.prototype.index = function () { return getIndex(this.elements[0]); };工具函數(shù). $函數(shù)
//函數(shù)包裝器..可以不用new 了 function $(vArg) { return new VQuery(vArg); }工具函數(shù)
/**通過class類名來選取元素 * @param {Object} parent 父級對象, * @param {String} sClass className類名 * @returns {Array} 獲取到的節(jié)點(diǎn)數(shù)組 */ function getByClassName(parent, sClass) { if (parent.getElementsByClassName) { return parent.getElementsByClassName(sClass); } else { var oEle = parent.getElementsByTagName("*"), arr = [], reg = new RegExp("" + sClass + ""); for (var i = 0, len = oEle.length; i < len; i++) { if (reg.test(oEle[i].className)) { arr.push(oEle[i]); } } return arr; } }
/** *事件添加函數(shù) * @param {Object} obj 需要綁定事件的對象 * @param {String} type 事件類型 * @param {Function} fn 事件觸發(fā)執(zhí)行的函數(shù) */ function myAddEvent(obj, type, fn) { //標(biāo)準(zhǔn) if (obj.addEventListener) { obj.addEventListener(type, fn, false); } else if (obj.attachEvent) { //IE obj.attachEvent("on" + type, function () { //修改ie下this指向window的問題 fn.call(obj); }); } else { //最后選擇 obj["on" + type] = fn; } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/86215.html
摘要:調(diào)用函數(shù),判斷是否含有該指定樣式,若含有的話刪除該。分不同的情況來調(diào)用函數(shù),并返回對象。慕課網(wǎng)探索之基礎(chǔ)詳解篇慕課網(wǎng)事件探秘。參考資料事件代理委托事件代理實(shí)現(xiàn)如下事件代理需要進(jìn)行事件代理的父元素。 轉(zhuǎn)載自我的個(gè)人博客 歡迎大家批評指正 DOM 添加class、移除class、是否同級元素、獲取元素位置 先來一些簡單的,在你的util.js中完成以下任務(wù): // 為element增加...
摘要:用原生寫一個(gè)多動癥的簡歷預(yù)覽地址源碼地址最近在知乎上看到方應(yīng)杭用寫了一個(gè)會動的簡歷,覺得挺好玩的,研究一下其實(shí)現(xiàn)思路,決定試試用原生來實(shí)現(xiàn)。 用原生js寫一個(gè)多動癥的簡歷 預(yù)覽地址源碼地址 最近在知乎上看到@方應(yīng)杭用vue寫了一個(gè)會動的簡歷,覺得挺好玩的,研究一下其實(shí)現(xiàn)思路,決定試試用原生js來實(shí)現(xiàn)。 showImg(https://segmentfault.com/img/remot...
摘要:設(shè)置請求和接收響應(yīng)自己封裝簡易這篇文章是承接前幾篇博客的是前幾篇繼續(xù)學(xué)習(xí)包括學(xué)習(xí)與理解和簡化版自己實(shí)現(xiàn)等這篇文章只算是我的個(gè)人學(xué)習(xí)筆記內(nèi)容沒有精心排版一些錯(cuò)誤請見諒所有代碼都在這里從歷史可以看到所有代碼擺闊一個(gè)簡易的服務(wù)器所有代碼在歷史里 Ajax設(shè)置請求和接收響應(yīng)、自己封裝簡易jQuery.Ajax 這篇文章是承接前幾篇博客的,是前幾篇繼續(xù)學(xué)習(xí)包括Ajax學(xué)習(xí)與理解和簡化版自己實(shí)現(xiàn)j...
摘要:和異步處理調(diào)用訪問數(shù)據(jù)采用的方式,這是一個(gè)異步過程,異步過程最基本的處理方式是事件或回調(diào),其實(shí)這兩種處理方式實(shí)現(xiàn)原理差不多,都需要在調(diào)用異步過程的時(shí)候傳入一個(gè)在異步過程結(jié)束的時(shí)候調(diào)用的接口。 Ajax 和異步處理 調(diào)用 API 訪問數(shù)據(jù)采用的 Ajax 方式,這是一個(gè)異步過程,異步過程最基本的處理方式是事件或回調(diào),其實(shí)這兩種處理方式實(shí)現(xiàn)原理差不多,都需要在調(diào)用異步過程的時(shí)候傳入一個(gè)在異...
閱讀 2883·2021-09-22 15:20
閱讀 2958·2021-09-22 15:19
閱讀 3448·2021-09-22 15:15
閱讀 2382·2021-09-08 09:35
閱讀 2373·2019-08-30 15:44
閱讀 3004·2019-08-30 10:50
閱讀 3707·2019-08-29 16:25
閱讀 1586·2019-08-26 13:55