zoukankan      html  css  js  c++  java
  • jQuery核心讲解

    转自:http://lcr.javaeye.com/blog/897535

    1.基础介绍
    Js代码
    $(document).ready(function(){
    --- jQuery functions go here ----
    });

    jQuery(document).ready(function($){
    --- jQuery functions go here ----
    });

    $(function(){
    // 文档就绪
    });

    这是为了防止文档在完全加载(就绪)之前运行 jQuery 代码。

    下面是两种假如文档完全加载之前运行函数的话,操作失败的情况:
    * 试图隐藏一个不存在的元素。
    * 获得未完全加载的图像的大小。

    一般情况下一个页面响应加载的顺序是,域名解析-加载html-加载js和css-加载图片等其他信息。
    页面加载完成有两种事件:
    一是ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件)
    二是onload,指示页面包含图片等文件在内的所有元素都加载完成
    Java代码
    var jQuery = function( selector, context ) {
    .............
    }



    2.核心函数
    Js代码
    jQuery(expression, [context])

    默认情况下, 如果没有指定context参数,$()将在当前的 HTML 文档中查找 DOM 元素;
    如果指定了 context 参数,如一个 DOM 元素集或 jQuery 对象,那就会在这个 context 中查找。
    例如:
    a. jQuery()
    jQuery 1.4返回空的 jQuery 集合;之前版本会返回包含 document 节点的集合。
    b. jQuery(element)
    从整个HTML文档中查找指定的元素element
    jQuery("td") 查找所有的td元素
    c. jQuery(expression, [context])
    //var tr = document.getElementById("tr_1");
    //var tr = $("#tr_1");
    jQuery("td",tr)
    d. jQuery(jQuery object) 以参数的形式向 $() 函数传递 jQuery 对象后,会创建一个该对象的副本


    Js代码
    jQuery(html, [ownerDocument])

    参数中的[ownerDocument]应该为HTMLDocument,方法才能成功创建一个jQuery对象,如果不填这个参数,则默认为当前的Document
    $(html,window._content.document) 可以正常使用,其中window._content.document类型是 HTMLDocument,而在没有写第二个参数的时候默认使用的是XULDocument
    如果以参数的形式将字符串传递给 $(),jQuery 会检查字符串是否是 HTML , 如果不是,则把字符串解释为选择器表达式,但如果字符串是 HTML 片段,则 jQuery 试图创建由该 HTML 片段描述的 DOM 元素。
    然后会创建并返回一个引用这些 DOM 元素的 jQuery 对象,在jquery内部调用doc.createDocumentFragment()。
    xmlDocument.createDocumentFragment();
    一个新的文件片断被建立,但没有加到文件树中。要加入片断到文件树中,必须使用插入方法,例如insertBefore、replaceChild 或appendChild。
    例如:
    $("<div><p>Hello</p></div>",window._content.document).appendTo("body");
    // 在 IE 中无效:
    $("<input>").attr("type", "checkbox");
    // 在 IE 中有效:
    $("<input type='checkbox'>");


    Js代码
    jQuery(html,props)

    对于 jQuery 1.4,我们可以向第二个参数传递一个属性映射。该参数接受能够传递给 .attr() 方法的属性的超集。
    例如:
    Js代码
    创建一个 <input> 元素,同时设定 type 属性、属性值,以及一些事件。
    function yy () {
    $("<input>",{
    type : "button",
    val : "text",
    click : function(){
    alert("hello--button");
    }
    }).appendTo("body");
    }


    Js代码
    jQuery(elements) 用于将elements表示的DOM元素封装成jQuery对象


    Js代码
    jQuery(callback) $(document).ready()的简写。
    例如:
    $(function(){
    // 文档就绪
    });

    jQuery(function($) {
    // 你可以在这里继续使用$作为别名...
    });



    3.对象访问
    Js代码
    each(callback)

    例如:
    迭代两个图像,并设置它们的 src 属性。
    Js代码
    <img/><img/>

    代码为:
    $("img").each(function(i){
    this.src = "test" + i + ".jpg";
    });

    注意:此处 this 指代的是 DOM 对象而非 jQuery 对象。
    如果你想得到 jQuery对象,可以使用 $(this) 函数。
    $(this).attr("src", "this"+i+".jpg");


    Js代码
    size() jQuery 对象中元素的个数(同jQuery 对象的'length' 属性)。


    Js代码
    length jQuery 对象中元素的个数(同 size()方法)。


    Js代码
    selector jQuery 1.3新增。返回传给jQuery()的原始选择器。

    换句话说,就是返回你用什么选择器来找到这个元素的。可以与context一起使用,用于精确检测选择器查询情况。这两个属性对插件开发人员很有用。
    Js代码
    例如:
    var tr = $("table");
    alert(tr.selector); //table
    var tr = $("#tr_1");
    alert(tr.selector); //#tr_1



    Js代码
    context
    jQuery 1.3新增。返回传给jQuery()的原始的DOM节点内容,即jQuery()的第二个参数。
    如果没有指定,那么context指向当前的文档(document)。

    可以与selector一起使用,用于精确检测选择器查询情况。这两个属性对插件开发人员很有用。
    var tr = $("#tr_1");
    var tds = $("td", tr);
    alert(tds.context); //[object HTMLDocument]

    //如果是IE浏览器,则返回[object]
    var tds = $("td", document.body);
    alert(tds.context.nodeName); //BODY


    Js代码
    get()
    取得所有匹配的 DOM 元素集合。
    这是取得所有匹配元素的一种向后兼容的方式(不同于jQuery对象,而实际上是元素数组)。
    如果你想要直接操作 DOM 对象而不是 jQuery 对象,这个函数非常有用。


    Js代码
    get(index)
    取得其中一个匹配的元素。 num表示取得第几个匹配的元素。
    这能够让你选择一个实际的DOM 元素并且对他直接操作,而不是通过 jQuery 函数。$(this).get(0)与$(this)[0]等价。


    Js代码
    index(subject)
    搜索与参数表示的对象匹配的元素,并返回相应元素的索引值。
    如果找到了匹配的元素,从0开始返回;如果没有找到匹配的元素,返回-1。
    例如:
    var tr = $("tr").index($("#tr_1")[0]);
    alert(tr); //1
    var tr = $("tr").index($("#tr_1"));
    alert(tr); //1



    4.数据缓存


    Js代码
    data(name)

    返回元素上储存的相应名字的数据,可以用data(name, value)来设定。
    如果jQuery集合指向多个元素,那将只返回第一个元素的对应数据。
    这个函数可以用于在一个元素上存取数据而避免了循环引用的风险。jQuery.data是1.2.3版的新功能。你可以在很多地方使用这个函数,另外jQuery UI里经常使用这个函数。


    Js代码
    data(name,value)

    在元素上存放数据,同时也返回value。
    如果jQuery集合指向多个元素,那将在所有元素上设置对应数据。
    这个函数不用建立一个新的expando,就能在一个元素上存放任何格式的数据,而不仅仅是字符串。
    $('selector').attr('alt', 'data being stored');
    //之后可以这样读取数据:
    $('selector').attr('alt');
    使用”alt”属性来作为参数名存储数据其实对于HTML来说是不符合语义的,我们可以使用jQuery的data方法来为页面中的某个元素存储数据,使用data方法可以避免在DOM中存储数据。


    Js代码
    removeData(name)
    在元素上移除存放的数据
    与$(...).data(name, value)函数作用相反


    Js代码
    queue(name[,callback | queue])
    dequeue(name) 从队列最前端移除一个队列函数,并执行他。

    jQuery中的queue和dequeue是一组很有用的方法,他们对于一系列需要按次序运行的函数特别有用。特别animate动画,ajax,以及timeout等需要一定时间的函数。
    queue和dequeue的过程主要是:
    a.用queue把函数加入队列(通常是函数数组)
    b.用dequeue将函数数组中的第一个函数取出,并执行(用shift()方法取出并执行)

    也就意味着当再次执行dequeue的时候,得到的是另一个函数了
    同时也意味着,如果不执行dequeue,那么队列中的下一个函数永远不会执行

    对于一个元素上执行animate方法加动画,jQuery内部也会将其加入名为 fx 的函数队列
    而对于多个元素要依次执行动画,则必须我们手动设置队列进行了。

    queue(name)当只传入一个参数时, 它返回并指向第一个匹配元素的队列(将是一个函数数组,队列名默认是fx);
    当有两个参数传入时, 第一个参数还是默认为fx的的队列名, 第二个参数又分两种情况, 当第二个参数是一个函数时,它将在匹配的元素的队列最后添加一个函数. 当第二个参数是一个函数数组时,它将匹配元素的队列用新的一个队列来代替(函数数组).
    Html代码
    <style type="text/css">
    div{
    border:2px solid green;
    18px;
    height:18px;
    left:0px;
    background-color:red;
    position:absolute
    }
    </style>

    <div id="one">1</div>
    <div id="two">2</div>
    <div id="three">3</div>
    <div id="four">4</div>
    <div id="five">5</div>




    Js代码
    $(document).ready(function(){
    $("#id_but").bind("click",taskOne);
    });
    //当没有使用queue时,希望所有的div元素向右移动一定的距离,实现代码如下:
    function taskOne(){
    $("#one").delay(300).animate({left:"+=270px"},function(){
    $("#two").delay(300).animate({left:"+=250px"},function(){
    $("#three").delay(300).animate({left:"+=230px"},function(){
    $("#four").delay(300).animate({left:"+=210px"},function(){
    $("#five").delay(300).animate({left:"+=190px"},function(){
    alert("动画结束");
    });
    });
    });
    });
    });
    }


    Js代码
    此时添加或删除一div时操作麻烦且易于出错,使用queue实现的代码如下:
    var _sildeFun = [
    function() {$("#one").delay(300).animate({left:"+=270"}, taskOne);},
    function() {$("#two").delay(300).animate({left:"+=250"}, taskOne);},
    function() {$("#three").delay(300).animate({left:"+=230"}, taskOne);},
    function() {$("#four").delay(300).animate({left:"+=210"}, taskOne);},
    function() {$("#five").delay(300).animate({left:"+=190"}, taskOne);},
    function() {alert("动画结束");}
    ];

    $(document).queue("task",_sildeFun);
    function taskOne(){
    $(document).dequeue("task");
    }

    此时只需在需要运行动画效果时调用taskOne方法即可,可以在外面直接调用taskOne()或在ready方法中调用。
    Js代码
    clearQueue([queueName]) 1.4新增的方法. 清空对象上尚未执行的所有队列.

    与 stop() 方法(只适用于动画)不同,clearQueue() 能够清除任何排队的函数(通过 .queue() 方法添加到通用jQuery 队列的任何函数)。
    $(selector).clearQueue(queueName)
    //queueName : 可选。规定要停止的队列的名称。默认是 "fx",标准效果队列。
    Js代码
    $(document).ready(function(){
    $("#id_but").bind("click",taskOne);
    $("#id_sbut").bind("click",clearQ);
    });

    function clearQ() {
    //$(document).clearQueue("task");
    $(document).queue("task",[]); //通过传递空数组来停止动画
    }


    Html代码
    <html>
    <head>
    <script type="text/javascript" src="jquery-1.4.2.js"></script>
    <script type="text/javascript">
    $(document).ready(function(){
    $("#start").click(function(){
    $("#box").animate({height:300},"slow");
    $("#box").animate({300},"slow");
    $("#box").queue(function () {
    $(this).css("background-color","red");
    $(this).dequeue();
    });
    $("#box").animate({height:100},"slow");
    $("#box").animate({100},"slow");
    });
    $("#stop").click(function(){
    $("#box").clearQueue();
    });
    });
    </script>
    <style type="text/css">
    #box{
    background:#98bf21;
    height:100px;
    100px;
    position:relative
    }
    </style>
    </head>
    <body>
    <button id="start">启动</button>
    <button id="stop">停止</button></p>
    <div id="box"></div>
    </body>
    </html>



    5.插件机制

    jQuery插件的开发包括两种:
    一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法。jQuery的全局函数就是属于jQuery命名空间的函数。
    另一种是对象级别的插件开发,即给jQuery对象添加方法。


    Js代码
    jQuery.fn = jQuery.prototype = {
    init:function(selector, context){
    .......
    }
    ......
    }

    jQuery.fn.init.prototype = jQuery.fn;
    jQuery.extend = jQuery.fn.extend = function() {
    .......
    }
    Js代码
    jQuery.fn.extend(object) 扩展 jQuery 元素集来提供新的方法(通常用来制作插件)。


    Js代码
    <tr>
    <td colspan="6">
    <input type="checkbox" name="test" value="apple"/>
    <input type="checkbox" name="test" value="peach"/>
    <input type="checkbox" name="test" value="banana"/>
    </td>
    </tr>

    $(document).ready(function(){
    $("#id_but").click(function(){
    $("input:checkbox").uncheck(); //让jQuery实例(对象调用)
    });
    $("input:checkbox").check();
    });
    //extend
    jQuery.fn.extend({
    alertClick:function(){
    $(this).click(function(){
    alert($(this).val());
    });
    },
    color:function(val){
    if (typeof(val) == undefined) {
    alert("未知的颜色值");
    return false;
    }
    $(this).css("background-color",val);
    },
    check:function(){
    $(this).each(function(){
    $(this).attr("checked",true);
    });
    },
    uncheck: function() {
    this.each(function() {
    this.checked = false;
    });
    }
    });


    Js代码
    jQuery.extend(object) 扩展jQuery对象本身。


    Js代码
    $(document).ready(function(){
    $("#id_but").click(function(){
    alert($.add(3,4)); //只能让jQuery来调用,不可以通过其实例(对象)调用
    });
    });

    jQuery.extend({
    min: function(a, b) { return a < b ? a : b; },
    max: function(a, b) { return a > b ? a : b; },
    add: function(a, b) { return a + b}
    });

    类级别的插件开发jQuery.extend(object)
    类级别的插件开发最直接的理解就是给jQuery类添加类方法,可以理解为添加静态方法。
    典型的例子就是$.AJAX()这个函数,将函数定义于jQuery(代表其命名空间)的命名空间中。
    虽然 javascript 没有明确的类的概念,但是用类来理解它,会更方便。
    jQuery便是一个封装得非常好的类,比如我们用 语句 $("#btn") 会生成一个 jQuery类的实例。
    添加一个全局函数,我们只需如下定义:
    Js代码
    $(document).ready(function(){
    $("#id_but").click(function(){
    $.foo();
    $.bar();
    });
    });

    jQuery.foo = function(){
    alert("hello");
    }

    jQuery.bar = function(){
    alert("china");
    }
    我们也可以通过jQuery.extend(object)扩展jQuery对象本身,将上述代码修改为:
    jQuery.extend({
    foo:function(){
    alert("hello");
    },
    bar: function() {
    alert("china");
    }
    });
    即将foo与bar方法放到jQuery.extend(object)中实现jQuery对象本身的扩展。

    虽然在jQuery命名空间中,我们禁止使用了大量的javaScript函数名和变量名。但是仍然不可避免某些函数或变量名将于其他jQuery插件冲突,因此我们习惯将一些方法封装到另一个自定义的命名空间。
    Js代码
    $(document).ready(function(){
    $("#id_but").click(function(){
    $.myplugin.click();
    $.myplugin.bar1('aaa');
    });
    });

    jQuery.myplugin={
    click:function(){
    alert('This is a test. This is only a test.');
    },
    bar1:function(param){
    alert('This function takes a parameter, which is "' + param + '".');
    }
    }

    通过这个技巧(使用独立的插件名),我们可以避免命名空间内函数的冲突。
    JavaScript本身具有click事件,但是我们在myplugin命名空间里仍然可以定义名称为click的事件。
    对于extend名称空间在jQuery内部已做了处理,在该名称空间中添加的方法在使用时无需再注明其名称空间。
    Js代码
    对象级别的插件开发需要如下的两种形式:
    形式一
    (function($){
    $.fn.extend({
    pluginName:function(opt,callback){
    // Our plugin implementation code goes here.
    }
    })
    })(jQuery);
    形式二
    (function($) {
    $.fn.pluginName = function() {
    // Our plugin implementation code goes here.
    };
    })(jQuery);

    上面定义了一个jQuery函数,形参是$,函数定义完成之后,把jQuery这个实参传递进去.立即调用执行。这样的好处是,我们在写jQuery插件时,也可以使用$这个别名,而不会与prototype引起冲突.


    Js代码
    形式一
    jQuery.fn.extend({ //注意{} 必须有
    check:function(){
    $(this).each(function(){
    $(this).attr("checked",true);
    });
    },
    uncheck:function(){
    $(this).each(function(){
    $(this).attr("checked",false);
    });
    }
    });
    形式二
    $(document).ready(function(){
    $("#id_but").click(function(){
    $("input:checkbox").uncheck();
    });
    $("input:checkbox").check();
    });

    jQuery.fn.check=function(){
    $(this).each(function(){
    $(this).attr("checked",true);
    });
    }

    jQuery.fn.uncheck=function(){
    $(this).each(function(){
    $(this).attr("checked",false);
    });
    }



    6.多库共存
    Js代码
    jQuery.noConflict()
    运行这个函数将变量$的控制权让渡给第一个实现它的那个库。
    在运行这个函数后,就只能使用jQuery变量访问jQuery对象。例如,在要用到$("div p")的地方,就必须换成jQuery("div p")。

    注意:这个函数必须在你导入jQuery文件之后,并且在导入另一个导致冲突的库之前使用。当然也应当在其他冲突的库被使用之前,除非jQuery是最后一个导入的。
    Js代码
    //代码一
    <script type="text/javascript">
    jQuery.noConflict(); //将变量$的控制权让渡给prototype.js
    jQuery(function(){ //使用jQuery
    jQuery("p").click(function(){
    alert( jQuery(this).text() );
    });
    });
    $("pp").style.display = 'none'; //使用prototype
    </script>

    //代码二
    <script type="text/javascript">
    var $j = jQuery.noConflict(); //自定义一个比较短快捷方式
    $j(function(){ //使用jQuery
    $j("p").click(function(){
    alert( $j(this).text() );
    });
    });
    $("pp").style.display = 'none'; //使用prototype
    </script>

    //代码三
    <script type="text/javascript">
    jQuery.noConflict(); //将变量$的控制权让渡给prototype.js
    jQuery(function($){ //使用jQuery
    $("p").click(function(){ //继续使用 $ 方法
    alert( $(this).text() );
    });
    });
    $("pp").style.display = 'none'; //使用prototype
    </script>

    //代码四
    <script type="text/javascript">
    jQuery.noConflict(); //将变量$的控制权让渡给prototype.js
    (function($){ //定义匿名函数并设置形参为$
    $(function(){ //匿名函数内部的$均为jQuery
    $("p").click(function(){ //继续使用 $ 方法
    alert($(this).text());
    });
    });
    })(jQuery); //执行匿名函数且传递实参jQuery
    $("pp").style.display = 'none'; //使用prototype
    </script>


    Js代码
    jQuery(extreme)
    extreme Boolean 传入 true 来允许彻底将jQuery变量还原
    将$和jQuery的控制权都交还给原来的库。用之前请考虑清楚!
    注意:调用此方法后极有可能导致插件失效。
    例如:
    var dom = {};
    dom.query = jQuery.noConflict(true);
    // 新 jQuery 的代码
    dom.query("div p").hide();
    // 另一个库 $() 的代码
    $("content").style.display = 'none';
    // 另一个版本 jQuery 的代码
    jQuery("div > p").hide();

  • 相关阅读:
    P1012拼数
    P1622释放囚犯
    P1064 金明的预算方案
    P1754球迷购票问题
    卡塔兰数
    P1474货币系统
    P2562kitty猫基因
    P3984高兴的津津
    5-servlet简介
    java通过百度AI开发平台提取身份证图片中的文字信息
  • 原文地址:https://www.cnblogs.com/leelike/p/1950882.html
Copyright © 2011-2022 走看看