【JQuery】知识点总结

JQuery

基础介绍

  1. 介绍: jQuery 是一个高效、精简并且功能丰富的 JavaScript 工具库。它提供的 API 易于使用且兼容众多浏览器,这让诸如 HTML 文档遍历和操作、事件处理、动画和 Ajax 操作更加简单

  2. 理念: 写得少 做得多 write less, do more

  3. 百度下载地址:

    ​ cdn: https://www.bootcdn.cn/jquery/

    ​ 官网: https://jquery.com/

  4. 使用版本:

    ​ jquery.js: 未压缩版本 学习

    ​ jquery.min.js: 压缩版本 工作

  5. 引入方式:

    ​ \1. 引入本地文件: 常用

    ​ \2. 引入cdn文件: 不常用

    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
    <script src="js/jquery.js"></script>
    
  6. 最新版本:

    ​ 3.5.1

    ​ 2XX 3XX都不是兼容IE678

    ​ 1XX 兼容IE678

  7. 主要操作

  • HTML 元素选取
  • HTML 元素操作
  • CSS 操作
  • HTML 事件函数
  • JavaScript 特效和动画
  • HTML DOM 遍历和修改
  • AJAX
  • 隐式迭代
$与JQuery的关系
  • $与jQuery是同一个东西
console.log(jQuery)
console.log(window.jQuery)
console.log(window.$)
console.log($)
console.log(window.jQuery == $) // true

等待页面加载

window.onload

  • 必须等待网页全部加载完毕(包括图片资源等), 然后再执行包裹代码
  • 只能执行一次, 如果执行第二次,那么第一次的执行会被覆盖

$(document).ready()

  • 只需要等待网页中的DOM结构加载完毕, 就能执行包裹的代码
  • 可以执行多次,第N次不会被上一次所覆盖
  • 简写方案: $(function(){})
// 1. 原生等待页面及资源加载
window.onload = function(){
   console.log(1);
}
window.onload = function(){
   console.log(2);
} // 2

// 2. jquery 等待页面加载
// 2.1 $(document).ready(function(){})
$(document).ready(function(){
   console.log(3);
});
// 2.2 $().ready(函数);
$().ready(function(){
   console.log(4);
});
// 2.3 $(function(){});
$(function(){
   console.log(5);
}); // 3 4 5

JS 与JQuery互转

1.JS转成JQuery : $(js对象)
window.onload = function () {
// js原生方法获取元素
 var li = document.getElementsByTagName('li')
 console.log(li) // HTML Collection

 // js转成jq对象 $(js对象)
 console.log($(li)) // jQuery.fn.init(10)
 console.log($(li[0])) // jQuery.fn.init(10)
}
2.JQuery转成JS对象
  • jq对象[下标]
  • jq对象.get(下标)
 $(function () {
    var li = $('li')
    console.log(li)  // jQuery.fn.init(10)

    // jQuery对象转成js对象
    console.log(li[0]) // <li>0001</li>
    console.log(li.get(0)) // jq.get(下标) 
  })

JQuery选择器

基本选择器
console.log($('li')); // 标签选择器
console.log($('.a')); // 类名选择器
console.log($('#five')); // id名选择器
console.log($('.a,#five')); // 基本选择器
层级选择器

后代选择器 : 父 子

直接子元素 父 > 子

下一个兄弟 兄弟 + 下一个标签

后面所有的兄弟 兄弟 ~ 标签

// jq元素.css('属性名', '属性值')
// jq除非语法错误  否则不报错
// js对象用了jq方法  某些必传参数写错了
console.log($('ul li').css('background', 'red'));
console.log($('ul > li').css('background', 'yellow'));
console.log($('.box + div').css('background', 'blue'));
console.log($('.box ~ div').css('background-color', 'green'));
基本过滤选择器
$('ul li:first').css('background', 'red'); // 第一个元素
$('ul li:last').css('background', 'red'); // 最后一个元素
$('ul li:not(.box)').css('background', 'green'); // 类名不为box的li的元素
$('ul li:even').css('background', 'red'); // 索引为偶数的li的元素
$('ul li:odd').css('background', 'blue'); // 索引为奇数的li的元素
$('ul li:eq(5)').css('background', 'yellow'); // 获取索引为5的元素
$('ul li:lt(5)').css('background', 'pink'); // 索引小于5的元素
$('ul li:gt(5)').css('background', 'skyblue'); // 索引大于5的元素
内容过滤选择器
$('li:contains(6)').css('background', 'red'); // 文本中包含某个文字的
$('li:has(span)').css('background', 'blue'); // 标签中有span
$('li:parent').css('background', 'orange'); // li中有内容  文字  标签
$('li:empty').css('background', 'blue'); // li中为空的
可见性过滤选择器

