jQuery

363 阅读12分钟

jQuery

1_jQuery的选择器

不管怎么获取,获取到的都是一个伪数组

1-1_通过标签名称

console.log($('div'));

1-2_通过id属性值

console.log($('#div1'));

1-3_通过class属性值

console.log($('.div1'));

1-4_通过标签属性和属性值

$('[属性="属性值"]')

console.log($('[name="div1"]'));

1-5_通过标签结构 ul中的所有子级li

console.log($('ul>li'));

1-6_通过伪类选择器

ul中子级第一个li

console.log($('ul>li:first'));

ul中子级最后一个li

console.log($('ul>li:last'));

ul中子级li,索引下标是奇数的标签

console.log($('ul>li:odd'));

ul中子级li,索引下标是偶数的标签

console.log($('ul>li:even'));

ul中子级li,索引下标是2的标签

console.log($('ul>li:eq(2)'));

1-7_总结

jQuery获取的标签对象,不要直接使用JavaScript的语法形式来操作

JavaScript的标签对象,也不要直接使用jQuery的语法形式来操作

​ 这是两种完全不同的语法形式,获取到的标签对象,也完全不同

​ 但是可以相互转化

jQuery标签对象[索引下标] --- 转化为指定的标签对象,就可以使用对应的JavaScript语法形式

通过JavaScript语法,获取到一个标签对象

const oDiv = document.querySelector('div');

转化为jQuery标签伪数组

console.log( $(oDiv) );

$(JavaScript标签对象) --- 转化为jQuery标签对象,可以使用jQuery语法形式

jQuery语法获取的所有ul中子级li标签,其中索引是0的指定标签

console.log($('ul>li')[0]);

2_jQuery的筛选器

筛选器的执行结果,也都是一个伪数组

2-1_li标签伪数组中,第一个标签对象,也是伪数组

console.log( $('ul>li').first() );

2-2_li标签伪数组中,最后一个标签对象,也是伪数组

console.log( $('ul>li').last() );

2-3_li标签伪数组中,按照索引下标获取

console.log( $('ul>li').eq(2) );

2-4_当前标签的上一个兄弟标签

console.log( $('ul>li').eq(2).prev() );

2-5_当前标签的下一个兄弟标签

console.log( $('ul>li').eq(2).next() );

2-6_当前标签之前的所有兄弟标签

console.log( $('ul>li').eq(2).prevAll() );

2-7_当前标签之后的所有兄弟标签

console.log( $('ul>li').eq(2).nextAll() );

2-8_当前标签的所有兄弟标签,不管前后

console.log( $('ul>li').eq(2).siblings() );

2-9_当前标签的直接父级标签

console.log( $('ul>li').eq(2).parent() );

2-10_当前标签的所有父级标签

console.log( $('ul>li').eq(2).parents() );

2-11_根据条件来查找jQuery,标签伪数组中符合的标签

console.log( $('ul').find('[name="li5"]') );

3_jQuery的属性操作

布尔属性用 prop

其他属性都用 attr

删除属性, prop定义的用prop删,其他都用 attr删

3-1_获取标签属性的属性值

方法1: $(标签对象).prop('属性');

并不能获取到所有属性的属性值

有些属性是拿不到的,会是undefined

console.log( $('div').prop('name') );//undefined

console.log( $('button').prop('disabled') );//true

方法2: $(标签对象).attr('属性');

console.log( $('div').attr('name') );//能获取到属性值

但: console.log( $('button').attr('disabled') );//disabled

3-2_新增属性

3-2-1_prop() 新增自定义属性,结果不会显示在标签上,但是确定可以添加上

$('div').prop('index1' , 1);

使用 prop 可以获取到这个属性

获取的结果是数值类型

console.log( $('div').prop('index1') );

3-2-2_新增的自定义属性,可以显示在标签上,也可以通过attr()来获取到

获取的结果是字符串类型

$('div').attr('index2' , 1);

console.log( $('div').attr('index2') );

3-2-3_新增标签本身具有的属性有的支持,有的不支持持

$('div').attr('name' , 'divdiv');//自定义属性值不改变

$('div').attr('id' , 'divdiv1');//id、class属性属性值可以替换改变

3-3_删除属性

prop只能删除,通过prop定义的新增自定义属性

$('div').removeProp('name' , 'divdiv');//不能删除

$('div').removeProp('id' , 'divdiv1');//能删除

attr能删除所有的属性

$('div').removeAttr('name' , 'divdiv');//能删除

$('div').removeAttr('id' , 'divdiv1');//能删除

3-4_jQuery的class操作

3-4-1_新增div1属性值

$('div').addClass('div1');

3-4-2_删除class属性的属性值

$('div').removeClass('div2');

