美文网首页
进阶篇:jQuery核心方法(20-3)

进阶篇:jQuery核心方法(20-3)

作者: 饥人谷1904_陈俊锋 | 来源:发表于2019-07-19 11:08 被阅读0次

    饥人谷学习进阶第 20 天

    jQuery对象和原生DOM对象的区别

    1. DOM对象 是我们用传统JS方法获得的对象,jQuery对象 就是jQuery的类库选择器获得的对象;
    2. jQuery选择器得到的jQuery对象是一个类数组对象,是选择出来的元素的数组集合 和 原生JS中取得DOM对象是两种不同类型,两者不等价;
    3. jQuery对象无法使用DOM对象的任何方法,同理DOM对象也不能使用jQuery的方法。
    4. 对于选取元素时未选中元素的情况,DOM对象方法返回null结果表示没有选中 对象不存在,jQuery对象方法用length为0表示一个对象不存在

    jQuery类数组对象

    • 可通过下标访问 jQueryObj[n]
      下标访问时是DOM对象,如果要选择单个且还是jQuery对象可通过jQueryObj.eq(n)选择
    • 可读取长度jQueryObj.length

    jQuery对象 和 DOM对象 转换

    • 转成DOM对象 jQueryObj[n]
    • 转成jQuery对象 变成jQuery对象后就可以调用jQuery对象方法
      $(document.querySelector('#p1'))

    没有选中对象

    • document.querySelector() 为null,判断一个对象不存在
    • $().length 为0,表示一个对象不存在

    常用方法

    .each(function(index, Element))

    遍历一个jQuery对象,为每个匹配元素执行一个函数

    $("li").each(function(index) {
        console.log(index + ":" + $(this).text())
    })
    

    注意:一般来说,jQuery所有回调函数里的对应的元素都是原生DOM,如果想要使用jQuery对象方法要用 $() 将其转换成jQuery对象

    jQuery.each(collection, callback(indexInArray, valueOfElement))

    jQuery === $
    jQuery 可以用 $ 代替

    一个通用的迭代函数,可以用来无缝迭代对象和数组。数组和类似数组的对象通过一个长度属性(如一个函数的参数对象)来迭代数字索引,从0到length-1。其他对象通过其属性名进行迭代

    var obj = {
      "flammable": "inflammable",
      "duh": "no duh"
    }
    $.each( obj, function( key, value ) {
      alert( key + ": " + value )
    })
    

    存在价值:foreach只能用于数组,某些老浏览器不支持ES5,不能使用;$.each() 既支持老浏览器,又能让类数组对象使用,也可以遍历JSON对象,通用性更好。

    .map(callback(index, domElement))

    通过一个函数匹配当前集合中的每个元素,产生一个包含新的jQuery对象

    $('.div').map(function(idx, element) {
        return this.class
    })
    

    jQuery.extend([deep,]target[,object1][,objectN])

    1. 当我们提供两个或多个对象给 $.extend(),对象的所有属性都添加到目标对象(target参数)
    2. 如果只有一个参数提供给 $.extend(),这意味着目标参数被忽略。这种情况下,jQuery对象本身被默认为目标对象。我们可以在jQuery的命名空间下添加新的功能。对于插件开发者向jQuery添加新函数时是很有用的。

    目标对象(第一个参数)将被修改,并且将通过$.extend()返回。如果向保留原对象,可以通过传递一个空对象作为目标对象:

    var obj = $.extend({}, obj1, obj2)
    

    在默认情况下,通过$.extend()合并操作不是递归的

    如果第一个对象的属性本身是一个对象或者数组,那么它将完全用第二个对象相同key重写一个属性。这些值不会被合并。如果将 true 作为该函数的第一个参数,会在对象上进行递归的合并。

    var object1 = {
      apple: 0,
      banana: { weight: 52, price: 100 },
      cherry: 97
    };
    var object2 = {
      banana: { price: 200 },
      durian: 100
    };
    
    // merge oject2 into object1
    $.extend(object1, object2);
    

    .clone([withDataAndEvents])

    .clone()方法深度复制所有匹配的元素集合,包括所有匹配元素、匹配元素的下级元素、文字节点

    通常将页面上一个元素插入到DOM里另一个地方,会被老地方移走,类似剪切效果

    $('.hello').appendTo('.goodbye');
    
    <div class="container">
      <div class="goodbye">
        Goodbye
        <div class="hello">Hello</div>
      </div>
    </div>
    

    如果需要复制而不是剪切,可以克隆之后再appendTo

    $('.hello').clone().appendTo('.goodbye')
    

    .index() / .index(selector) / .index(element)

    从给定集合中查找特定元素index

    1. 没参数返回第一个元素index
    2. 如果参数是DOM对象或者jQuery对象,则返回参数再集合中的index
    3. 如果参数是选择器,返回第一个匹配元素index,没有找到返回-1
    var listItem = $('#bar')
    alert("Index:" + $("li").index(listItem))
    

    .ready(handler)

    当DOM准备就绪时,指定一个函数来执行。

    虽然JS提供了load事件,当页面呈现时用来执行这个事件,直到所有东西,如图象已被完全接收前,此事件不会被触发。

    在大多数情况下,只要DOM结构已完全加载时,脚本就可以运行。传递处理函数给 .ready() 方法,能保证DOM准备好就执行这个函数,因此,这里是进行所有其他事件绑定及运行其他jQuery代码的最佳地方。

    如果执行的代码需要在元素被加载之后才能使用时(例如取得图片的大小需要在图片被加载完后才能知道),就需要将这样的代码放到load事件中。

    下面两种语法等价

    • $(document).ready(handler)
    • $(handler)
    $(function(){
        console.log('ready');
    });
    

    window.onload和$(document).ready有什么区别?document.onDOMContentLoaded呢?

    window.onload 是load在文档加载过程结束时触发事件,等待页面完全加载出来(所有资源都加载了),所有图像和子帧都已完成加载触发。时机较晚

    $(document).ready 是只要页面的文档对象模型准备好(DOM可以安全操作)执行指定的函数,不需要等待所有数据样式表、图像和子框架等加载完成。时机较早

    $(document).ready 相当于原生JS的 document.onDOMContentLoaded

    document.onDOMContentLoaded 是当初始的HTML文档被完全加载和解析完成之后(DOM节点已经存在),DOMContentLoaded事件被触发,无序等待所有数据到来(样式表、图像和子框架的完成加载)。需要注意的是:DOMContentLoaded事件必须等待其所属script之前的样式表加载解析完成才会触发。

    相关文章

      网友评论

          本文标题:进阶篇:jQuery核心方法(20-3)

          本文链接:https://www.haomeiwen.com/subject/mddjlctx.html