不可见情况

  • input type=“hidden”
  • display:none
console.log($('li:visible'));
console.log($('li:hidden'));
console.log($('body *:hidden'));
console.log($('body *:visible'));
属性过滤选择器
 $('li[tag]').css('background', 'red'); // 获取有tag属性的li
 $('li[tag=123]').css('background', 'green'); // tag属性值为123的li
 $('li[tag!=123]').css('background', 'blue'); // tag属性值不为123的li

 $('li[title^=a]').css('background', 'yellow'); // title属性以a为开头
 $('li[title$=a]').css('background', 'orange'); // title属性以a为结尾
 $('li[title*=a]').css('background', 'skyblue'); // title中有a这个字符的
子元素过滤选择器
$('ul li:nth-child(1)').css('background', 'red'); // nth-child选中第几个
$('ul :nth-child(1)').css('background', 'blue'); // nth-child选中第几个
$('ul :nth-child(even)').css('background', 'pink'); // nth-child选中偶数
$('ul :nth-child(odd)').css('background', 'orange'); // nth-child选中奇数
$('ul :nth-child(3n+1)').css('background', 'blue'); // 表达式  1  4   7  

$('ul :first-child').css('background', 'purple');// 第一个
$('ul :last-child').css('background', 'purple');// 最后一个
表单属性过滤选择器
console.log($('input:enabled')); // 获取可用的输入框
console.log($('input:disabled')); // 获取不可用的输入框

console.log($(':checkbox:checked')); // 获取选中的复选框
console.log($(':radio:checked')); // 获取选中的单选框

console.log($('select :selected')); // 获取选中的下拉列表的项
表单元素过滤选择器
console.log($(':input')); // 获取所有的表单
console.log($(':text')); // 获取所有的输入框
console.log($(':radio')); // 单选按钮
console.log($(':checkbox')); // 复选按钮
console.log($(':button')); // 按钮
console.log($(':reset')); // 重置按钮
console.log($(':submit')); // 重置按钮
console.log($(':image')); // 上传图片
console.log($(':file')); // 上传文件 

节点遍历

子节点
// 1. 子节点
console.log($('ul').children());
console.log($('ul').children('li'));
console.log($('ul').children('li:odd'));

// 2. 上一个兄弟节点
$('.box').prev().css('background', 'red'); // 获取上一个
$('.box').prevAll().css('background', 'blue'); // 获取前面所有的
$('.box').prevAll('a').css('background', 'black'); // 获取前面所有的

// 3. 下一个兄弟节点
$('.box').next().css('background', 'orange'); // 获取下一个
$('.box').nextAll().css('background', 'green'); // 获取下面所有的

// 4. 获取所有的兄弟节点
$('.box').siblings().css('background', 'pink'); // 获取所有的兄弟节点
父节点
console.log($('.box').parent()); // 直接父节点
console.log($('.box').parents()); // 获取所有的父节点
console.log($('.box').parents('ul')); // 可以接收选择器作为接收条件
过滤节点
  • find | filter | not
$('ul').find('.box').css('background', 'pink'); //找到ul后 再去找ul中类名为box的元素
$('li').filter('.box').css('background', 'orange'); //找到li 在li中过滤出有类名.box的元素
 $('li').not('.box').css('background', 'blue'); //找到li 在li中过滤出没有类名.box的元素

取赋值

取赋值一体化: 即取值, 设置值使用同一个方法

取值: 只获取符合选择器条件的第一个元素的值

赋值: 遍历赋值(隐式迭代)

attr

​ jq对象.attr(‘属性名’) 获取

​ jq对象.attr(‘属性名’, ‘属性值’) 设置 只适用于单个属性的设置

​ jq对象.attr({

​ ‘属性名’: 属性值,

​ ‘属性名1’: 属性值1,

​ }); 适合批量设置多个属性

​ 既可以操作固有属性 也可以操作自定义属性

​ jq对象.removeAttr(‘属性名’);

console.log($('.box').attr('class'));
console.log($('.box').attr('id'));
console.log($('.box').attr('tag'));

