前端那些事之原生js实现jquery常用方法

原生js封装,实现jquery中常用 方法

//定义一个对象 - 名字是$
var $$ = function() {
	this.init()
};
//第二种写法
$$.prototype = {
	init:function(){
		this.fnExtend()
        this.strExtend()
        this.arrayExtend()
        this.DateExtend()
        this.numExtend()
	},
    //函数扩展
    fnExtend:function (){
        //给函数扩展方法
        Function.prototype.before = function( func ) {
            var __self = this;
            return function() {
                if ( func.apply( this, arguments ) === false ) {
                    return false;
                }
                return __self.apply( this, arguments );
            }
        }
        Function.prototype.after = function( func ) {
            var __self = this;
            return function() {
                var ret = __self.apply( this, arguments );
                if( ret === false) {
                    return false;
                }
                func.apply( this, arguments );
                return ret;
            }
        }
},
    //函数扩展
    strExtend:function(){},
    //函数扩展
    arrayExtend:function(){},
    //函数扩展
    DateExtend:function(){},
    //函数扩展
    numExtend:function(){},
	//去除左边空格
	ltrim:function(str){
		return str.replace(/(^\s*)/g,'');
	},
	//去除右边空格
	rtrim:function(str){
		return str.replace(/(\s*$)/g,'');
	},
	//去除空格
	trim:function(str){
		return str.replace(/(^\s*)|(\s*$)/g, '');
	},
	//ajax - 前面我们学习的
	myAjax:function(URL,fn){
		var xhr = createXHR();	//返回了一个对象,这个对象IE6兼容。
		xhr.onreadystatechange = function(){
			if(xhr.readyState === 4){
				if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
					fn(xhr.responseText);
				}else{
					alert("错误的文件!");
				}
			}
		};
		xhr.open("get",URL,true);
		xhr.send();

		//闭包形式,因为这个函数只服务于ajax函数,所以放在里面
		function createXHR() {
			//本函数来自于《JavaScript高级程序设计 第3版》第21章
			if (typeof XMLHttpRequest != "undefined") {
				return new XMLHttpRequest();
			} else if (typeof ActiveXObject != "undefined") {
				if (typeof arguments.callee.activeXString != "string") {
					var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0",
							"MSXML2.XMLHttp"
						],
						i, len;

					for (i = 0, len = versions.length; i < len; i++) {
						try {
							new ActiveXObject(versions[i]);
							arguments.callee.activeXString = versions[i];
							break;
						} catch (ex) {
							//skip
						}
					}
				}

				return new ActiveXObject(arguments.callee.activeXString);
			} else {
				throw new Error("No XHR object available.");
			}
		}
	},
	//tab
	tab:function(id) {
		//如何获取某个父元素下面的子元素
		var box = document.getElementById(id);
		var spans = box.getElementsByTagName('span');
		var lis = box.getElementsByTagName('li');


		//两步走
		//第一步: 先把上半部分实现
		//群体绑定事件  -- 对所有的span绑定事件
		//群体绑定事件
		for(var i=0;i<spans.length;i++) {
			//相亲法则  -- 给男一号一个代号  --  怎么给 -- 自定义属性
			spans[i].index=i;
			spans[i].onmouseover = function() {
				//排他思想 --  将所有的span置为默认状态  --- 然后再将当前鼠标移上的span置为class -- select
				for(var i=0;i<spans.length;i++) {
					spans[i].className='';
					lis[i].className='';
				}
				this.className='select';
				lis[this.index].className='select';
			}
		}

	},
	//简单的数据绑定formateString
	formateString:function(str, data){
		return str.replace(/@\((\w+)\)/g, function(match, key){
			return typeof data[key] === "undefined" ? '' : data[key]});
	},
	//给一个对象扩充功能
	extendMany:function() {
		var key,i = 0,len = arguments.length,target = null,copy;
		if(len === 0){
			return;
		}else if(len === 1){
			target = this;
		}else{
			i++;
			target = arguments[0];
		}
		for(; i < len; i++){
			for(key in arguments[i]){
				copy = arguments[i][key];
				target[key] = copy;
			}
		}
		return target;
	},
	extend:function(tar,source) {
		//遍历对象
		for(var i in source){
			tar[i] = source[i];
		}
		return tar;
	},
	//随机数
	random: function (begin, end) {
		return Math.floor(Math.random() * (end - begin)) + begin;
	},
	//给一个对象扩充功能
	extendMany:function() {
		var key,i = 0,len = arguments.length,target = null,copy;
		if(len === 0){
			return;
		}else if(len === 1){
			target = this;
		}else{
			i++;
			target = arguments[0];
		}
		for(; i < len; i++){
			for(key in arguments[i]){
				copy = arguments[i][key];
				target[key] = copy;
			}
		}
		return target;
	},
	extend:function(tar,source) {
		//遍历对象
		for(var i in source){
			tar[i] = source[i];
		}
		return tar;
	},
	//数据类型检测
	isNumber:function (val){
		return typeof val === 'number' && isFinite(val)
	},
	isBoolean:function (val) {
		return typeof val ==="boolean";
	},
	isString:function (val) {
		return typeof val === "string";
	},
	isUndefined:function (val) {
		return typeof val === "undefined";
	},
	isObj:function (str){
		if(str === null || typeof str === 'undefined'){
			return false;
		}
		return typeof str === 'object';
	},
	isNull:function (val){
		return  val === null;
	},
	isArray:function (arr) {
		if(arr === null || typeof arr === 'undefined'){
			return false;
		}
		return arr.constructor === Array;
	}
}
//在框架中实例化,这样外面使用的使用就不用实例化了
$$ = new $$();