3-4-3_切换如果有,就删除,如果没有就新增

$('div').toggleClass('div2');

3-4-4_判断是否有这个class属性值

console.log( $('div').hasClass('div2') );

3-4-5_新增多个,删除多个

$('div').addClass('div1 div2 div3');

4_jQuery的隐式迭代

4-1_对ul中的所有li进行操作,获取其中的属性

获取 ul中li的name属性的属性值

获取只会获取第一个标签的内容

console.log($('ul>li').attr('name'));

4-2_设定其中的class属性值

设定属性属性值等,会给伪数组中所有的标签都设定上指定的样式,属性等

$('ul>li').addClass('li1').attr('index' , 1);

5_jQuery之内容的操作

5-1_获取或者设定标签内容$().html()

没有参数是获取标签内容

有参数是设定标签内容

支持标签,可以获取标签,也可以设定标签

设定内容,是全覆盖,之前的内容都会被覆盖

等同于 innerHTML()

console.log($('div').html());

设定 支持设定标签

$('div').html('<p></p>');

5-2_获取或者设定标签内容$().text()

没有参数是获取标签内容

有参数是设定标签内容

不支持标签,只能获取标签的文本内容

设定内容,是全覆盖,之前的内容都会被覆盖

等同于 innerText()

5-3_获取标签的value()属性值$().val()

等同于 JavaScript中的 标签对象.value

$('input').val()

6_jQuery之css样式操作

6-1_CSS的样式属性的属性值获取

与JavaScript的区别:

​ JavaScript中,通过 标签.style.属性 = 属性值 来设定行内样式

​ 标签.style.属性 只能获取行内样式

​ window.getComputedStyle(标签).属性 获取执行样式

jQuery中, 通过 $().css() 来设定和获取样式

​ 获取的是执行样式

​ 带减号的样式 font-size 就写成 font-size 或者 fontSize 都行,但是要注意大小写

行内样式可以获取

console.log( $('div').css('color') );

非行内样式

console.log( $('div').css('border') );

6-2_设定样式,有两种形式

形式1, $().css(属性,属性值)

$('div').css('background' , color);

形式2,参数是一个对象,通过对象来设定样式

$('div').css({
    background : color,
    width : '200px' , 
    height : '200px' , 
});

7_jQuery的事件绑定和删除

jQuery的事件绑定分为两种语法形式

7-1_jquery事件绑定语法形式1:

$(标签对象).事件类型(function(){})

7-2_jquery事件绑定语法形式2:

$(标签对象).on( 事件类型 , 事件处理函数 )

 $('div').on( 'click' , function(){
     console.log(123);
 } )

同一个标签,可以通过链式编程,绑定更多的事件类型

通过链式编程,一个标签绑定多个事件

$(标签).on(类型,函数).on(类型,函数).on(类型,函数)....

$('div').on( 'click' , function(){
    console.log(123);
} ).on('mouseover' , function(){
    console.log('移入')
}).on('mouseout' , function(){
    console.log('移出')
})
7-3_jquery事件删除
// 有自定义函数和绑定的函数名称
$('div').on('click' , function(){
    console.log('0')
}).on('click' , fun1).on('click' , fun2).on('click' , fun3)
// 删除只能删除函数名称
// 通过函数名称,找到其中存储的函数地址,删除函数地址
$('div').off('click' , fun3);
function fun1(){
    console.log(1);
}
function fun2(){
    console.log(2);
}
function fun3(){
    console.log(3);
}
//点击div之后结果是0 1 2
7-4_事件绑定的其他语法形式

7-4-1_on语法的第二个参数,是 { } 一个对象,会存储在 e.data 中

在函数中,可以通过 e.data 来读取参数数据

$('[name="w"]').on('click' , { name:'张三' , age:18 , w:123} , function(e){
    console.log(e);
    console.log(e.data.w);//123
})

7-4-2_点击事件只会触发一次

$('div').one('click' , function(){
    console.log(123);
})

7-4-3_$().trigger() 不用触发,直接会执行的事件

$('div').trigger('click',function(){});

7-4-4_$(window).ready 只要标签加载完毕就判定,页面加载完毕

window.onload = function(){
    console.log('我是onload输出的,我是表示页面加载完毕');
}

$(window).ready(function(){
    console.log('我是ready输出的,我也表示页面加载完毕');
})
7-5_jQuery的事件委托

语法: $().on(事件类型,'选择器',{参数},事件处理函数(e){})

​ 通过给父级标签,添加点击事件,通过判断点击的标签内容,来执行不同的事件处理函数