$('.box').attr('id', 'a45678');
$('.box').attr('tag', 'weekDay');

$('li').attr({
    'name': 'isLi',
    'age': 20
});

$('li').attr('name', '');
$('li').removeAttr('name');

prop

​ 语法跟attr完全一致 使用有限制

​ \1. 只添加属性名就起作用的时候(固有属性)

​ \2. 属性值只有true、false checked disabled selected

​ jq对象.prop(‘属性名’) 获取

​ jq对象.prop(‘属性名’, ‘属性值’) 设置 只适用于单个属性的设置

​ jq对象.prop({

​ ‘属性名’: 属性值,

​ ‘属性名1’: 属性值1,

​ }); 适合批量设置多个属性

​ 可以操作固有属性

​ jq对象.removeProp(‘属性名’);

console.log($(':checkbox'));
console.log($(':checkbox').prop('checked'));
$(':checkbox').prop('checked', true);
$(':checkbox').prop({
    'name': 'check',
     'value': '复选框',
     'tag': '123',
     'checked': true
});
console.log($(':checkbox').removeProp('checked'));

链式调用

链式调用原理: jq方法在被调用之后, 将当前方法操作的对象或者操作以后的对象返回回来

操作类名

addClass

添加类名 jq对象.addClass(‘类名1 类名2’)

// $('div').addClass('active');
// $('div').addClass('active bg');
// console.log($('div').addClass('active').addClass('bg'));

removeClass

移除类名: jq对象.removeClass(‘类名 类名1’)

// $('div').removeClass('active bg');

toggleClass

添加移除类名 jq对象.toggleClass(‘类名’)

有类名的话 就移除 如果没有类名 就添加类名

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

hasClass

是否具有某个类名: jq对象.hasClass(‘类名’)

有 返回true 如果没有 返回false

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

is

是否具有某个选择器或状态: jq对象.is(’.类名’) ()里面写的是选择器

有 返回true 如果没有 返回false

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

操作样式

  1. jq对象.css(‘属性名’) 获取对应的值

  2. jq对象.css(‘属性名’, ‘属性值’) 设置 只设置单个样式属性

  3. jq对象.css({ ‘属性名’: 属性值,‘属性名1’: 属性值1 }) 设置

注意:

属性名: 可以加引号 也可以不加 如果不加的话 - 需要转成驼峰命名法 如果加引号 不需要转驼峰 建议加引号

属性值:

​ 带单位 ‘30px’

​ 数值 300 默认添加px

​ 表达式 ‘+=40’ -= *= /=

console.log($('div').css('width'));
console.log($('div').css('width', 300));
console.log($('div').css({
    'width': 500,
    'height': '300px',
    'font-size': '+=20'
}));
$('button').click(function(){
    $('div').css({
        'font-size': '+=10',
    });
})

操作内容

text

text(): 类似于innerText

​ \1. 取值: jq对象.text(); 获取到所有符合条件的元素的内容

​ \2. 设置: jq对象.text(‘内容’); 后面的会覆盖前面的 遍历设置

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

html

html(): 类似于innerHTML

​ \1. 取值: jq对象.html(); 获取符合条件的元素的第一个的内容

​ \2. 设置: jq对象.html(‘内容’); 后面的会覆盖前面的 遍历设置

​ 可以识别标签

console.log($('div').html());
console.log($('div').html('<i>这是我写的新内容</i>'));
$('p').text('<i>这是我写的新内容</i>');

val

val(): 类似于value

​ \1. 取值: jq对象.val(); 获取符合条件的元素的第一个的内容

​ \2. 设置: jq对象.val(‘内容’); 后面的会覆盖前面的 遍历设置

console.log($('input').val());
$(':text').val('新内容');

console.log($(':radio:checked').val());

$(':radio').val(['男']); // value上的值
console.log($(':checkbox').val());


$(':checkbox').val(['LOL', 'CS']);
console.log($('#city').val());

$('#city').val('nj');
console.log($('#mul').val());
console.log($('#mul').val(['bj', 'nj']));

BOM

三大宽高

  1. 宽: width height

  2. 可视宽高: clientWidth clientHeight

  3. 占位宽高: offsetWidth offsetHeight

  4. 滚去的高度: scrollTop

