面向对象方法仿写JQuery

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8" />

<title></title>

</head>

<body>

<script type="text/javascript">

// 参数分三种情况:

// 1. 字符串:选择器

// 2. function:ready方法

// 3. 原生对象:原生对象转JQ对象

function JQ(arg){

// 用来放原生对象的数组

this.elements = [];

switch (typeof arg){

case "string":

// 通过getEle获取的有两种情况: id是一个对象,class和tag是数组

var result = getEle(arg);

if (result.length > 1) {

this.elements = result;

}else{

this.elements.push(result);

}

break;

case "function":

ready(arg);

break;

case "object":

this.elements.push(arg);

break;

}

}

// JQ对象转原生

JQ.prototype.get = function(index){

return this.elements[index];

}

// 从JQ对象中取出某一个原生对象,再转成新的JQ对象

JQ.prototype.eq = function(index){

return new JQ(this.elements[index]);

}

// $("div").eq(2).css()

// defer表示当DOM加载完成之后再去加载script标签

// IE8之前

function ready(fn){

// DOMContentLoaded;DOM加载完成之后浏览器发出的通知

if (window.addEventListener) {

window.addEventListener("DOMContentLoaded","fn","false")

}else{

var script = document.createElement("script");

script.defer = true;

var head = document.getElementsByTagName("head")[0];

script.onreadystatechange = function(){

if (script.readyState == "complete") {

fn();

}

}

}

}

// $("div")当JQ的参数只有一级选择器的时候

function getEle(selector){

// 1.去掉首尾空格

var reg = /^\s+|\s+$/g;

selector.replace(reg,"");

// 2.判断选择器类型

if (/^#/.test(selector)) {

// id选择器

return document.getElementById(selector);

}else if (/^./.test(selector)) {

// class选择器

return getEleByClass(selector);

}else{

return document.getElementsByTagName(selector);

}

}

// 因为getElementsByClassName存在兼容性,所以单独处理

function getEleByClass(selector){

if (document.getElementsByClassName) {

return document.getElementsByClassName(selector);

}else{

// IE不支持直接根据className查找,所以需要一个一个遍历

var nodes = document.getElementsByTagName("*");

var arr = [];

for (var i = 0;i < nodes.length;i++) {

if (nodes[i].className == selector) {

arr.push(nodes[i]);

}

}

return arr;

}

}

function $(arg){

return new JQ(arg);

}

</script>

</body>

</html>

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值