$('div').on('click' , 'h1' , function(){
    console.log('我点击的是h1标签');
}).on('click' , '#s' , function(){
    console.log('我点击的是span标签');
}).on('click' , '.p' , function(){
    console.log('我点击的是p标签');
}).on('click' , '[name="s"]' , function(){
    console.log('我点击的是name属性为s的标签');
}).on('click' , 'ul>li:nth-child(3)' , function(){
    console.log('我点击的是ul中的第三个li标签');
})

js中的事件委托

//获取标签对象
const oDiv = document.querySelector('div');
//事件监听 点击事件
oDiv.addEventListener('click' , function(e){
    // 可以判断标签名称,必须是大写
    if(e.target.tagName === 'H1'){
        console.log('我点击的是h1标签');
    }
    // 判断name属性
    if(e.target.getAttribute('name') == 's'){
        console.log('我点击的是span标签');
    }
    // 判断class等属性
    if(e.target.className == 'p'){
        console.log('我点击的是p标签');
    }
})
7-6_鼠标的移入移出事件

经过子级会触发父级

 $('div').mouseover(function(){
     console.log('我进来了');
 }).mouseout(function(){
     console.log('我出去了')
 })

$().hover

经过子级不会触发父级 类似, mouseentermouseleave

 $('div').hover( function(){console.log('进进')} , function(){console.log('出出')} )

8_jQuery之节点操作

8-1_创建节点

创建了一个div标签节点

const oDiv1 = $('<div>我是div标签1</div>');

创建标签的同时,可以定义标签的属性和属性值

const oDiv2 = $('<div class="div1" name="div">我是div标签2</div>');

8-2_写入节点

为了方便链式编程,jQuery中提供了多种写入节点的方法

(1), (父级标签).append({'子级标签'}) 在最后添加--父子关系

$('父级标签').append( $('<a href="https://www.baidu.com">百度</a>') );

(2), {'子级标签'}.appendTo((父级标签) ) 在最后添加--父子关系

$('<span>我是span</span>').appendTo( $('父级标签') );

(3), (父级元素).prepend({'子级标签'}) 在起始添加--父子关系

$('父级标签').prepend(${'子级标签'});

(4) {'子级标签'}.prependTo((父级标签) ) 在起始添加--父子关系

${'子级标签'}.prependTo( $('父级标签') );

(5) 已有标签.after(新增标签) 在之后添加 --- 兄弟关系

$('已有标签').after(${'新增标签'});

(6) 新增标签.insertAfter(已有的标签) 在之后添加 --- 兄弟关系

${'新增标签'}.insertAfter( $('已有标签') );

(7) 已有标签.before(新增标签) 在之前添加 --- 兄弟关系

$('已有标签').before(${'新增标签'});

(8) 新增标签.insertBefore(已有的标签) 在之前添加 --- 兄弟关系

${'新增标签'}.insertBefore( $('已有标签') );

8-3_删除节点

empty()

将 标签对象,定义为一个空标签

所谓的空标签,就是没有任何的内容

<div>我是div</div>
$('div').empty();
//结果: <div></div>

remove()

将 标签对象本身,从页面中移除

移除,也是就是这个标签本身都不存在了

<div>我是div</div>
$('div').remove();
//结果: 空

删除子节点,或者清空子节点

通过强大的选择器,选择到子节点就可以了

$('div>span').remove();// 删除div中的span标签

8-4_替换节点

1, $(已有标签).replaceWith(替换成的标签)

​ 使用 替换成的标签 来替换 已有的标签

​ 替换所有

2, 替换成的标签.replaceAll( $(已有标签) )

​ 使用 替换成的标签 来替换 已有的标签

​ 替换所有

<div>
    <span>我是span</span>
    <span>我是span</span>
    <span>我是span</span>
</div>
<script>
// 创建一个节点
	const oA = $('<a href="https://www.baidu.com">百度</a>');
    // 使用这个超链接节点,替换 span标签
	$('div>span').replaceWith(oA);
    //replaceWith 和 replaceAll 只是标签顺序写法不同
    oA.replaceAll( $('div>span') );
8-5_克隆节点

$().clone() 克隆赋值标签节点

​ 参数1: 布尔值 默认值是false,表示不克隆标签上绑定的事件

​ 设定为true,是克隆事件,克隆标签本身和子级标签的事件都克隆

​ 参数2: 布尔值

​ 只有当参数1为true时,才起作用

​ 设定是否要克隆子级标签的事件,false是不克隆

​ 默认值是 true , 因此,当前标签,子级标签,事件都克隆,写一个true就可以了

没有克隆事件

$('div').clone().appendTo( $('nav') ) ;

克隆事件 , 写一个true,父级子级,事件都克隆

$('div').clone(true).appendTo( $('nav') ) ;

克隆事件 , 第一个true,是克隆标签本身事件

​ 第二个false,是不克隆子级标签事件