console.log($('div').width(), $('div').height()); // 宽 高  内容
console.log($('div').innerWidth(), $('div').innerHeight()); // 可视宽  可视高 
// content + padding
console.log($('div').outerWidth(), $('div').outerHeight()); // 占位宽、高 
//content + padding + border
// 有一个参数  布尔值: true--content + padding + border +margin  false/不传---content + padding + border
console.log($('div').outerWidth(true), $('div').outerHeight(true));

// 取赋值一体化 
// jq对象.width(数值)
$('div').width(500);
// jq对象.innerWidth(数值)   padding不会改变  变得是具体的内容宽高
$('div').innerWidth(500); // content + padding = 500  
// jq对象.outerWidth(数值, 是否包含margin)  true--表示包含   false/不传--表示不包含
$('div').outerWidth(500); // content + padding + border = 500   
$('div').outerWidth(500, true); // content + padding + border + margin = 500 

元素位置

当前元素距离具有定位属性父元素的距离

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

滚动高度

$(window).scroll(function(){
    console.log($(this).scrollTop())
    console.log($(this).scrollLeft())
});

DOM

创建节点

$(‘html片段’)

var li = $('<li>这是一个新标签</i>');
console.log(li);

追加节点

// 1. 追加到父节点的末尾

$('ul').append(li); // 父节点.append(子节点)
li.appendTo('ul'); // 子节点.appendTo('父节点选择器')
// 如果是一次性批量的往父元素中添加
li.appendTo('ul:eq(0)');
li.appendTo('ul:eq(1)');
// 分开步骤追加同一个节点到不同的父节点中  会发生物理位移

// 2.追加到父节点的开头
// prepend
// prependTo
$('ul').prepend(li); // 父节点.prepend(子节点)
li.prependTo('ul'); // 子节点.prependTo(父节点)

//3. 追加某个参考元素之前
// before  insertBefore
$('.box').before(li); // 参考节点.before(新节点)
li.insertBefore('.box'); // 新节点.insetBefore('选择器')

// 4. 追加到某个参考元素之后
// after  insetAfter
$('.box').after(li); // 参考节点.after(新节点)
li.insertAfter('.box'); // 新节点.insertAfter('选择器')

删除节点

  1. detach: 删除当前元素, 返回被删除的元素, 可以保留之前元素的行为

  2. remove: 删除当前元素, 返回被删除的元素, 不能保留之前元素的行为

  3. empty: 清空当前元素(删除当前元素的所有子元素)

$('ul li').click(function(){
    $(this).css('background', 'red');
});

// :eq(0)   jq对象.eq(下标)   得到的都是jq对象
$('button:eq(0)').click(function(){
    var li = $('ul li').eq(0).detach();
    console.log(li);
    setTimeout(function(){
        $('ul').append(li);
    }, 2000);
});

$('button:eq(1)').click(function(){
    var li = $('ul li').eq(0).remove();
    console.log(li);
    setTimeout(function(){
        $('ul').append(li);
    }, 2000);
});


$('button:eq(2)').click(function(){
    $('ul').empty();
});

克隆节点

jq对象.clone(布尔值) 返回克隆的节点 页面不存在 需要追加到页面中才能看到

不传/false 表示不克隆行为 true 表示克隆行为

$('ul li').click(function(){
    console.log(this);
});

// jq对象.clone(布尔值)  返回克隆的节点  页面不存在 需要追加到页面中才能看到
// 不传/false  表示不克隆行为   true  表示克隆行为
$('button').click(function(){
    // var li = $('ul li').eq(0).clone();
    var li = $('ul li').eq(0).clone(true);
    $('ul').append(li);
});

替换节点

replaceAll: 新节点.replaceAll(‘选择器’)

replaceWith: $(‘参考节点’).replaceWith(新节点)

var li = $('<p>这是非法嵌套</p>');
// $('li').replaceWith(li); 
li.replaceAll('li');

包裹节点

// 链式调用原理: jq方法操作的对象或者是操作以后的对象返回回来
// 1. jq对象.wrap('标签')  jq对象的外面包裹一层标签
$('span').wrap('<div></div>');

// 2. jq对象.wrapInner('标签');  jq对象的里面包裹一层标签
$('span').wrapInner('<i>12345</i>');

// 3. jq对象.wrapAll('标签')  jq对象包裹在一个标签中
var b = $('span').wrapAll('<p></p>');

// 4. jq对象.unwrap(); jq对象删除以及父节点  删到body截止
var a = $('span').unwrap().unwrap().unwrap().unwrap();
console.log(a, b);

事件对象