//封装事件框架
$$.extend($$,{
	on: function (id, type, fn){
		var dom = $$.isString(id)?document.getElementById(id):id;
		//如果支持
		//W3C版本 --火狐 谷歌 等大多数浏览器
		//如果你想检测对象是否支持某个属性,方法,可以通过这种方式
		if(dom.addEventListener ){
			dom.addEventListener(type, fn, false);
		}else if(dom.attachEvent){
			//如果支持 --IE
			//
			dom.attachEvent('on' + type, fn);
		}
	},
	un:function(id, type, fn){
		var dom = $$.isString(id)?document.getElementById(id):id;
		if(dom.removeEventListener){
			dom.removeEventListener(type, fn);
		}else if(dom.detachEvent){
			dom.detachEvent(type, fn);
		}
	},
	trigger: function(id,type){
		var dom = $$.isString(id)?document.getElementById(id):id;
		// 现代浏览器
		if(dom.dispatchEvent){
			// 创建事件
			var evt = document.createEvent('Event');
			// 定义事件的类型
			evt.initEvent(type, true, true);
			// 触发事件
			dom.dispatchEvent(evt);
			// IE
		} else if(dom.fireEvent){
			dom.fireEvent('on' + type);
		}
	},
	//事件基础
	getEvent:function(event){
		return event?event:window.event;
	},
	//获取目标
	GetTarget :function(event){
		var e = $$.getEvent(event);
		return e.target|| e.srcElement;
	},
	//组织默认行为
	preventDefault:function(event){
		var event = $$.getEvent(event);
		if(event.preventDefault){
			event.preventDefault();
		}else{
			event.returnValue = false;
		}
	},
	//组织冒泡
	stopPropagation:function(event){
		var event = $$.getEvent(event);
		if(event.stopPropagation){
			event.stopPropagation();
		}else{
			event.cancelBubble = true;
		}
	}
})