$('div').clone(true,false).appendTo( $('nav') ) ;

9_jQuery动画

9-1_jQuery动画之标准动画

1, $(标签).show() 显示

​ // 语法 : $(标签).show(时间,运动曲线,运动结束时执行的函数)

​ // 运动到指定的位置,也就是css样式,定义的标签位置

​ // 离那里进,就从那里开始运动

​ // 离 左上角近 就从左上角开始运动

<button name="show">显示</button>
<button name="hide">隐藏</button>
<button name="toggle">切换</button>
<div></div>
<script src="./jquery.min.js"></script>
<script>
    // 给显示按钮,添加事件
    $('[name="show"]').click(function(){
        $('div').show( 2000 , 'linear' , function(){
            console.log('div完全显示了');
        } )
    })
</script>

2, $(标签).hide() 隐藏

​ // 语法 : $(标签).hide(时间,运动曲线,运动结束时执行的函数)

​ // 从原始的位置,开始隐藏

​ // 离那里进,就隐藏到那里

<button name="show">显示</button>
<button name="hide">隐藏</button>
<button name="toggle">切换</button>
<div></div>
<script src="./jquery.min.js"></script>
<script>
    // 给隐藏按钮,添加事件
    $('[name="hide"]').click(function(){
        $('div').hide( 2000 , 'linear' , function(){
            console.log('div完全隐藏了');
        } )
    })
</script>

3, $(标签).toggle() 切换

​ // 语法 : $(标签).toggle(时间,运动曲线,运动结束时执行的函数)

​ // 隐藏就改为显示,显示就改为隐藏

<button name="show">显示</button>
<button name="hide">隐藏</button>
<button name="toggle">切换</button>
<div></div>
<script src="./jquery.min.js"></script>
<script>
    // 给切换按钮,添加事件
    $('[name="toggle"]').click(function(){
        $('div').toggle( 2000 , 'linear' , function(){
            console.log('div完全切换了');
        } )
    })
</script>
9-2_jQuery动画之折叠动画

1, $(标签).slideDown() 显示

​ // 语法 : $(标签).slideDown(时间,运动曲线,运动结束时执行的函数)

​ // 从 css 设定的位置上 , 下拉显示标签

<button name="down">折叠显示</button>
<button name="up">折叠隐藏</button>
<button name="toggle">折叠切换</button>
<div></div>

<script src="./jquery.min.js"></script>
<script>
    // 给显示按钮,添加事件
    $('[name="down"]').click(function(){
        $('div').slideDown( 2000 , 'linear' , function(){
            console.log('div完全显示了');
        } )
    })
</script>

2, $(标签).slideUp() 隐藏

​ // 语法 : $(标签).slideUp(时间,运动曲线,运动结束时执行的函数)

​ // 从 css 设定的位置上 , 上卷隐藏标签

<button name="down">折叠显示</button>
<button name="up">折叠隐藏</button>
<button name="toggle">折叠切换</button>
<div></div>

<script src="./jquery.min.js"></script>
<script>
    // 给隐藏按钮,添加事件
    $('[name="up"]').click(function(){
        $('div').slideUp( 2000 , 'linear' , function(){
            console.log('div完全隐藏了');
        } )
    })
</script>

3, $(标签).slideToggle() 切换

​ // 语法 : $(标签).slideToggle(时间,运动曲线,运动结束时执行的函数)

​ // 隐藏就改为显示,显示就改为隐藏

<button name="down">折叠显示</button>
<button name="up">折叠隐藏</button>
<button name="toggle">折叠切换</button>
<div></div>

<script src="./jquery.min.js"></script>
<script>
    // 给切换按钮,添加事件
    $('[name="toggle"]').click(function(){
        $('div').slideToggle( 2000 , 'linear' , function(){
            console.log('div完全切换了');
        } )
    })
</script>

树状菜单

<style>
        *{
            margin: 0;
            padding:0;
        }

        ul,ol,li{
            list-style: none;
        }

        ul{
            width: 300px;
            border: 3px solid #000;
            margin: 30px auto;
            padding: 0 0 0 20px;
        }

        ul > li{
            cursor: pointer;
        }

        ul > li > ol{
            padding: 0 0 0 20px;
            display: none;
        } 

        ul > li::before{
            content: "+";
        }

        ul > li.active:before{
            content: "-";
        }
    </style>
