首页 > 编程语言 >原生JavaScript框架设计(一):整合JS函数

原生JavaScript框架设计(一):整合JS函数

时间:2023-09-10 13:00:36浏览次数:45  
标签:原生 function get JavaScript results JS push context var

本篇为回顾js时总结,诣在整理JS中常用知识点,剖析其规律。 模仿jQuery,简单一些,特定功能,像apply函数、getElementXXX函数等浏览器函数都没有实现,直接套用。


创建 common.js

//自定义实现push函数
var myPush=function(target,els){
	var j=target.length,
		i=0;
	while((target[j++]=els[i++])){}
	target.length=j-1;
};

var getTag=function(tag,context,results=[]){
	//处理“IE中push和apply连用会报错”的问题——用自定义push函数
	try{
		results.push.apply(results,context.getElementsByTagName(tag))
	}catch(e){
		myPush(results,context.getElementsByTagName(tag))
	}
	return results;
};

var getId=function(id,results=[]){
	results.push(document.getElementById(id));
	return results;
};

var getClass=function(className,context,results=[]){
	//关于class,有两种形式:1、attribute;2、直接属性
	if(document.getElementsByClassName){
		results.push.apply(results,context.getElementsByClassName(className))
	}else{
		each(getTag('*',context),function(i,v){
			if((' '+v.className+' ').indexOf(' '+className+' ')!==-1){
				results.push(v);
			}else{
				return false;
			}
		});
	}
	return results;
};

//自定义实现each函数
var each=function(arr,fn){
	for(var i=0;i<arr.length;i++){
		if(fn.call(arr[i],i,arr[i])===false){
			break;
		}
	}
};

//通用的方法——被调用的函数
var get=function(selector,context=document,results=[]){
	var requickExpr=/^(?:#([\w-]+)|\.([\w-]+)|([\w]+)|(\*))$/,
		m=requickExpr.exec(selector);
	if(m){
		//将元素节点变为“数组形式”集合
		if(context.nodeType){context=[context]};
		//如果元素是字符串形式,那么就先将其相关的所有节点的“数组”取出来(递归)
		if(typeof context==='string'){
			context=get(context);
		}
		each(context,function(i,v){
			if(m[1]){
				results=getId(m[1],results);
			}else if(m[2]){
				results=getClass(m[2],context,results);
			}if(m[3]){
				results=getTag(m[3],context,results);
			}if(m[4]){
				results=getTag(m[4],context,results);
			}
		});
	}
	return results;
}

使用时,先将common.js导入:

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="utf-8">
		<title>改变元素样式</title>
		<script src="./common.js"></script>
	</head>
	<body>
		<div class="c3">
			<div class="c rect"></div>
		</div>
		<div class="c3">
			<div class="c1 rect"></div>
			<div class="c rect"></div>
		</div>
		<script>
			each(get('.c','.c3'),function(){
				this.style.backgroundColor='pink';
			});
			
			//也可以这样:
			each(get('.c',get('.c3')),function(){
				this.style.backgroundColor='red';
			});
			
			//或者:
			get('.c',get('.c3')).style.backgroundColor='green';
		</script>
	</body>
</html>

标签:原生,function,get,JavaScript,results,JS,push,context,var
From: https://blog.51cto.com/u_15296224/7424750

相关文章

  • 无涯教程-JavaScript - COUPDAYBS函数
    描述COUPDAYBS函数返回从息票期限开始至结算日期的天数。语法COUPDAYBS(settlement,maturity,frequency,[basis])争论Argument描述Required/OptionalSettlement证券的结算日期。证券结算日期是指在发行日期之后将证券交易给买方的日期。RequiredMaturity证......
  • chrome插件:content.js、background.js, options.js, popup.js之间的通信
    目录content.js向background.js发送消息background.js向content.js发送消息options.js或popup.js向background.js传递数据总结content.js向background.js发送消息消息方向://content.js一般不直接与options.js,popup.js通信,而是与常驻的background.js通信content.js=>[back......
  • 无涯教程-JavaScript - ACCRINTM函数
    描述ACCRINTM函数返回到期时支付利息的有价证券的应计利息。语法ACCRINTM(issue,settlement,rate,par,[basis])争论Argument描述Required/OptionalIssueThesecurity'sissuedate.RequiredSettlementThesecurity'smaturitydate.RequiredRateThesecuri......
  • nodejs采集淘宝、天猫网商品详情数据以及解决_m_h5_tk令牌及sign签名验证(2023-09-09)
    一、淘宝、天猫sign加密算法淘宝、天猫对于h5的访问采用了和APP客户端不同的方式,由于在h5的js代码中保存appsercret具有较高的风险,mtop采用了随机分配令牌的方式,为每个访问端分配一个token,保存在用户的cookie中,通过cookie带回服务端分配的token,客户端利用分配的token对请求的URL......
  • 【JS】并发请求调度器实现演示
    控制多个请求的并发度,演示请求的过程和用时结果demo:https://scheduler-smoky.vercel.app/github:https://github.com/zjy4fun/scheduler   <scriptsetuplang="ts">import{ref}from'vue'classScheduler{queue:any[]maxCount:numberrunCoun......
  • Node.js+Express+Koa2开发接口学习笔记(一)
    http请求概述浏览器输入一个地址后,进行DNS解析(通过域名查找对应的IP地址),与server建立TCP连接(进行三次握手),发送http请求server接收到http请求,处理,并返回客户端(这里指浏览器)接收到返回数据,处理数据(如渲染页面,执行js)客户端与服务器的三次握手大致可以理解为:第一次握手:客......
  • 无涯教程-JavaScript - OCT2HEX函数
    描述OCT2HEX函数将八进制数转换为十六进制。语法OCT2HEX(number,[places])争论Argument描述Required/OptionalNumber您要转换的八进制数。数字不得超过10个八进制字符(30位)。数字的最高有效位是符号位。其余的29位是幅度位。负数使用二进制补码表示。Required......
  • 什么是 Angular 应用 angular.json 中的 assets 数组
    在Angular项目中,angular.json是一个非常重要的配置文件,用于定义和管理项目的各种设置和构建选项。其中,assets数组是angular.json中的一个关键配置项,用于指定需要在构建后包含在应用程序中的静态资源文件和文件夹。在本文中,我将解释什么是assets数组,并提供详细示例来说明如何使用它......
  • 无涯教程-JavaScript - OCT2DEC函数
    描述OCT2DEC函数将八进制数转换为十进制数。语法OCT2DEC(number)争论Argument描述Required/OptionalNumber您要转换的八进制数。数字不得超过10个八进制字符(30位)。数字的最高有效位是符号位。其余的29位是幅度位。负数使用二进制补码表示。RequiredNotes如......
  • Android中使用GSON解析JSON数据
    Android中使用GSON解析JSON数据,以下为java代码。我这个是Unity项目打包出来的android工程,工程里自带有gson的库,所以能直接用了。publicvoidStringToJsonByGson(Stringjson){Gsongs=newGson();Model1model=gs.fromJson(json,Model1.class......