/* 
    事件对象: 事件处理函数的第一个参数
*/
$('div').click(function(ev){
    console.log(ev); // jQuery.Event
    console.log(ev.originalEvent); // 原生事件对象
    console.log(ev.type); // 事件类型
    console.log(ev.target); // 触发源
    console.log(ev.delegateTarget); // 事件的绑定对象
    console.log(ev.which); // 与keyCode基本一致,比keyCode强大  保留鼠标的左中右  123
    console.log(ev.screenX, ev.screenY); // 鼠标距离屏幕左上角
    console.log(ev.pageX, ev.pageY); // 鼠标距离页面左上角
    console.log(ev.offsetX, ev.offsetY); // 鼠标距离div的左上角的距离
    console.log(ev.ctrlKey, ev.shiftKey, ev.altKey); // 事件触发的时候  对应的键是否被按下
    console.log(ev.clientX, ev.clientY); // 鼠标相对于屏幕左上角可视区域的距离

    // 阻止冒泡
    ev.stopPropagation();
    // 阻止默认行为
    ev.preventDefault();
    // 阻止冒泡 + 阻止默认事件
    return false;
    // 一般写在函数的最后
});
$(document).contextmenu(function(){
    // return false;
});

事件绑定

on

  1. 给同一个元素绑定同一事件不同的事件处理函数

    function a(){
        console.log(1);
    }
    function b(ev){
        console.log(ev.type);
    }
    // 1. jq对象.on('事件类型', 事件处理函数)
    $('div').on('click', a);
    $('div').on('click', b);
    
  2. 给同一元素的不同事件添加同一处理函数

    jq对象.on(‘事件类型 事件类型1 事件类型2’, 事件处理函数)

    $('div').on('click dblclick mouseenter mouseleave contextmenu', b);
    
  3. 给同一个元素的不同事件添加对应的事件处理函数

    jq对象.on({ 属性名: 函数}) 属性名—事件类型

    $('div').on({
        'click': b,
        'mouseenter': a,
        'mouseleave': function(){
            console.log(2);
        },
        // 'click': a // 如果属性名相同  后面的覆盖前面的
    });
    
  4. 绑定自定义事件

    自定义事件

    $('div').on('abc', function(){
        console.log('哈哈哈哈哈');
    });
    // 手动触发: jq对象.trigger(自定义事件类型)
    setTimeout(function(){
        $('div').trigger('abc'); // 手动触发自定义事件
    }, 3000);
    
  5. 实现事件委托 元素可以发生在未来

    事件委托: jq对象.on(事件类型, 选择器, 事件处理函数)

    $('div').on('click', 'p', function(){
        console.log($(this).text());
    });
    $('div').append('<p>12345</p>');
    

命名空间

/* 
    jq对象.on();
    jquery1.7版本以上 delegate  bind  live
*/
function a(){
   console.log(1);
}
function b(ev){
   console.log(ev.type);
}

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

$('div').on('mouseover.a', function(){
    console.log(4);
});

off

事件取消: jq对象.off(事件类型, 处理函数的名字);

事件处理函数的名字可写可不写

/* 
    jq对象.on();
    jquery1.7版本以上 delegate  bind  live
*/
function a(){
    console.log(1);
}
function b(ev){
    console.log(ev.type);
}

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

$('div').on('mouseover.a', function(){
    console.log(4);
});

$('div').on('click', a);
$('div').on('click', b);

/* 
    事件取消: jq对象.off(事件类型, 处理函数的名字);
    事件处理函数的名字可写可不写
*/
$('div').off('click', a);
$('div').off('click.a');
$('div').off('click');
$('div').on('click', function (){
    console.log(333);
});

// 无法取消事件
// $('div').off('click', function(){
//     console.log(333);
// });
$('div').off('click');

one

one: on用法完全一致

区别: one一次性事件

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


// 用on模拟one事件
$('div').on('click', function(){
    console.log(1);
    // 解绑事件
    $(this).off('click');
});

合成事件

语法: jq对象.hover();

​ 参数是一个函数:滑入滑出事件都触发这个函数

​ 参数是两个函数: 滑入函数 和 滑出函数

$('div').hover(function(ev){
   console.log(ev.type);
});

$('div').hover(function(ev){
    $(this).html('这是enter');
    $(this).css('background', 'blue');
}, function(){
    $(this).html('这是leave');
    $(this).css('background', 'green');
});

遍历