</head>
<body>
    <ul>
        <li>
            一级菜单
            <ol>
                <li>二级菜单</li>
                <li>二级菜单</li>
                <li>二级菜单</li>
                <li>二级菜单</li>
            </ol>
        </li>
        <li>
            一级菜单
            <ol>
                <li>二级菜单</li>
                <li>二级菜单</li>
                <li>二级菜单</li>
                <li>二级菜单</li>
            </ol>
        </li>
    </ul>
    
    <script src="./jquery.min.js"></script>
    <script>
        $('ul>li').click(function(){
            $(this).toggleClass('active')
            .children('ol').slideToggle().parent().siblings()
            .removeClass('active').children('ol').slideUp();
            
            //$(this)   当前的,点击的 li标签
            //.toggleClass('active')   切换class属性值 , 如果没有,就添加 active,显示为 - 减号如										果有,就删除 active , 显示为 + 加号
            //.children('ol')     找当前 li 中的子级标签 ol  children()  /  find()
            //.slideToggle()      下拉显示和上卷隐藏的切换完成了,当前li的操作,要做其他li的操作
            //.parent()    当前操作是 ol,找到ol的父级,li,也就是当前点击的li    
            //.siblings()  找到当前点击li的兄弟标签
            //.removeClass('active')    删除 class中的active,让 -减号 变 +加号
            //.children('ol')   找到子级ol
            //.slideUp();       上卷隐藏
        })
    </script>
9-3_jQuery动画之渐隐渐现动画

1, $(标签).fadeIn() 显示

​ // 语法 : $(标签).fadeIn(时间,运动曲线,运动结束时执行的函数)

​ // 从 css 设定的位置上 , 下拉显示标签

<button name="in">逐渐显示</button>
<button name="out">逐渐隐藏</button>
<button name="toggle">渐隐渐现</button>
<div></div>

<script src="./jquery.min.js"></script>
<script>
    // 给显示按钮,添加事件
    $('[name="in"]').click(function(){
        $('div').fadeIn( 2000 , 'linear' , function(){
            console.log('div完全显示了');
        } )
    })
</script>

2, $(标签).fadeOut() 隐藏

​ // 语法 : $(标签).fadeOut(时间,运动曲线,运动结束时执行的函数)

​ // 从 css 设定的位置上 , 上卷隐藏标签

<button name="in">逐渐显示</button>
<button name="out">逐渐隐藏</button>
<button name="toggle">渐隐渐现</button>
<div></div>

<script src="./jquery.min.js"></script>
<script>
    // 给隐藏按钮,添加事件
    $('[name="out"]').click(function(){
        $('div').fadeOut( 2000 , 'linear' , function(){
            console.log('div完全隐藏了');
        } )
    })
</script>

3, $(标签).fadeToggle() 切换

​ // 语法 : $(标签).fadeToggle(时间,运动曲线,运动结束时执行的函数)

​ // 隐藏就改为显示,显示就改为隐藏

<button name="in">逐渐显示</button>
<button name="out">逐渐隐藏</button>
<button name="toggle">渐隐渐现</button>
<div></div>

<script src="./jquery.min.js"></script>
<script>
    // 给切换按钮,添加事件
    $('[name="toggle"]').click(function(){
        $('div').fadeToggle( 2000 , 'linear' , function(){
            console.log('div完全切换了');
        } )
    })
</script>
9-4_jQuery动画之自定义动画

jQuery的自定义动画

​ // $(标签).animate()

​ // 可以通过 自定义动画 实现, css样式的改变

​ // 特别注意: 有一些css样式,是不能改变的

​ // 例如颜色

​ // 语法形式:

​ // $(标签).animate( {属性:属性值,属性:属性值....} )

​ // 参数1: 要改变的 css的属性和属性值 可以没有单位px

​ // 参数2: 定义的执行时间

​ // 参数3: 定义的运动曲线

​ // 参数4: 运动结束,执行的函数

<button name="wh">改变宽度高度</button>
<div>中国</div>

<script src="./jquery.min.js"></script>
<script>
$('[name="wh"]').click(function(){
    let randomW = parseInt(Math.random()*(500+1-100)+100 );
    let randomH = parseInt(Math.random()*(500+1-100)+100 );
    console.log(randomW,randomH);
    $('div').animate({
        width : `${randomW}px`,   
        height: `${randomH}px`,
    } , 2000 , 'linear' , function(){
        console.log('运动结束了')
    })
})
</script>
9-5_jQuery动画之结束动画

.stop()

​ // 都不是操作当前这个运动的

​ // 是定义执行当前运动之前,如果还有其他正在执行的运动,应该怎么办

​ // 就从当前标签运动的位置,开始,立即执行下一次运动

.finish()

​ // 都不是操作当前这个运动的

​ // 是定义执行当前运动之前,如果还有其他正在执行的运动,应该怎么办

​ // 从之前运动的终点目标位置,开始,立即执行下一次运动

<style>
    div{
        width: 100px;
        height: 100px;
        background: pink;
        position: absolute;
        top:50px;
        left: 0;
    }
</style>

