zoukankan      html  css  js  c++  java
  • jQuery的工作原理

    jQuery是为了改变javascript的编码方式而设计的。

    jQuery本身并不是UI组件库或其他的一般AJAX类库。

    那么它是如何实现它的声明的呢?

    先看一段简短的使用流程:

    (1)、查找(创建)jQuery对象:$(”selector”);

    (2)、调用jQuery对象的方法完成我们需要完成的工作:$(”selector”).doOurWork();

    可以说,是用最简单的编码逻辑来改变javascript编码方式的。

    有限的方法满足不了日益增长各有所需的要求,所以,必须提供jQuery对象方法的扩展能力。

    强悍的dom元素查找能力,以及随心所欲的方法扩展,这两点正是jQuery的核心所在!

    $(function(){
        $(“a“).click(function(e){
            $(this).hide(“slow“);
            return false;  
        });
    });

    //1)查找$(”a”);2)jQuery对象事件click;3)jQuery对象方法hide

    -----------------------------------------------------

    $(document).ready(
        function()
        {
            $(’#drag1′).Draggable({
                handle: “ax“,               //属性设置
                onStart: function(el,x,y){  //事件监听器设置      
                }
            });
        }
    );

    $(”#drag1″)是查找并创建一个jquery对象;然后调用Draggable方法进行拖拽初始化,在此方法调用时,传递一个”配置”对象,进行拖拽操作的初始化配置.这一”配置”的思想,极大简化了一些编码步骤,并相当直观和易懂.

    ---------------------------------

    问答:
    1) 问:为什么$(selector)之后,返回的是jQuery对象?
    答:从jQuery的源代码中,我们可以知道:var $ = jQuery.因此当我们$(selector)操作时,其实就是jQuery(selector),创建的是一个jQuery对象.当然正确的写法应该是这样的:var jq = new $(selector);而jQuery使用了一个小技巧在外部避免了new,在jquery方法内部:if ( window == this ) return new jQuery(selector);
    2) 问:为什么创建一个jQuery对象之后,我们可以这样写$(selector).each(function(index){…});进行遍历操作呢?
    答:其实jQuery(selector)方法调用时,在jQuery(selector)方法内部,最后返回的是一个数组:return this.setArray(a);而each方法体内部是一个for循环,在循环体内是这样调用的:method.call(this[i],i).
    3) 问:为什么jQuery能做到jQuery对象属性/方法/事件的插件式扩展?
    答:如果您有一些javasciprt的面向对象方面的知识,就会知道,jQuery.prototype原型对象上的扩展属性/方法和事件,将会给jQuery的对象”扩展”.基于这一点,jQuery是这样写的:jQuery.fn = jQuery.prototype.所以,当我们扩展一个插件功能时,如下:

    jQuery.fn.check = function() {
      return this.each(function() {
        this.checked = true;
      });
    };

    //实现自己的MyQuery框架
    var MyQuery = function(selector){
        if ( window == this ) return new MyQuery(selector);
        //这里只实现dom类型的简单查找,嘿嘿
        var doms = document.getElementsByTagName(selector);
        var arr = [];
        for(var i=0; i<doms .length; i++){
            arr.push(doms.item(i));
        }
        return this.setArray(arr);
    }
    MyQuery.prototype.setArray = function( arr ) {
            this.length = 0;
            [].push.apply( this, arr );
            return this;
    }
    MyQuery.fn = MyQuery.prototype;
    var $ = MyQuery;

    //插件扩展1)each
    MyQuery.fn.each = function(method){
        for(var i=0,l=this.length; i<l; i++){
            method.call(this[i],i);
        }
    }
    //插件扩展2)show
    MyQuery.fn.show = function(){
        this.each(function(i){
            alert(i+“:“+this.id+“:“+this.innerHTML);
        });
    }
    //debugger
    $(“div“).show();

  • 相关阅读:
    Redis源码分析(二十一)--- anet网络通信的封装
    leetcode 总结part1
    leetcode String to Integer (atoi)
    leetcode 165. Compare Version Numbers
    leetcode 189. Rotate Array
    leetcode 168. Excel Sheet Column Title
    leetcode 155. Min Stack
    leetcode 228. Summary Ranges
    leetcode 204. Count Primes
    leetcode 6. ZigZag Conversion
  • 原文地址:https://www.cnblogs.com/luyuan/p/3880135.html
Copyright © 2011-2022 走看看