//封装选择框架
$$.extend($$,{
	//id选择器
	$id:function(id){
		return document.getElementById(id);
	},
	//tag选择器
	$tag:function(tag,context){
		if(typeof context == 'string'){
			context = $$.$id(context);
		}

		if(context){
			return context.getElementsByTagName(tag);
		}else{
			return document.getElementsByTagName(tag);
		}
	},
	//class选择器
	$class:function(className,context){
		var i=0,len,dom=[],arr=[];
		//如果传递过来的是字符串 ,则转化成元素对象
		if($$.isString(context)){
			context = document.getElementById(context);
		}else{
			context = document;
		}
//        如果兼容getElementsByClassName
		if(context.getElementsByClassName){
			return context.getElementsByClassName(className);
		}else{
			//如果浏览器不支持
			dom = context.getElementsByTagName('*');

			for(i;len=dom.length,i<len;i++)
			{
				if(dom[i].className)
				{
					arr.push(dom[i]);
				}
			}
		}
		return arr;
	},
	//分组选择器
	$group:function(content) {
		var result=[],doms=[];
		var arr = $$.trim(content).split(',');
		//alert(arr.length);
		for(var i=0,len=arr.length;i<len;i++) {
			var item = $$.trim(arr[i])
			var first= item.charAt(0)
			var index = item.indexOf(first)
			if(first === '.') {
				doms=$$.$class(item.slice(index+1))
				//每次循环将doms保存在reult中
				//result.push(doms);//错误来源

				//陷阱1解决 封装重复的代码成函数
				pushArray(doms,result)

			}else if(first ==='#'){
				doms=[$$.$id(item.slice(index+1))]//陷阱:之前我们定义的doms是数组,但是$id获取的不是数组,而是单个元素
				//封装重复的代码成函数
				pushArray(doms,result)
			}else{
				doms = $$.$tag(item)
				pushArray(doms,result)
			}
		}
		return result;

		//封装重复的代码
		function pushArray(doms,result){
			for(var j= 0, domlen = doms.length; j < domlen; j++){
				result.push(doms[j])
			}
		}
	},
	//层次选择器
	$cengci:function (select){
		//个个击破法则 -- 寻找击破点
		var sel = $$.trim(select).split(' ');
		var result=[];
		var context=[];
		for(var i = 0, len = sel.length; i < len; i++){
			result=[];
			var item = $$.trim(sel[i]);
			var first = sel[i].charAt(0)
			var index = item.indexOf(first)
			if(first ==='#'){
				//如果是#,找到该元素,
				pushArray([$$.$id(item.slice(index + 1))]);
				context = result;
			}else if(first ==='.'){
				//如果是.
				//如果是.
				//找到context中所有的class为【s-1】的元素 --context是个集合
				if(context.length){
					for(var j = 0, contextLen = context.length; j < contextLen; j++){
						pushArray($$.$class(item.slice(index + 1), context[j]));
					}
				}else{
					pushArray($$.$class(item.slice(index + 1)));
				}
				context = result;
			}else{
				//如果是标签
				//遍历父亲,找到父亲中的元素==父亲都存在context中
				if(context.length){
					for(var j = 0, contextLen = context.length; j < contextLen; j++){
						pushArray($$.$tag(item, context[j]));
					}
				}else{
					pushArray($$.$tag(item));
				}
				context = result;
			}
		}

		return context;

		//封装重复的代码
		function pushArray(doms){
			for(var j= 0, domlen = doms.length; j < domlen; j++){
				result.push(doms[j])
			}
		}
	},
	//多组+层次
	$select:function(str) {
		var result = [];
		var item = $$.trim(str).split(',');
		for(var i = 0, glen = item.length; i < glen; i++){
			var select = $$.trim(item[i]);
			var context = [];
			context = $$.$cengci(select);
			pushArray(context);

		};
		return result;

		//封装重复的代码
		function pushArray(doms){
			for(var j= 0, domlen = doms.length; j < domlen; j++){
				result.push(doms[j])
			}
		}
	},
	//html5实现的选择器
	$all:function(selector,context){
		context = context || document;
		return  context.querySelectorAll(selector);
	},
})

//封装css框架
$$.extend($$,{
	//样式
	css:function(context, key, value){
		console.log('dfdfd')
		var dom = $$.isString(context)?$$.$all(context) : context;
		//如果是数组
		if(dom.length){
			//先骨架骨架 -- 如果是获取模式 -- 如果是设置模式
			//如果value不为空,则表示设置
			if(value){
				for(var i = dom.length - 1; i >= 0; i--){
					setStyle(dom[i],key, value);
				}
				//            如果value为空,则表示获取
			}else{
				return getStyle(dom[0]);
			}
			//如果不是数组
		}else{
			if(value){
				setStyle(dom,key, value);
			}else{
				return getStyle(dom);
			}
		}
		function getStyle(dom){
			if(dom.currentStyle){
				return dom.currentStyle[key];
			}else{
				return getComputedStyle(dom,null)[key];
			}
		}
		function setStyle(dom,key,value){
			dom.style[key] = value;
		}
	},
	cssNum:function (context, key){
		return parseFloat($$.css(context, key))
	},
	//显示
	show:function (content){
		var doms =  $$.$all(content)
		for(var i= 0,len=doms.length;i<len;i++){
			$$.css(doms[i], 'display', 'block');
		}
	},
	//隐藏和显示元素
	hide:function (content){
		var doms =  $$.$all(content)
		for(var i= 0,len=doms.length;i<len;i++){
			$$.css(doms[i], 'display', 'none');
		}
	},
	//元素高度宽度概述
	//计算方式:clientHeight clientWidth innerWidth innerHeight
	//元素的实际高度+border,也不包含滚动条
	Width:function (id){
		return $$.$id(id).clientWidth
	},
	Height:function (id){
		return $$.$id(id).clientHeight
	},


	//元素的滚动高度和宽度
	//当元素出现滚动条时候,这里的高度有两种:可视区域的高度 实际高度(可视高度+不可见的高度)
	//计算方式 scrollwidth
	scrollWidth:function (id){
		return $$.$id(id).scrollWidth
	},
	scrollHeight:function (id){
		return $$.$id(id).scrollHeight
	},


	//元素滚动的时候 如果出现滚动条 相对于左上角的偏移量
	//计算方式 scrollTop scrollLeft
	scrollTop:function (id){
		return $$.$id(id).scrollTop
	},
	scrollLeft:function (id){
		return $$.$id(id).scrollLeft
	},

	//获取屏幕的高度和宽度
	screenHeight:function (){
		return  window.screen.height
	},
	screenWidth:function (){
		return  window.screen.width
	},


	//文档视口的高度和宽度
	wWidth:function (){
		return document.documentElement.clientWidth
	},
	wHeight:function (){
		return document.documentElement.clientHeight
	},
	//文档滚动区域的整体的高和宽
	wScrollHeight:function () {
		return document.body.scrollHeight
	},
	wScrollWidth:function () {
		return document.body.scrollWidth
	},
	//获取滚动条相对于其顶部的偏移
	wScrollTop:function () {
		var scrollTop = window.pageYOffset|| document.documentElement.scrollTop || document.body.scrollTop;
		return scrollTop
	},
	//获取滚动条相对于其左边的偏移
	wScrollLeft:function () {
		var scrollLeft = document.body.scrollLeft || (document.documentElement && document.documentElement.scrollLeft);
		return scrollLeft
	}
})