$.each

$.each(数据, 函数)

​ 函数有两个形参 第一个形参是索引/属性名 第二个形参具体的值

// 1. 遍历集合
$.each($('li'), function(i, v){
    // console.log(i, v);
    $(v).css('background', 'red');
    console.log(this); // 当前的元素
    console.log(this == v);
});


// 2. 遍历数组
var arr = ['a', 'b', 'c', 'd', 'e'];
$.each(arr, function(i, v){
    console.log(i, v);
    console.log(this); // 当前的值
    console.log(v == this);
});

// 3. 遍历对象
var obj = {
    name: '彭于晏',
    height: 188,
    age: 18
};
$.each(obj, function(k, v){
    console.log(k, v);
});

$().each

$().each(函数)

​ 函数有两个形参 第一个形参是索引 第二个形参具体的值

​ 不能遍历对象

// 1. 遍历集合
$('li').each(function (i, v) {
    // console.log(i, v);
    console.log(this);
});

// 2. 数组
var arr = ['a', '1', 2, 3, 4, 5];
$(arr).each(function(i,v){
    console.log(i, v);
});

extend

浅拷贝

浅拷贝: 只比较属性名,如果属性名重复,用后面的覆盖前面的

返回拼接数据以后的dest

工具: $.extend(dest, src, src);

var obj = {
    name: '张艺兴',
    height: 198,
    age: 33
};

var obj1 = {
    age: 18,
    tip: '挣钱'
}

// 工具: $.extend(dest, src, src);  

// 浅拷贝: 只比较属性名,如果属性名重复,用后面的覆盖前面的
// 返回拼接数据以后的dest
var objnew = $.extend(obj, obj1);
console.log(obj);
console.log(objnew);
console.log(objnew == obj);

// 会改变dest里数据  可以使用以下方法
$.extend({}, src, src1...)
var objnew1 = $.extend({}, obj, obj1);
console.log(objnew1);
console.log(obj);

深拷贝

深拷贝: $.extend(true, dest, src, src)

原理: 将$.extend的第一个参数设置成true的时候就是深拷贝。

过程: 先看属性名是否重复,不重复就把属性名和属性值拷贝进来,如果属性名重复, 有一个属性值不是对象的时候,就用后面的覆盖前面的,如果都是对象,就会对比子属性, 重复上述过程.

var a = {
    name: 1,
    age:{
        n: 30,
        l: 18
    },
    height: 188,
    xl: 8
};

var b = {
    name: 2,
    age: {
        n: 31,
        look: 19
    }
}

var o = $.extend(true, {}, a, b);
console.log(o);

动画

show、hide、toggle

  1. show

    show: 不传参 没有动画效果

    ​ 传参 有动画效果

    show(speed, easing, fn); w + h + o

    ​ speed: 速度 毫秒数 fast slow

    ​ easing: 运动曲线 linear swing

    ​ fn: 回调函数

    $('button').eq(0).click(function(){
        // $('div').eq(0).show(2000);
        // $('div').eq(0).show('slow');
        $('div').eq(0).show(5000, 'linear', function(){
            console.log(1);
        });
        $('div').eq(1).show(5000, 'swing', function(){
            console.log(2);
        });
    });
    
  2. hide

    hide: 不传参 没有动画效果

    ​ 传参 有动画效果

    hide(speed, easing, fn); w + h + o

    ​ speed: 速度 毫秒数 fast slow

    ​ easing: 运动曲线 linear swing

    ​ fn: 回调函数

    $('button').eq(1).click(function(){
        $('div').eq(0).hide(5000, 'linear', function(){
            console.log(1);
        });
        $('div').eq(1).hide(5000, 'swing', function(){
            console.log(2);
        });
    });
    
  3. toggle

    toggle有就隐藏 没有就显示

    toggle: 不传参 没有动画效果

    ​ 传参 有动画效果

    toggle(speed, easing, fn); w + h + o

    ​ speed: 速度 毫秒数 fast slow

    ​ easing: 运动曲线 linear swing

    ​ fn: 回调函数

    $('button').eq(2).click(function(){
        $('div').eq(0).toggle(5000, 'linear', function(){
            console.log(1);
        });
        $('div').eq(1).toggle(5000, 'swing', function(){
            console.log(2);
        });
    });
    

slide

​ slide: 改变元素的高

​ slideDown: 显示

​ slideUp: 收起

