简单模仿jquery的几个特性

使用了jquery之后,原生的javascript写的很少了,最近准备复习下,于是想到了自己写一点js来模拟jquery的几个核心特性。

先看页面代码:

 1 <html>
 2 <head>
 3     <title>learn jquery demo</title>
 4     <style>
 5         .box-bg{background-color:#eee;}
 6     </style>
 7     <script type="text/javascript" src="jquery-learn.js"></script>
 8     <!--
 9     <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
10     -->
11     <script type="text/javascript">
12         $(function(){
13             $("#btn").click(function(){
14                 var text=$(".box").text();
15                 var htmlText="<h3>" + text + "jquery" + "</h3>"
16                 $(".box").html(htmlText).addClass("box-bg");
17             });
18         });
19     </script>
20 </head>
21 <body>
22     <a id="btn" href="#">click me.</a>
23     </br></br>
24
25     <p class="box">Hello</p>
26     <p class="box">Hello</p>
27     <p class="box">Hello</p>
28 </body>
29 </html>

页面效果是点击超链接后设置三个p标签中的内容,然后添加一个css class使背景变成灰色,但并没有用到jquery库。

再来看下我的js代码(jquery-learn.js):

 1 function JQuery(selector){
 2
 3     this.selector=selector;
 4     this.domEles=[];
 5
 6     //get domEles
 7     if(this.selector.indexOf("#")==0){                //id selector
 8         var id=this.selector.replace("#","");
 9         var ele=document.getElementById(id);
10         this.domEles.push(ele);
11     }else if(this.selector.indexOf(".")==0){        //class selector
12         var cls=this.selector.replace(".","");
13         var eles=document.getElementsByClassName(cls);
14         for(var i=0;i<eles.length;i++){
15             this.domEles.push(eles[i]);
16         }
17     }
18
19     this.click=function(func){
20         if (func) {
21             for(var i = 0;i<this.domEles.length;i++){
22                 this.domEles[i].onclick=func;
23             }
24         }
25         return this;
26     }
27
28     this.text=function(txt){
29         if(txt){
30             for(var i=0;i<this.domEles.length;i++){
31                 this.domEles[i].innerText=txt;
32             }
33             return this;
34         }else{
35             //jquery中好像是返回的多个元素的文本内容,这里只返回第一个匹配元素的文本内容
36             if(this.domEles.length>0)
37                 return this.domEles[0].innerText;
38         }
39     }
40
41     this.html=function(html){
42         if(html){
43             for(var i=0;i<this.domEles.length;i++){
44                 this.domEles[i].innerHTML=html;
45             }
46             return this;
47         }else{
48             if(this.domEles.length>0)
49                 return this.domEles[0].innerHTML;
50         }
51     }
52
53     this.addClass=function(className){
54         if(!className||className.length<1) throw "className";
55
56         for(var i=0;i<this.domEles.length;i++){
57             var strCls=this.domEles[i].attributes["class"].value;
58             var classNames=strCls.split(" ");
59             var objCls=[];
60             for(var j=0;j<classNames.length;j++){
61                 if(classNames[j]==""||classNames[j]==className)continue;
62
63                 objCls.push(classNames[j]);
64             }
65             objCls.push(className);
66             this.domEles[i].attributes["class"].value=objCls.join(" ");
67         }
68
69         return this;
70     }
71 }
72
73 function $(){
74
75     if (arguments.length<1) {throw "$函数缺少参数!"};
76
77     if(typeof(arguments[0])=="function"){
78         window.onload=arguments[0];
79     }else if(typeof(arguments[0])=="string"){
80         //这里不考虑创建元素的情况
81         return new JQuery(arguments[0]);
82     }
83 }
84
85 /*
86
87     1.参数重载一般是通过参数类型(typeof)和长度(arguments.length)的判断;
88     2.浏览器兼容问题一般是通过方法可用性检查;
89
90
91 */

做了什么:

1.注册文档加载完成的事件处理程序;

  $()函数中判断参数是否是一个函数,如果是就将该函数注册给window.onload时间。
2.id、class选择器;

  利用document.getElementById和document.getElementByClassName函数实现。
3.click事件绑定函数;

  分别给匹配的每一个dom元素绑定onclick事件。
4.text函数获取元素文本;

  获取第一个(或设置所有)匹配元素的innerText属性。
5.html函数设置元素html内容;

  获取或设置所有匹配元素的innerHTML属性。
6.addClass函数为元素添加css class;

  向所有匹配元素中添加一个class。
7.链式操作;

  jquery对象的方法最后返回this,函数式编程:$("").html("").addClass("")。
8.隐式迭代

  默认的将操作作用在匹配的所有元素上,关键在于jquery对象中有一个存储dom对象的数组:domELes。

说明:jquery的强大真的可以让我们写很少的代码来实现需要的效果,但不要用了jquery忘了javascript。

当然这里的简单实现目的只是为了展示jquery的几个特性的大致实现原理,代码当中也有很多不妥之处,这里也没有模拟jquery的dom操作、动画、浏览器兼容、Ajax等重要特性。

时间: 2024-09-04 15:20:58

简单模仿jquery的几个特性的相关文章

javascript之模仿jQuery实现框架雏形

JQuery是如此的强大,所以我决定模仿jQuery造一个轮子,边造轮子边学习jQuery是如何利用各种技巧实现那些非常强大的功能的.既然是模仿jQuery,我决定将新的框架命名为jqc,jQuery copy之意.那么接下来让我们从零实现一个框架的雏形吧,如有谬误有劳告知. 沙箱模式 在一切的开始,我们需要定义一个沙箱来将我们的所有代码放在里面,只留部分接口供外部调用.在沙箱内的所有变量都属于局部变量,不会污染全局变量环境. (function(window,undefined){ var j

了解JQuery的事件绑定特性和事件命名空间机制,编写更好、更灵活的事件处理代码

JQuery中的bind()和unbind(),提供了事件的绑定和取消机制,既可以绑定html默认支持的事件,也能够绑定自定义的事件.JQuery支持自定义事件,这显然给编程带来了极大的灵活性.下面就一起学习下,jquery事件处理的一些特性. 1.JQuery中事件可以重复绑定,不会覆盖. $("#button1").bind("click",function(){ alert("func1"); }); $("#button1&qu

图片延迟加载并等比缩放,一个简单的JQuery插件

使用方法: $(".viewArea img").zoom({height:74,width:103}); (function($){    $.fn.zoom = function(settings){                //一些默认配置:                settings = $.extend({                    height:0,                    width:0,                    load

简单的jQuery代码

用户名: 密 码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>简单的jQuery代码</title> <!--引入jQuery脚本--> <script src="scripts/jquery-3.1.1.js" type="text/javascri

简单模仿QQ聊天界面

首先看一下最终的效果,显示了消息时间,用户昵称,用户头像. 大致实现方法: 用最简单的ListView显示消息内容. 不同的用户使用不同的消息布局文件,例子有2个用户"Tony","Hill". 代码文件清单: 主布局文件activity_main.xml: 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools=&

【转】简单的jQuery插件开发方法

在实际开发工作中,总会碰到像滚动,分页,日历等展示效果的业务需求,对于接触过jQuery以及熟悉jQuery使用的人来说,首先想到的肯定是寻找现有的jQuery插件来满足相应的展示需求.目前页面中常用的一些组件,都有多种jQuery插件可供选择,网络上也有很多专门收集jQuery插件的网站.利用jQuery插件确实可以给我们的开发工作带来便捷,但是如果只是会简单使用,而对其中的原理不甚了解,那么在使用过程中碰到问题或者对插件进行定制开发时就会有诸多疑惑.本文的目的就是可以快速了解jQuery插件

编写一个简单的Jquery插件

1.实现内容 定义一个简单的jquery插件,alert传递进来的参数 2.插件js文件(jquery.showplugin.js) (function ($) { //定义插件中的方法 var methods = { //Object showName: function (name) { alert('Name:' + name); }, showAge: function (age) { alert('Age' + age); } }; //method方法名 $.fn.showplugi

简单的jquery点击弹出背景变暗遮罩效果

工作中自己写了一个简单的jquery点击弹出背景变暗遮罩效果,非常好用......只把关键代码贴出来.并实现了点击空白处隐藏弹出层效果. js代码如下: <script type="text/javascript">  $(document).ready(function(){   $(".tkyy").click(function(event){      event.stopPropagation(); //停止事件冒泡    $(".ma

简单的Jquery表单验证

本段代码举了一个最简单的表单验证实例,就是判断输入框是否为空而已,大家可以根据这个原理,加入正则表达式判断,实现各种功能强大的表单验证功能 <html>    <head>        <title>Validate empty fields</title>        <style type="text/css">            body{font-family:"Trebuchet MS",