//封装属性框架
$$.extend($$,{
	//属性操作,获取属性的值,设置属性的值 at tr('test','target','_blank')
	attr:function(content, key, value){
	var dom =  $$.$all(content);
//        如果是数组  比如tag
	if(dom.length){
		if(value){
			for(var i= 0, len=dom.length; i <len; i++){
				dom[i].setAttribute(key, value);
			}
		}else{
			return dom[0].getAttribute(key);
		}
//            如果是单个元素  比如id
	}else{
		if(value){
			dom.setAttribute(key, value);
		}else{
			return dom.getAttribute(key);
		}
	}
},
    //动态添加和移除class
    addClass:function (context, name){
    var doms = $$.$all(context);
    //如果获取的是集合
    if(doms.length){
        for(var i= 0,len=doms.length;i<len;i++){
            addName(doms[i]);
        }
        //如果获取的不是集合
    }else{
        addName(doms);
    }
    function addName(dom){
        dom.className = dom.className + ' ' + name;
    }
},
    removeClass:function (context, name){
    var doms = $$.$all(context);
    if(doms.length){
        for(var i= 0,len=doms.length;i<len;i++){
            removeName(doms[i]);
        }
    }else{
        removeName(doms);
    }
    function removeName(dom){
        dom.className = dom.className.replace(name, '');
    }
},
	//判断是否有
	hasClass:function(context,name){
	var doms = $$.$all(context)
	var flag = true;
	for(var i= 0,len=doms.length;i<len;i++){
		flag = flag && check(doms[i],name)
	}

	return flag;
	//判定单个元素
	function check(element,name){
		return -1<(" "+element.className+" ").indexOf(" "+name+" ")
	}
},
	//获取
	getClass:function (id){
	var doms = $$.$all(id)
	return $$.trim(doms[0].className).split(" ")
}
})

//内容框架
$$.extend($$,{
	//innerHTML的函数版本
	html:function (context, value){
		var doms = $$.$all(context);
		//设置
		if(value){
			for(var i= 0,len= doms.length; i<len; i++){
				doms[i].innerHTML = value;
			}
		}else{
			return doms[0].innerHTML
		}
}
})

//封装DOM框架 -- 放在后面
$$.extend($$,{
	//选择
	eq:function(){},
	first:function(){},
	last:function(){},
	//元素的插入和删除 克隆
	append:function(){},
	empty:function(){},
	remove:function(){},
	clone:function(){}
})

//封装json框架
$$.extend($$,{
	//将json转换成字符串
	sjson:function (json) {
		return JSON.stringify(json);
	},
    //将字符串转成json
	json:function (str) {
		return eval(str);
	}
})