​ slideToggle: 有就收起 没有就展开

  1. slideDown

    slideDown: 不传参 有动画效果

    ​ 传参 有动画效果

    slideDown(speed, easing, fn);

    ​ speed: 速度 毫秒数 fast slow

    ​ easing: 运动曲线 linear swing

    ​ fn: 回调函数

    $('button').eq(0).click(function(){
        $('div').eq(0).slideDown(5000, 'linear');
        $('div').eq(1).slideDown(5000, 'swing');
    });
    
  2. slideUp

    slideUp: 不传参 有动画效果

    ​ 传参 有动画效果

    slideUp(speed, easing, fn);

    ​ speed: 速度 毫秒数 fast slow

    ​ easing: 运动曲线 linear swing

    ​ fn: 回调函数

    $('button').eq(1).click(function(){
        $('div').eq(0).slideUp(5000, 'linear');
        $('div').eq(1).slideUp(5000, 'swing');
    });
    
  3. slideToggle

    slideToggle: 不传参 有动画效果

    ​ 传参 有动画效果

    slideToggle(speed, easing, fn);

    ​ speed: 速度 毫秒数 fast slow

    ​ easing: 运动曲线 linear swing

    ​ fn: 回调函数

    $('button').eq(2).click(function(){
        $('div').eq(0).slideToggle(5000, 'linear');
        $('div').eq(1).slideToggle(5000, 'swing');
    });
    

fade

​ fade: 改变元素的透明度

​ fadeIn: 进入

​ fadeOut: 隐藏

​ fadeToggle: 有就隐藏没有就显示

​ fadeTo: 变道某个透明度

  1. fadeIn

    fade(speed, easing, fn)

    没有参数的时候 也有动画

    $('button').eq(0).click(function(){
        $('div').eq(0).fadeIn(5000, 'linear');
        $('div').eq(1).fadeIn(5000, 'swing');
    });
    
  2. fadeOut

    $('button').eq(1).click(function(){
        $('div').eq(0).fadeOut(5000, 'linear');
        $('div').eq(1).fadeOut(5000, 'swing');
    });
    
  3. fadeToggle

    $('button').eq(2).click(function(){
        $('div').eq(0).fadeToggle(5000, 'linear');
        $('div').eq(1).fadeToggle(5000, 'swing');
    });
    
  4. fadeTo

    fadeTo(speed, to 透明度, easing, fn)

    $('button').eq(3).click(function(){
        $('div').eq(0).fadeTo(5000, .5, 'linear');
        $('div').eq(1).fadeTo(5000, .5, 'swing');
    });
    

animate

第一种

第一种: jq对象.animate(动画参数, speed, easing, fn);

​ 动画参数: 对象 {‘属性’: 属性值, ‘属性’: 属性值}

​ 属性值: 数字 带单位字符 表达式 show、hide、toggle

​ speed: 运动速度 毫秒数 默认值 400ms

​ easing: 运动曲线 linear swing

​ fn: 回调函数

$('button').eq(0).click(function(){
    $('div').animate({
        // 'left': '+=100',
        // 'left': '400px',
        'width': 'hide',
        'top': 400
    }, 2000, 'swing', function(){
        console.log(1);
    });
});
第二种

animate(动画参数, 动画配置属性)

动画配置属性可选: {}

​ duration: 运动时长 ms

​ easing: 运动方式 linear swing

​ step: 每一步动画触发的回调函数

​ complete: 动画执行结束以后的回调函数

​ queue: 是否队列 如果设置false 无论动画写在什么位置 在第一时间触发

$('button').eq(1).click(function () {
    $('div').animate({
        'width': 400,
        'height': 400
    }, {
        'duration': 2000,
        'easing': 'linear',
        'step': function () { console.log(1) },
        'complete': function () { console.log('完成') },
        'queue': true
    }).animate({
        'top': '400px',
        'left': 400
    }, {
        'duration': 2000,
        'queue': false
    });
});

停止动画

stop

.stop(clearQueue, gotoEnd)

​ clearQueue: 是否清除后续队列 true–表示清除 false—不清除

​ gotoEnd: 是否到达结束值 true—直接到结束值 false—保留在当前值

$('button').eq(1).click(function(){
    // $('div').stop();
    // $('div').stop(true); // 表示要清除后续队列  
    // $('div').stop(true, true); // 表示要清除后续队列    到达目标值
    // $('div').stop(false, true); // 表示不清除后续队列    到达目标值
});
finish

