阅读声明:本文档仅供学习,由于个人能力有限,文档中有错漏的地方还请指出,大家共同学习。

目前在学习怎么样写jquery,模仿阶段,有兴趣的同学可以和我一起学习,共同交流,在学习的路上希望有你做伴。

在写这个jquery入口模式的时候,首先要知道有几种模式,然后再去些:
我知道的有两种:
一:
$(function () {
需要在Document文档加载完成后执行的代码
})
二:
$(document).ready(function () {
需要在Document文档加载完成后执行的代码
})

目录结构:
index.html
base.js      主要是用来写基础文件
fn.js     (主要用来写function()),用来补充base中需要使用的到的方法
index.js    用来写我们正式的代码
用base.js 和fn.js 来实现jquery的功能。

思考步骤:
先new 出$
function Base(){
} (个人习惯一般喜欢把方法放在后面)

在里面将默认的fn指定出来,ready,让其两个使用同一个方法,用if区别出两种不同的方式。
在里面js的时候需要考虑到垃圾回收。下面贴代码:

base.js文件

/* 用原生的js仿jquery来写入口*/
/* 使用$符号*/
var $ = function (args) {
return new Base (args);
}

/* 基础库 */
function Base (args) {
//创建一个数组,来保存获取节点和节点数组

//alert(typeof args); function
if (typeof args == ‘function’) {
this.ready(args);
}
};

/* 添加入口文件ready模式 */
Base.prototype.ready = function (fn) {

addDomLoaded(fn);
}

fn.js文件

(function () {
window.sys = {};
var ua = navigator.userAgent.toLowerCase();
var s;
(s = ua.match(/msie ([\d.]+)/)) ? sys.ie = s[1] :
(s = ua.match(/firefox\/([\d.]+)/)) ? sys.firefox = s[1] :
(s = ua.match(/chrome\/([\d.]+)/)) ? sys.chrome = s[1] :
(s = ua.match(/opera\/.*version\/([\d.]+)/)) ? sys.opera = s[1] :
(s = ua.match(/version\/([\d.]+).*safari/)) ? sys.safari = s[1] : 0;

if (/webkit/.test(ua)) sys.webkit = ua.match(/webkit\/([\d.]+)/)[1];

})();

/*DOM load */
function addDomLoaded(fn) {

var isReady = false;
var timer = null;

if ((sys.opera && sys.opera < 9) || (sys.firefox && sys.firefox < 3) || (sys.webkit && sys.webkit < 525)) {
//无论采用哪种,基本上用不着了
/*timer = setInterval(function () {
if (/loaded|complete/.test(document.readyState)) { //loaded是部分加载,有可能只是DOM加载完毕,complete是完全加载,类似于onload
doReady();
}
}, 1);*/
timer = setInterval(function () {
if (document && document.getElementById && document.getElementsByTagName && document.body) {
doReady();
}
}, 1);
}else if (document.addEventListener) { //W3C
//当前浏览器进到这里来了

addEvent( document, ‘DOMContentLoaded’, function() {

fn();
removeEvent(document,’DOMContentLoaded’,arguments.callee); //事件回收
});
}else if(sys.ie && sys.ie < 9) {
var timer = null;
timer = setInterval(function () {
try {
document.documentElement.doScroll(‘left’); //兼容IE9以下的浏览器
} catch (e) {};
},1);
}

function doReady () {
if (timer) clearInterval(timer);
if (isReady) return;
isReady = true;
fn();
}
}

//跨浏览器添加事件绑定
function addEvent (obj, type, fn) {
//alert(typeof obj.addEventListener); //function
if(typeof obj.addEventListener != ‘undefined’) {
obj.addEventListener(type, fn, false);
} else {
//创建一个存放事件的哈希表(散列表)
if(!obj.events) obj.events = {};
//第一次执行时执行
if(!obj.events[type]) {
//创建一个存放事件处理函数的数组
obj.events[type] = [];
//把第一次的事件处理函数先存储到第一个位置上
if(obj[‘on’+ type]) obj.events[type][0] = fn;
} else {
//同一个注册函数进行屏蔽,不添加到计数器中
if (addEvent.equal(obj.events[type], fn)) return false;
}
//从第二次开始我们用事件计数器来存储
obj.events[type][addEvent.ID++] = fn;
//执行事件处理函数
obj[‘on’ + type] = addEvent.exec;
}

}

//跨浏览器删除事件
function removeEvent(obj, type, fn) {
if (typeof obj.removeEventListener != ‘undefined’) {
obj.removeEventListener(type, fn, false);
} else {
if (obj.events) {
for (var i in obj.events[type]) {
if (obj.events[type[i]] == fn) {
delete obj.events[tyle][i];
}
}
}
}
}

index.js
$(function () {
alert(1111);
});

在使用index.html的时候注意引用js文件的顺序
<script src=”./js/fn.js”></script>
<script src=”./js/base.js”></script>
<script src=”./js/blog.js”></script>