//缓存框架 - 内存篇
$$.cache = {
    data:[],
    get:function(key){
        console.log('111')
        var value = null;
        console.log(this.data)
        for(var i= 0,len=this.data.length;i<len; i++){
            var item = this.data[i]
            if (key == item.key) {
                value = item.value;
            }
        }
        console.log('get'+value)
        return value;
    },
    add:function(key,value){
        var json= { key: key, value: value};
        this.data.push(json);
    },
    delete:function(key){
        var status = false;
        for(var i= 0,len=this.data.length;i<len; i++){
            var item = this.data[i]
            // 循环数组元素
            if (item.key.trim() == key) {
                this.data.splice(i, 1);//开始位置,删除个数
                status = true;
                break;
            }
        }
        return status;
    },
    update:function(key,value){
        var status = false;
        // 循环数组元素
        for(var i= 0,len=this.data.length;i<len; i++){
            var item = this.data[i]
            if (item.key.trim() === key.trim()) {
                item.value = value.trim();
                status = true;
                break;
            }
        }
        return status;
    },
    isExist:function(key){
        for(var i= 0,len=this.data.length;i<len; i++){
            var item = this.data[i]
            if (key === item.key) {
                return true;
            }else{
                return false;
            }
        }
    }
}

//cookie框架
$$.cookie = {
    //设置coolie
    setCookie: function (name,value,days,path){
    var name = escape(name);
    var value = escape(value);
    var expires = new Date();
    expires.setTime(expires.getTime() + days*24*60*60*1000);
    path = path == "" ? "" : ";path=" + path;
    _expires = (typeof hours) == "string" ? "" : ";expires=" + expires.toUTCString();
    document.cookie = name + "=" + value + _expires + path;
},
    //获取cookie值
    getCookie:function (name){
    var name = escape(name);
    //读cookie属性,这将返回文档的所有cookie
    var allcookies = document.cookie;

    //查找名为name的cookie的开始位置
    name += "=";
    var pos = allcookies.indexOf(name);
    //如果找到了具有该名字的cookie,那么提取并使用它的值
    if (pos != -1){                                             //如果pos值为-1则说明搜索"version="失败
        var start = pos + name.length;                  //cookie值开始的位置
        var end = allcookies.indexOf(";",start);        //从cookie值开始的位置起搜索第一个";"的位置,即cookie值结尾的位置
        if (end == -1) end = allcookies.length;        //如果end值为-1说明cookie列表里只有一个cookie
        var value = allcookies.substring(start,end);  //提取cookie的值
        return unescape(value);                           //对它解码
    }
    else return "";                                             //搜索失败,返回空字符串
},
    //删除cookie
    deleteCookie:function (name,path){
    var name = escape(name);
    var expires = new Date(0);
    path = path == "" ? "" : ";path=" + path;
    document.cookie = name + "="+ ";expires=" + expires.toUTCString() + path;
}
}

//本地存储框架
$$.store = (function () {
    var api               = {},
        win               = window,
        doc               = win.document,
        localStorageName  = 'localStorage',
        globalStorageName = 'globalStorage',
        storage;

    api.set    = function (key, value) {};
    api.get    = function (key)        {};
    api.remove = function (key)        {};
    api.clear  = function ()           {};

    if (localStorageName in win && win[localStorageName]) {
        storage    = win[localStorageName];
        api.set    = function (key, val) { storage.setItem(key, val) };
        api.get    = function (key)      { return storage.getItem(key) };
        api.remove = function (key)      { storage.removeItem(key) };
        api.clear  = function ()         { storage.clear() };

    } else if (globalStorageName in win && win[globalStorageName]) {
        storage    = win[globalStorageName][win.location.hostname];
        api.set    = function (key, val) { storage[key] = val };
        api.get    = function (key)      { return storage[key] && storage[key].value };
        api.remove = function (key)      { delete storage[key] };
        api.clear  = function ()         { for (var key in storage ) { delete storage[key] } };

    } else if (doc.documentElement.addBehavior) {
        function getStorage() {
            if (storage) { return storage }
            storage = doc.body.appendChild(doc.createElement('div'));
            storage.style.display = 'none';
            // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
            // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
            storage.addBehavior('#default#userData');
            storage.load(localStorageName);
            return storage;
        }
        api.set = function (key, val) {
            var storage = getStorage();
            storage.setAttribute(key, val);
            storage.save(localStorageName);
        };
        api.get = function (key) {
            var storage = getStorage();
            return storage.getAttribute(key);
        };
        api.remove = function (key) {
            var storage = getStorage();
            storage.removeAttribute(key);
            storage.save(localStorageName);
        }
        api.clear = function () {
            var storage = getStorage();
            var attributes = storage.XMLDocument.documentElement.attributes;;
            storage.load(localStorageName);
            for (var i=0, attr; attr = attributes[i]; i++) {
                storage.removeAttribute(attr.name);
            }
            storage.save(localStorageName);
        }
    }
    return api;
})();

 

转载于:https://my.oschina.net/yongxinke/blog/851989

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值