.finish() 结束所有动画 并且到目标值

$('button').eq(1).click(function(){
    $('div').finish();
});

延迟动画

.delay(时间) 时间ms

$('button').eq(0).click(function(){
    $('div').animate({
        width: 1000,
        height: 1000
    }, 10000).delay(5000).animate({
        left: 1000,
        top: 1000
    }, 10000);
});

queue

问题: css不是动画 不会进入动画的队列 不会等待前面的动画执行结束以后在执行

css在动画开始的一瞬间就执行完成

手动加入队列: jq对象.queue(function(){ // 要执行的效果 })

手动以后的问题: queue后面所有的动画都不在执行

$('div').slideUp(1000)
    .slideDown(1000)
    // .css('background', 'yellow')
    .queue(function(next){
        $(this).css('background', 'yellow');
        // next是一个函数  
        next();
    })
    .slideUp(1000)
    .slideDown(1000);

.queue可以理解成不听话的, 帮助其他的效果和代码的插入, 后续的动画不满意此操作, 需要将后续的动画由专一的函数进行服务

AJAX

优点:

​ \1. 用户等待时间短

​ \2. 交互

​ \3. 对服务器的压力比较小

​ \4. 带宽要求不好

缺点:

​ \1. 对ajax对于搜索引擎支持

​ \2. 破坏前进、后退按钮

ajax:

​ 底层: $.ajax

​ 高级: $.get $.post

$.ajax

$.ajax({

​ url: 请求地址, 必传项

​ type: 请求方式, get post

​ data: 传输的数据 a=1&b=2 对象

​ success: 成功的回调函数, 200 304 有形参, 这个形参就是返回回来的数据

​ error: 错误的回调函数 有形参 返回创建的ajax对象

​ complete: 请求完成以后的回调函数 有形参 返回创建的ajax对象

​ timeout: 超时时间 毫秒ms

​ datatype: 设置请求返回的期望数据的类型 text html script json … jsonp(不是期望数据类型,一个标志)

​ cache: 是否使用缓存(当页面地址已经请求过并且存下来数据)

});

$.ajax({
    url: './banner.json',
    // url: './banner1.json',
    type: 'get',
    // data: 'a=1&b=2'
    data: {a: 22, b: 333},
    success: function(res){
        console.log(res);
    },
    error: function(err){
        console.log('错误报错', err);
    },
    complete: function(com){
        console.log('请求完成', com);
    },
    // timeout: 1
    // dataType: 'text'
    dataType: 'json'
});

$.get

语法: $.get(url, [data], [callback])

$.get('./banner.json', 'a=1',function(res){
    console.log(res);
});

$.post

语法: $.post(url, [data], [callback])

$.post('./banner.json', 'a=1',function(res){
    console.log(res);
});

get和post的区别

get参数通过url传递,post放在request body中。
get请求在url中传递的参数是有长度限制的,而post没有。
get比post更不安全,因为参数直接暴露在url中,所以不能用来传递敏感信息。
get请求只能进行url编码,而post支持多种编码方式
get请求会浏览器主动cache,请求参数会被完整保留在浏览历史记录里,而 post 中的参数不会被保留
GET产生一个TCP数据包;POST产生两个TCP数据包

jsonp

错误: 跨域问题

​ Access to XMLHttpRequest at ‘https://p.3.cn/prices/mgets?skuIds=J_5089253&type=1’ from origin ‘http://127.0.0.1:5500’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.

错误来源: 由于浏览器对js的同源策略的限制

同源策略: 同一个域名同一个端口同一种协议

非同源:

​ 不同协议

​ 同一个地址,不同的端口

​ 不同的地址

jsonp: json with padding

var url = 'https://p.3.cn/prices/mgets?skuIds=J_5089253&type=1';
$.ajax({
    url: url,
    success: function(res){
        console.log(res);
    },
    error: function(err){
        console.log(err);
    },
    dataType: 'jsonp', // 告知jq  用jsonp的方式进行数据请求
});

注意事项: jsonp只支持get请求 不支持post请求

原理:

动态的往页面中添加script标签, 将src设置成要访问的地址

var url = 'https://p.3.cn/prices/mgets?skuIds=J_5089253&type=1&callback=a';

// 点击按钮的时候 发送数据请求
$('button').click(function(){
    var sr = $('<script src="' + url + '"><\/script>');
    $('body').append(sr);
});
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值