<button name="go">go</button>
<button name="back">back</button>
<div></div>

<script src="./jquery.min.js"></script>
<script>
    // 点击触发,新的运动,会马上停止当前运动,并且在当前运动的终止位置,开始执行新的运动
    $('[name="go"]').click(function(){
        // go上添加,终止的是 back的运动
        $('div').stop().animate( {left:'500px' , top:'500px'} , 2000)
    })

    $('[name="back"]').click(function(){
        // 给back添加 .stop()
        // 作用是 在 执行当前 back的运动之前,如果还有其他正在执行的运动
        // 要立即停止,从当前停止的位置,直接执行back的运动
        // $('div').stop().animate( {left:'0px' , top:'50px'} , 2000);

        // back添加的,实际上是终止的的go的运动
        $('div').finish().animate( {left:'0px' , top:'50px'} , 2000);
    })
</script>

手风琴效果

<style> 
    *{
        margin: 0;
        padding: 0;
    }
    ul,ol,li{
        list-style: none;
    }

    ul{
        width: 720px;
        height: 280px;
        border: 3px solid #000;
        margin: 30px auto;
        display: flex;
        overflow: hidden;
    }

    ul>li{
        width: 180px;
    }

    ul>li>img{
        height: 100%;
        display: block;
    }
</style>
<ul>
    <li><img src="./images/01.jpg" alt=""></li>
    <li><img src="./images/02.jpg" alt=""></li>
    <li><img src="./images/03.jpg" alt=""></li>
    <li><img src="./images/04.jpg" alt=""></li>
</ul>
<script src="./jquery.min.js"></script>
<script>
    $('ul>li').mouseover(function(){
        // 让当前li的宽度变为520
        // 让兄弟li的宽度变为60
        $(this).stop().animate({width:520} , 1000).siblings().stop().animate({width:60} , 1000);
    })
    $('ul').mouseout(function(){
        // 让所有li的宽度,变为默认的 180
        $('ul>li').stop().animate( {width : 180} , 1000 );
    })
</script>

10_获取标签元素的尺寸

3个方法,4种使用方式

10-1_获取标签的内容

width() 和 height()

正常情况下 是 width 和 height

如果有 内减属性 就是 width / height - padding - border

<style>
    *{
        margin: 0;
        padding: 0;
    }

    div{
        width: 300px;
        height: 300px;
        padding: 10px;
        border: 20px solid #000;
        margin: 30px;
        background: pink;

        /* 内减模式 */
        box-sizing: border-box;
    }
</style>
<div></div>

<script src="./jquery.min.js"></script>
<script>
    console.log( $('div').width() ,  $('div').height() );
</script>
10-2_获取标签的内容 + padding

innerWidth() 和 innerHeight()

正常情况下 是 width / height + padding

如果有 内减属性 就是 width / height - border

console.log( $('div').innerWidth() , $('div').innerHeight() );

10-3_获取标签的内容 + padding + border

outerWidth() 和 outerHeight()

正常情况下 是 width / height + padding + border

有 内减属性 就是 width / height

console.log( $('div').outerWidth() , $('div').outerHeight() );

10-4_获取标签的内容 + padding + border + margin

outWidth(true) 和 outHeight(true)

有 内减属性 就是 width / height + margin

正常情况下 是 width / height + padding + border + margin

console.log( $('div').outerWidth(true) , $('div').outerHeight(true) );

11_获取标签元素的占位

offset()

可以获取

​ // 获取到 页面左上角 的间距

可以设定

​ // 设定参数是一个对象

​ // 设定的是 当前标签 与 页面左上角 的间距

​ // 与 标签 之前,写什么定位,写不写定位,写不写margin,写多少

​ // 都没有任何关系, offset() 写多少,跟 页面左上角 就间距多少

获取: console.log($('p').offset());

以定位形式来设定 与 页面左上角的间距

$('p').offset({left:0 , top:0});

position()

获取 当前标签 与 父级标签的 位置关系 --- 只获取定位的数值

​ // 执行结果是一个对象

​ // 只能获取,不能设定,不能传参

console.log( $('p').position() );

12_获取浏览器上卷高度

不用考虑浏览器的兼容性,jQuery会来处理

scrollTop()上卷的高度
scrollLeft() 平移的宽度
<style>
    *{
        margin: 0;
        padding:0;
    }
    body{
        height: 5000px;
    }

    div{
        width: 100%;
        height: 100px;
        background: pink;
        position: fixed;
        top:0;
        left:0;
        display: none;
    }

    p{
        width: 100px;
        height: 100px;
        background: blue;
        position: fixed;
        top:500px;
        right:100px;
        font-size: 40px;
        color: red;
        display: none;
    }
</style>

<div></div>
<p>返回</p>