好了,现在就可以看到我们使用jquery中$(function() {alert(1111)})和$(document).ready(function(){alert(1111)})的方式了。

文件来自于(http://dayney.com/?p=42)

用原生js模仿jquery的更多相关文章

  1. 用原生JS模仿jquery,需要HTML5的支持

    jQuery是现在最流行的JavaScript工具库. 据统计,目前全世界57.3%的网站使用它.也就是说,10个网站里面,有6个使用jQuery.如果只考察使用工具库的网站,这个比例就会上升到惊人的 ...

  2. 【前端性能】必须要掌握的原生JS实现JQuery

    很多时候,我们经常听见有人说jquery有多快多快.在这个各种类库满天飞的时候,不得不说的是,能有原生JS快吗? 是的,明显原生JS要更快,因为诸如JQuery这样的库必须要兼容各种浏览器和低版本和许 ...

  3. js模仿jquery里的几个方法parent, parentUntil, children

    有时工作需要, 也是接着上一章的方法, 用js模仿jquery里的几个方法parent, parentUntil, children. function parent(node){ return no ...

  4. 原生js和jquery实现图片轮播特效

    本文给大家分享的是使用原生JS和JQ两种方法分别实现相同的图片轮播特效,十分的实用,也非常方便大家对比学习原生js和jQuery,有需要的小伙伴可以参考下. 1)首先是页面的结构部分对于我这种左右切换 ...

  5. 表单验证--通过原生js模仿ajax的异步交互

    今天给大家带来个福利,我也是刚刚学习的很实用的一个东西,通过原生js模仿ajax的异步交互. 我的博客只是给那些新手看的大神勿喷,写的不好可留言,请指出. 因为当初自己学的时候一个问题不会找人问,知道 ...

  6. 原生js和jquery实现图片轮播特效(转)

    本文给大家分享的是使用原生JS和JQ两种方法分别实现相同的图片轮播特效,十分的实用,也非常方便大家对比学习原生js和jQuery,有需要的小伙伴可以参考下. 1)首先是页面的结构部分对于我这种左右切换 ...

  7. 原生JS和JQuery的区别

    1.原生js和jQuery的入口函数加载模式不同 原生js等页面dom加载完成并且图片等资源也加载完成之后才会执行: jQuery则是等页面dom加载完成执行,不会等图片等资源也加载完成: (也就是说 ...

  8. onload事件与ready事件的区别,原生js与jquery的区别

    onload事件与ready事件分别是原生js与jquery的入口函数 原生js入口函数写法: window.onload=function(){ } jquery入口函数写法: $(document ...

  9. 原生js仿jquery一些常用方法

    原生js仿jquery一些常用方法 下面小编就为大家带来一篇原生js仿jquery一些常用方法(必看篇).小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧   最近迷上了原 ...

随机推荐

  1. 转载:linux vi命令详解

    转自:http://www.cnblogs.com/mahang/archive/2011/09/01/2161672.html 刚开始学着用linux,对vi命令不是很熟,在网上转接了一篇. vi编 ...

  2. Fom同时控制每一行不同的状态

    代码:app_item_property.set_property('HEADER.MATTER_CODE', alterable,property_off);   实现效果:             ...

  3. javascript第三方组件

    一.一个javascript文件上传组件.转载:http://www.cnblogs.com/fumj/archive/2012/12/07/2806673.html http://fineuploa ...

  4. PS-添加前景色

    alt+Delete是填充前景色,即ps左边两个颜色块,前面的那个 ctrl+delete填充背景色

  5. (高精度运算4.7.26)POJ 1220 NUMBER BASE CONVERSION(高精度数的任意进制的转换——方法:ba1----->10进制----->ba2)

    package com.njupt.acm; import java.math.BigInteger; import java.util.Scanner; public class POJ_1220_ ...

  6. git常见问题

    一.设置git的user name和email: git config --global user.name "lei.li" git config --global user.e ...

  7. Swift基础使用方法(Swift开发之中的一个)

    昨晚苹果公布了新一代编程语言Swift,官方提供了一个iBook的说明文档.有须要的能够看下.地址:mt=11" target="_blank">https://i ...

  8. IOS编程之多线程

    IOS编程之多线程 目录 概述——对多线程的理解 IOS中实现多线程的三种方式 NSThread 线程创建 线程的同步与锁 线程间的交互 线程的操作方法 NSOperation and NSOpera ...

  9. vxworks 实时操作系统

    VxWorks 是美国 Wind River System 公司( 以下简称风河公司 ,即 WRS 公司)推出的一个实时操作系统.Tornado 是WRS 公司推出的一套实时操作系统开发环境,类似Mi ...

  10. 两种方式连接mysql

    一种方式:运行命令符后,mysql -u root -p(如果不成功,说明环境变量没配,命令行到 mysql的bin目录下,然后运行mysql -u root -p 应该成功了) 另外一种方式,直接有 ...