大致介绍

学习了妙味,用原生的JavaScript实现jQuery中的某些部分功能
定义自己的函数库lQuery
$()选择器的实现
jQuery是面向对象的,所以自己编写的也要是面向对象的,看看基本的结构
// 定义lQuery对象
function lQuery(lArg){
}
function lQ(lArg){
return new lQuery(lArg);
}
// css()方法
lQuery.prototype.css = function(){};
// html()方法
lQuery.prototype.html = function(){};
先来仿写jQuery中的$(函数)的方法
// 定义lQuery对象
function lQuery(lArg){
// 用typeof判断参数的类型是 function 、
switch( typeof lArg){
case 'function':
// 如果采用这种写法,给lQ绑定相同的函数,但是只会执行一次
// window.onload = lArg;
// break;
}
}
如果写出这样的函数就会出现问题
lQ(function(){
alert(1);
});
lQ(function(){
alert(2);
});
这样就只会弹出'2',但是在jQuery中都会弹出,所以上面的方法不对,我们采用事件绑定的形式来解决这个问题
// 绑定事件函数
function lQbind(obj,eventName,fn){
// 标准浏览器
if(obj.addEventListener){
obj.addEventListener(eventName,fn,false);
}else{
// IE浏览器
obj.attachEvent('on'+eventName,fn);
}
}
可以使用这样调用
switch( typeof lArg){
case 'function':
// 如果采用这种写法,给lQ绑定相同的函数,但是只会执行一次
// window.onload = lArg;
// break;
lQbind(window,'load',lArg);
break;
}
仿写jQuery中的$('.div')、$('#div')、$('div')三种方法
这三种方法的区别是第一个字符的不同,所以我们可以根据第一个字符的不同来进行区别对待
先来仿写$('.div')
// '.div' case '.': this.elements = getClass(document,lArg.substring(1)); break;
由于getElementsByClassName()是HTML5里的方法,像IE8以下不兼容所以我们自己写了一个简单的getClass方法
// 获取class属性
function getClass(obj,name){
var arr = [];
var elems = obj.getElementsByTagName('*');
for(var i=0;i<elems.length;i++){
if(elems[i].className == name){
arr.push(elems[i]);
}
}
return arr;
}
仿写$('#div')
case '#': this.elements.push(document.getElementById(lArg.substring(1))); break; // '.div' case '.':
仿写$('div')
default: // getElementsByTagName返回的是一个类数组NodeList,为了防止以后出现麻烦,要把他转为一个 // 数组 this.elements = toArray(document.getElementsByTagName(lArg)); break;
由于getElementsByTagName返回的是一个类数组NodeList,为了防止以后出现麻烦,要把他转为一个数组,自定义了一个toArray方法
// 将一个类数组转为真正的数组
function toArray(lickArr){
var arr = [];
for(var i=0;i<lickArr.length;i++){
arr.push(lickArr[i]);
}
return arr;
}
仿写$(对象)的方法
// window document
case 'object':
this.elements.push(lArg);
break;
html()的实现
html()方法分为有参和无参
// html()方法
lQuery.prototype.html = function(str){
if(str){ //设置
for(var i=0;i<this.elements.length;i++){
this.elements[i].innerHTML = str;
}
}else{
return this.elements[0].innerHTML;
}
return this;
};
on()方法的实现
利用前面实现的绑定函数可以很容易的实现
lQuery.prototype.on = function(eventName,fn){
for(var i=0;i<this.elements.length;i++){
lQbind(this.elements[i],eventName,fn);
}
}
click()和mouseover()方法的实现
利用on()方法可以容易的实现
// click()方法
lQuery.prototype.click = function(fn){
this.on('click',fn);
return this;
}
// mouseover()方法
lQuery.prototype.mouseover = function(fn){
this.on('mouseover',fn);
return this;
}
hide()和show()方法的实现
// hide()方法
lQuery.prototype.hide = function(){
for(var i=0;i<this.elements.length;i++){
this.elements[i].style.display = 'none';
}
return this;
}
// show()方法
lQuery.prototype.show = function(){
for(var i=0;i<this.elements.length;i++){
this.elements[i].style.display = 'block';
}
return this;
}
hover()方法的实现
// hover()方法
lQuery.prototype.hover = function(fnover,fnout){
this.on('mouseover',fnover);
this.on('mouseout',fnout);
return this;
}
css()方法的实现
实现$('div').css('width')和$('div').css('width','200px')
lQuery.prototype.css = function(attr,value){
if(arguments.length == 2){
for(var i=0;i<this.elements.length;i++){
this.elements[i].attr = value;
}
}
if(arguments.length == 1){
return getStyle(this.elements[0],attr);
}
}
定义了getStyle()方法是为了能找到行内样式以外的样式
// 获取属性
function getStyle(obj,attr){
if(obj.currentStyle[attr]){
obj.currentStyle[attr];
}else{
obj.getComputedStyle(obj,false)[attr];
}
}
attr()方法的实现
用了和css()不同的方法
// attr()方法
lquery.prototype.attr = function(attr,value){
if(arguments.length == 2){ //设置
for(var i=0;i<this.elements.length;i++){
this.elements[i].setAttribute(attr,value);
}
}
else if(arguments.length == 1){ //获取
return this.elements[0].getAttribute(attr);
}
return this;
};
eq()方法的实现
实现$('div').eq(1)
由于eq()方法返回的对象要操作许多lQuery的方法,所以返回的对象必须是lQuery对象
lQuery.prototype.eq = function(num){
return lQ(this.elements[num]);
};
index()方法的实现
实现$('div').index() 返回这个元素在同辈元素中的位置
lQuery.prototype.index = function(){
var elems = this.elements[0].parentNode.children;
for(var i=0;i<elems.length;i++){
if( elems[i] == this.elements[0] ){
return i;
}
}
};
阻止默认事件和阻止事件冒泡
在jQuery中 return false 是阻止默认事件和事件冒泡,所以我们要对lQbind函数进行修改,通过判断绑定的函数的返回值是否为false来判断是否要进行阻止默认事件和阻止事件冒泡
function lQbind(obj,events,fn){
if(obj.addEventListener){
obj.addEventListener(events,function(ev){
if( fn() == false ){
ev.preventDefault();
ev.cancelBubble = true;
}
},false);
}
else{
obj.attachEvent('on'+events,function(){
if( fn() == false ){
window.event.cancelBubble = true;
return false;
}
});
}
}
find()方法的实现
仿写$('div').find('.box')和$('div').find('#box')方法
这里涉及到通过判断find()参数第一个字符的方法来进行不同的操作和$()方法差不多,在循环时要使用concat()方法来连接数组,最后返回一个lQuery对象
lQuery.prototype.find = function(sel){
var arr = [];
if( sel.charAt(0) == '.' ){
for(var i=0;i<this.elements.length;i++){
arr = arr.concat(getClass( this.elements[i] , sel.substring(1) ));
}
}
else{
for(var i=0;i<this.elements.length;i++){
arr = arr.concat(toArray(this.elements[i].getElementsByTagName(sel)));
}
}
return lQ(arr);
};
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# 原生js
# jQuery
# jQuery实现隔行变色的方法分析(对比原生JS)
# 原生js仿jquery实现对Ajax的封装
# 原生JS取代一些JQuery方法的简单实现
# 原生js仿jquery一些常用方法(必看篇)
# 原生js封装的一些jquery方法(详解)
# 原生js实现jquery函数animate()动画效果的简单实例
# 原生js仿jquery animate动画效果
# 原生js和jquery分别实现横向导航菜单效果
# 原生JS和jQuery版实现文件上传功能
# 使用jQuery或者原生js实现鼠标滚动加载页面新数据
# 原生js和jQuery实现淡入淡出轮播效果
# 原生js与jQuery实现简单的tab切换特效对比
# 绑定
# 仿写
# 第一个
# 只会
# 的是
# 要把
# 弹出
# 方法来
# 先来
# 为了防止
# 面向对象
# 自己的
# 就会
# 很容易
# 我们可以
# 用了
# 三种
# 写了
# 自定义
# 可以使用
相关文章:
网站制作员失业,怎样查看自己网站的注册者?
建站之星安装模板失败:服务器环境不兼容?
制作营销网站公司,淘特是干什么用的?
深圳网站制作平台,深圳市做网站好的公司有哪些?
C#如何在一个XML文件中查找并替换文本内容
企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?
,怎么用自己头像做动态表情包?
购物网站制作公司有哪些,哪个购物网站比较好?
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
如何在阿里云域名上完成建站全流程?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
网站好制作吗知乎,网站开发好学吗?有什么技巧?
盘锦网站制作公司,盘锦大洼有多少5G网站?
如何快速选择适合个人网站的云服务器配置?
模具网站制作流程,如何找模具客户?
外贸公司网站制作,外贸网站建设一般有哪些步骤?
制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
,石家庄四十八中学官网?
北京网站制作公司哪家好一点,北京租房网站有哪些?
宝塔新建站点报错如何解决?
如何在万网自助建站平台快速创建网站?
测试制作网站有哪些,测试性取向的权威测试或者网站?
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
佛山企业网站制作公司有哪些,沟通100网上服务官网?
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?
如何在自有机房高效搭建专业网站?
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
宝塔建站后网页无法访问如何解决?
高性价比服务器租赁——企业级配置与24小时运维服务
如何破解联通资金短缺导致的基站建设难题?
宝塔面板创建网站无法访问?如何快速排查修复?
网站设计制作公司地址,网站建设比较好的公司都有哪些?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
长沙企业网站制作哪家好,长沙水业集团官方网站?
油猴 教程,油猴搜脚本为什么会网页无法显示?
如何安全更换建站之星模板并保留数据?
制作门户网站的参考文献在哪,小说网站怎么建立?
建站之星如何实现PC+手机+微信网站五合一建站?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
建站主机服务器选型指南与性能优化方案解析
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
建站之星代理如何优化在线客服效率?
*请认真填写需求信息,我们会在24小时内与您取得联系。