<script src="./jquery.min.js"></script>

<script>
    // 获取浏览器上卷高度
    
    // jquery中,滚动条的监听事件
    $(window).scroll(function(){
        // 判断 浏览器的上卷高度
        if($(window).scrollTop() > 500){
            // 大于 500 , 让 div,下拉显示
            $('div').slideDown();
            $('p').slideDown();
        }else{
            // 小于等于 500 , 当div,上卷隐藏
            $('div').slideUp();
            $('p').slideUp();
        }
    })
    
    // 点击返回顶部
     $('p').click(function(){
         // 如果是设定,可以是 $(window) 或者 $('html')
         // 不过 这个是 瞬间完成 的
         // $(window).scrollTop(0);

         // 通过自定义动画,使用动画效果完成
         // 只能是 $('html') 来执行
         $('html').animate( { scrollTop: 0 } , 2000 );
     })

</script>

13_jquery的阻止冒泡、默认行为

阻止冒泡事件

e.stopPropagation();

$('标签对象').click(function(e){
    // 阻止冒泡事件
    e.stopPropagation();
})
阻止默认行为

e.preventDefault();

$('form').submit(function(e){
    // 如果是发送ajax请求,即时写了return阻止了函数的执行
    // 但是form表单有默认的提交事件,也会执行提交
    // 必须先阻止默认事件的执行
    e.preventDefault();
    // 如果账号密码正确,会发送ajax请求

    let nameVal = $('input').val();
    if( nameVal !== '张三' ){
        // 如果账号不是张三,就执行return,总之发送请求
        return;
    }
})

14_jquery封装Ajax请求

不用考虑 兼容,跨域等问题, jQuery全都给我们解决了

只需要在设定请求时,设定不同的参数,就可以完成不同的请求

get请求方式

$.get({

​ url : 地址(必填)

​ data : 携带的参数 对象形式

​ dataType : 期望的数据类型,如果为json,会将后端返回的json串,自动解析

​ success : function(){} 请求成功时执行的函数

​ })

post请求方式

$.post({

​ url : 地址(必填)

​ data : 携带的参数 对象形式

​ dataType : 期望的数据类型,如果为json,会将后端返回的json串,自动解析

​ success : function(){} 请求成功时执行的函数

​ })

综合方式

$.ajax({

常用:

​ url : 地址;

​ type / method : 请求方式 默认值是get方式

​ data : { } 传参参数,必须是对象形式

​ dataType : json, 设定为json,会自动解析反应提中的json串

​ success : function(){} 请求成功执行的函数

不常用:

​ async : 设定是否异步,默认值是true,异步执行ajax请求

​ error : function(){} 请求错误时执行的函数,请求成功时不会执行

​ timeout : 设定时间,单位 毫秒

​ 如果请求时间超过设定的时间,认为是请求失败

​ 必须是异步执行

​ cache : 设定是否缓存请求结果 ,默认值是 true,缓存请求结果

​ 必须是get方式,这个设定才起作用 ,post方式不会缓存,设定也没有效果

​ context : 指定 执行函数中 this的指向

​ })

jsonp跨域方式
<script>
    /*
      https://api-gw.damai.cn//search.html
      ?cat=1&
      destCity=%E5%85%A8%E5%9B%BD&
      _ksTS=1588160805375_101&
      callback=jsonp102&
      _=1234567890111
    */

    $.ajax({
        url: 'https://api-gw.damai.cn//search.html',
        dataType: 'jsonp', // 必须是 jsonp
        data: {
            cat: 2,
            destCity: '全国',
            _ksTS: 1588160805375_101
        },
        success: function (res) {
            console.log(res)
            // res 就是人家网站上的数据
        }
	})
</script>
xhr代理跨域方式
<script>
    $.ajax({
    	  //location = /dm {proxy_pass dm网址;}
          url: '/dm', // 你的代理标识符, 就是你的 nginx-conf 文件里面的 /xx
          type: 'GET', // 请求方式
          data: { // 你要携带的参数
            keyword: '',
            cty: '', // 城市, 默认为空, 表示全国, 你是哪个城市就写哪个城市
            ctl: '', // 分类
            sctl: '', // 子分类
            tsg: 0,
            st: '',
            et: '',
            order: 1, // 排序
            pageSize: 25, // 一页显示多少条数据
            currPage: 2, // 当前是第几页
            tn: ''
          },
          dataType: 'json',//期望的数据类型,如果为json,会将后端返回的json串,自动解析
          success: function (res) {
            console.log(res)
            // res 就是人家的数据
          }
    })
</script>
#### 15_jQuery的深浅拷贝

