简单模拟jQuery创建对象的方法,以及封装一个js动画框架

今天无事点开了N年未点开的慕课网,看了一个js动画框架的视频,心血来潮用jQuery的方法封装了一下,虽然不如jQuery,但是还是有点点所获。

什么都不说,直接上代码:

/**

 * 这是框架的唯一对象,使用jQuery框架的创建方法

 * @class MyAnimation

 * @constructor 

 */
function MyAnimation(Selector){
	//返回MyAnimation原型链中init()方法创建的对象
	return new MyAnimation.prototype.init(Selector);
}

/**

 * 这是对象的初始化方法

 * @method init

 * @param {string} Selector 选择对象

 * @return 

 */
function init(Selector){
  var el = null;
  var identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+";
  var match = {
	"all": new RegExp( "^\\.(" + identifier + ")" )
  }; 		

  //匹配
  if(match["all"].exec(Selector) != null){
	  el = document.querySelectorAll(Selector);
  }else{
	  el = document.querySelector(Selector);
  }

 /**
  *	实现css样式的改变

  * @method changeStyle

  * @for MyAnimation

  * @param {Object} obj 元素对象(带timer)

  * @param {json} json json对象格式 --> {attr(String):String}(同时变化的属性和值)

  * @param {function} callback 回调函数,用于链式动画

  * @return {void}

  */  //jQuery --> animate
   this.changeStyle = function(obj, json, callback){
	 clearInterval(obj.timer);
	 var _this = this; //保存init()
	 //一个定时器监视所有属性变化
	 obj.timer = setInterval(function(){
		 var flag = true; //判断是否所以的运动都完成了
		 for(var attr in json){
			 //初始值
			var icur = 0;
			//判断属性,分别处理
			if(attr == "opacity"){
				//0.07 * 100 --> 7.000000001 --> round --> 7
				icur = Math.round(parseFloat(_this.getStyle(obj, attr)) * 100);
			}else{
				//console.log(_this);
				icur = parseInt(_this.getStyle(obj, attr));
			}
			//计算速度
			var speed = (json[attr] - icur) / 8;
			speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
			/*
			以下代码是不对的,因为当有一个运动到达目标,就关闭了定时器
			if(icur == json[target]){
				clearInterval(timer);
			}
			*/
			//有运动未完成就会设置为false
			if(icur != json[attr]){
				flag = false;
			}
			if(icur == "opacity"){
				obj.style.filter = ‘alpha(opacity:‘+ icur + speed +‘)‘;
				obj.style.opacity = (icur + speed) / 100;
			}else{
				obj.style[attr] = icur + speed + ‘px‘;
			}
		}
		//已经遍历了attr,判断是否所有运动都完成了
		if(flag){
			clearInterval(obj.timer);
			//回调
			if(callback){
				console.log(_this);
				callback(_this);
			}
		}
	 }, 30);
 }
 /**

  * 获取style属性值

  * @method getStyle

  * @for MyAnimation  

  * @param {Object} obj 元素对象  

  * @param {String} attr 元素对象属性值

  */
 this.getStyle = function(obj,attr){
	 if(obj.currentStyle){
		 return obj.currentStyle[attr];
	 }else{
		 return getComputedStyle(obj,false)[attr];
	 }
 }
}

MyAnimation.prototype.init = init;
//使init()创建的对象指向MyAnimation
MyAnimation.prototype.init.prototype = MyAnimation.prototype;

//创建一个名为MA的MyAnimation外部对象引用
var MA = window.MyAnimation;  

原文地址:https://www.cnblogs.com/githubMYL/p/8654677.html

时间: 2024-10-06 14:30:19

简单模拟jQuery创建对象的方法,以及封装一个js动画框架的相关文章

使用jquery中$.each()方法来循环一个数据列表

定义和用法 jQuery.each() 函数用于遍历指定的对象和数组. 语法 $.each( object, callback ) 参数 描述 object Object类型 指定需要遍历的对象或数组. callback Function类型 指定的用于循环执行的函数. 通过这个方法可以将工作中遇到的数据列表如商城里面的商品列表等很好的进行循环,简单方便,下面就是我写的一个案例: 当然这个这个数组对象是我自己模拟的,实际工作中我们只需要根据后台给的接口来进行操作. html: <div clas

搜索自动提示的简单模拟JQuery

使用jQuery实现类似于百度搜索时的自动完成功能,界面效果 所示. 首先在输入框上注册keyup事件,然后在事件中通过AJAX获取JSON对象.取得数据后,每一项数据创建一个li标签,在标签上注册click事件,这样当我们点击每一项的时候,就可以响应事件.键盘导航的关键是记录当前高亮的索引值,根据索引值来调整背景高亮.显示下拉列表的位置要根据输入框的位置来设置,当浏览器的大小改变时,随时调整下拉列表的位置. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML

简单模拟 jQuery data函数

通过给元素分配一个属性 data + 时间戳,确定是否有缓存,再根据 data 的全局 id 值 存储/获取 缓存的数据 html: <!DOCTYPE html> <html> <head>     <meta charset="utf-8">     <title>demo</title> </head> <body> <div id="abc1"> aa

Nodejs封装一个类似express框架的路由

var http=require('http'); var ejs=require('ejs'); var app=require('./model/express-route.js'); console.log(app); http.createServer(app).listen(3000); app.get('/',function(req,res){ var msg='这是数据库的数据' ejs.renderFile('views/index.ejs',{msg:msg},functio

封装一个Js 对象 生成Json

<script src="~/Content/Scripts/jquery-1.11.3.min.js"></script> <script> $(function () { var data = { GoThroughNo: "ABC00001", AwbList: [] }; for (var i = 0; i < 10; i++) { var hawbMapping = new Object(); hawbMappin

js框架封装,模拟jQuery封装

模拟jQuery框架,利用原生的js技术,封装一个js框架,以加深对jQuery的常用api的使用和面向对象原理的理解:一:结构部分首先利用闭包,构造一个自执行函数,然后利用选择器函数Sizzle,获取dom元素:其后设置入口函数jQuery,返回一个F的实例:然后对jQuery.prototype进行设置:其后修改F的原型指向jQuery的原型,最后暴露出去两个接口$和jQuery:二:jQuery.fn.extend = jQuery.extend = function(){}通过向jQue

HTML5第8次课堂笔记( 模拟form表单提交数据,xml的解析,jQuery的Ajax方法使用, mui的ajax)

HTML5第8次课堂笔记 1.  模拟form表单提交数据:(get方式) <body> <formmethod="get"action="DataTest7"> <inputtype="text"name="uname"value="yang"id="myname"><br/> <inputtype="password&q

jQuery通用遍历方法each的实现

each介绍 jQuery 的 each 方法,作为一个通用遍历方法,可用于遍历对象和数组. 语法为: jQuery.each(object, [callback]) 回调函数拥有两个参数:第一个为对象的成员或数组的索引,第二个为对应变量或内容. // 遍历数组 $.each( [0,1,2], function(i, n){ console.log( "Item #" + i + ": " + n ); }); // Item #0: 0 // Item #1:

使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题

一.问题分析 对于后台系统,相比大家都有所印象,知道其中的布局结构,如图: 在这种布局中我们需要将header,sidebar,footer分开,而且对于中间部分的content内容需要动态变化,即根据不同菜单定位到不同页面,而整体布局不会变化 这种布局结构对于单纯的HTML不具备这种嵌入各部分内容的能力,所以就需要我们自己来寻找或者解决这种问题,由于jquery的兼容性和使用广度比较不错,这里 使用jquery的load方法来处理这种页面布局框架. 二.load方法详解 1.定义 $(sele