> 浅拷贝
>
> ​		拷贝复制引用数据类型的存储地址
>
> ​		执行浅拷贝,执行的变量之前,相互有关联
>
>  		一个操作修改存储的数据内容,另一个也会影响
>
> 深拷贝
>
> ​		拷贝复制引用数据类型的具体数值
>
> ​		执行浅拷贝,执行的变量之前,相互没有关联
>
> ​		一个操作修改存储的数据内容,另一个不会影响

> `$.extend() `深浅拷贝方法
>
> $.extend(参数1 , 参数2 , 参数3 , 参数4 ,参数5 ..);

```javascript
const obj = {
    id : 1,
    userName : 'zhangsan',
    userPwd : '123456',
    phone : '12345678901',
    data : {
        sex : '男',
        age : 18,
    }, 
};

const newObj = {};

// 默认值是false,或者不写
// 默认执行的是浅拷贝
// 如果存储的是基本数据类型,拷贝之后,两个变量之间的操作,相互不会影响
// 如果存储的是引用数据类型,拷贝之后,两个变量之间的操作,相互会影响
$.extend(newObj , obj);

// 如果设定参数1为 true
// 执行的是深拷贝
// 如果存储的是引用数据类型,拷贝之后,两个变量之间的操作,相互不会影响
$.extend(true , newObj , obj);

16_jQuery的多库并存

jQuery 设定 通过 $ 或者 jQuery 来代用设定的函数方法

如果与其他js文件设定的方法相互冲突,jQuery会交出控制权

语法方式1:

​ $.noConflict() jQuery.noConflict()

​ 都是 交出 $ 标识符 的控制权

​ 保留 jQuery 表示符 的控制权

语法方式2:

​ $.noConflict(true) jQuery.noConflict(true)

​ 都是 交出 $ 和 jQuery 标识符 的控制权

语法形式3:

​ 声明 变量 = $.noConflict(true) 声明 变量 = jQuery.noConflict(true)

​ 定义变量 为 jQuery 新的 标识符

​ 可以通过新的标识符,来获取 jQuery 的函数方法

17_jQuery的全局函数

jQuery的 ajax 全局钩子函数

1, $(window).ajaxStart()

​ 在 ajax 开始之前 触发

​ 如果一个作用域下,有多个人ajax,只会在第一个 ajax 请求之前触发

​ 有多个ajax,也只触发一次

2, $(window).ajaxSend()

​ 在 ajax 发送之前,会触发

​ 有几次send,就会触发几次

3, $(window).ajaxSuccess()

​ 在 ajax 请求成功时会触发

​ 有几次请求成功,就触发几次

4,$(window).ajaxError()

​ 在 ajax 请求失败时会触发

​ 有几次请求失败,就触发几次

5,$(window).ajaxComplete()

​ 在 ajax 请求完成时会触发

​ 有几次请求完成,就触发几次

6,$(window).ajaxStop()

​ 在 ajax 所有的请求完成时会触发

​ 多次请求结束,只有最后一次会触发

18_jQuery的插件机制

jquery的方法大致分为两大类:

​ ==>1 全局的$上的方法,比如:

​ ==>$.ajax

​ ==>$.each

​ ==>2 jquery的实例对象上的方法,比如:

​ ==>$('li').addClass()

​ ==>$('li').append()

​ ==>$('li').empty()

​ ==>3 jquery插件扩展在全局的$或者是jquery的实例对象上的方法,这个方法可以实现某个功能

​ ==>扩展方法1 :一次只能扩展一个

​ ==>扩展在这个全局对象上:.要扩展的属性/方法名 = 属性值/方法体

​ ==>扩展在jquery的实例对象上:.prototype.要扩展的属性/方法名 = 属性值/方法体,可以简写成.fn.要扩展的属性/方法名 = 属性值/方法体

​ ==>扩展方法2: 一次可以扩展多个

​ ==>扩展在这个全局对象上:.extend({要扩展的方法名1:方法体1,要扩展的方法名2:方法体2})

​ ==>扩展在jquery的实例对象上:$.fn.extend({要扩展的方法名1:方法体1,要扩展的方法名2:方法体2})

<div></div>
//扩展方法1
$.sum = function(a,b){
    console.log(a+b)
}

$.sum(1,2);


$.prototype.ccc = function(){
    console.log('ccc')
}

$('body').ccc();
$('div').ccc()


//扩展方法2
$.extend({
    fn1:function(){console.log('fn1');console.log(this==$)},
    fn2:function(){console.log('fn2');console.log(this==$)}
})
$.fn1()
$.fn2()

$.fn.extend({
    cc1:function(){
        console.log('cc1')
        console.log(this)
    },
    cc2:function(){
        console.log('cc2')
        console.log(this)
    }
})
//cc1方法中的this就是$('div')这个实例对象本身
$('div').cc1()