微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

jQuery(二)

jQuery(二)

0. jQ对象是伪数组

//jQ得到的元素是个伪数组,中包含了需要设置的样式名和样式值
//伪数组:本质上不是一个数组,但是操作方式看起来像数组,但是注意它没有数组的方法
//所以像forEach()是不能用的
<ul>
    <li>今天是jq第1天</li>
    <li>今天是jq第2天</li>
    <li>今天是jq第3天</li>
</ul>
<jscript>
        console.log(document.querySelectorAll('li')) //NodeList(3) [li, li, li]
        console.dir($('li'))    //jQuery.fn.init(3)
		console.dir($('li')[0])     //li
        console.dir($('li').__proto__.constructor) //  jQuery >> init()
        console.log($('li')[0].__proto__.constructor) // htmlElement
</jscript>

1. jQuery操作样式

1. 1 css操作

功能:设置或者修改样式,操作的是style属性

缺点: 样式要自己写, 代码不能复用, 繁琐.

更符合实际开发的是单独在css里写样式, 给需要的元素添加相关类名, 利用层叠性覆盖

//语法:
css(name, value);
//使用案例
$('#one').css('background','gray');

设置多个样式

//jQ得到的元素是个伪数组,中包含了需要设置的样式名和样式值
//伪数组:本质上不是一个数组,但是操作方式看起来像数组,但是注意它没有数组的方法
//所以像forEach()是不能用的
//语法:
css(obj);

//使用案例
$('#one').css({
    'background':'gray',
    'width':'400px',
    'height':'200px'
});

获取样式

//语法
css(name);
//案例
$('div').css('background-color');

注意:获取样式操作只会返回第一个元素对应的样式值

  1. 设置操作的时候,如果是多个元素,那么给所有的元素设置相同的值
  2. 获取操作的时候,如果是多个元素,那么只会返回第一个元素的值
  <ul>
    <li style="color:red">今天是jq第1天</li>
    <li style="color:green">今天是jq第2天</li>
    <li style="color:blue">今天是jq第3天</li>
  </ul>
 
  // 获取元素的样式,只能获取满足条件的第一个元素的样式值
  console.log($('li').css('color'))	//rgb(255, 0, 0)

1.2 class操作

添加样式类

//语法
addClass(name);
//例子,给所有的div添加one的样式。
$('div').addClass('one');

移除样式类

//语法
removeClass(name);
//例子,移除div中one的样式类名
$('div').removeClass('one');

判断是否有某个样式类

//name: 用于判断的样式类名,返回值为true false
hasClass(name)
//例子,判断是否有one的样式类
$('div').hasClass('one');

hasClass()能够判断所有元素是否有该类名, 不限于第一个元素

<ul>
    <li name="li1" class="1">1</li>
    <li name="li2" class="2">2</li>
    <li name="li3" class="3">3</li>
</ul>

console.log($('li').hasClass('2'))	//true
console.log($('li').hasClass('4'))	//false

切换样式类

toggle /ˈtɒɡl/ 切换

//name:需要切换的样式类名,如果有,移除该样式,如果没有,添加该样式。
toggleClass(name);
//例子
$('div').toggleClass('one');

2. jQuery操作属性

2.1 attr操作

设置单个属性

//语法
attr(name, value);
//第一个参数:需要设置的属性名
//第二个参数:对应的属性值
//用法举例
$(“img”).attr('title','哎哟,不错哦');
$(“img”).attr('alt”,'哎哟,不错哦');

设置多个属性

//语法
attr(obj)
//参数是一个对象,包含了需要设置的属性名和属性值
//用法举例
$('img').mouseenter(function () {
    $(this).attr({
        src: './images/07.jpg',
        width: '500px',
        height: 500,			//行内式可以不用加单位, 认px
        alt: '面向对象.jpg',
        title: '真面向"对象"呀?',
        myattr: 1				//不存在的自定义属性, 往里面添加
    })

获取属性

//传需要获取属性名称,返回对应的属性值
attr(name)
//用法举例
var oTitle = $('img').attr('title');
alert(oTitle);

.attr(name) 和获取样式一样, 只能获取到第一个元素的对应属性

<ul>
    <li name="li1">1</li>
    <li name="li2">2</li>
    <li name="li3">3</li>
</ul>

console.log($('li').attr('name')) //li1

移除属性

//参数:需要移除的属性名,
removeAttr(name);
//用法举例
$('img').removeAttr('title');

.removeAttr(name)会操作所有的元素 , 不限于第一个

<ul>
    <li name="li1">1</li>
    <li name="li2">2</li>
    <li name="li3">3</li>
</ul>

$('li').removeAttr('name')
console.log($('li').attr('name')) //undefined

常见错误(jq对象和dom对象转换): attr()方法是jq方法, 如果要在循环里为每一个元素使用, 那么不能用\((name)[i]. attr() 而是要使用==\)(name).eq(i) .attr()==

<!DOCTYPE html>
<html>

<head lang="en">
    <Meta charset="UTF-8">
    <title></title>
    <style type="text/css">
        body {
            font-family: "Helvetica", "Arial", serif;
            color: #333;
            background-color: #ccc;
            margin: 1em 10%;
        }

        h1 {
            color: #333;
            background-color: transparent;
        }

        a {
            color: #c60;
            background-color: transparent;
            font-weight: bold;
            text-decoration: none;
        }

        ul {
            padding: 0;
        }

        li {
            float: left;
            padding: 1em;
            list-style: none;
        }

        #imagegallery {

            list-style: none;
        }

        #imagegallery li {
            margin: 0px 20px 20px 0px;
            padding: 0px;
            display: inline;
        }

        #imagegallery li a img {
            border: 0;
        }
    </style>
    <script src="../js/jquery-1.12.4.min.js"></script>
</head>
<body>
    <h2>美女画廊</h2>
    <ul id="imagegallery">
        <li><a href="images/1.jpg" title="美女A">
                <img src="images/1-small.jpg" width="100" alt="美女1" />
            </a></li>
        <li><a href="images/2.jpg" title="美女B">
                <img src="images/2-small.jpg" width="100" alt="美女2" />
            </a></li>
        <li><a href="images/3.jpg" title="美女C">
                <img src="images/3-small.jpg" width="100" alt="美女3" />
            </a></li>
        <li><a href="images/4.jpg" title="美女D">
                <img src="images/4-small.jpg" width="100" alt="美女4" />
            </a></li>
    </ul>
    <div style="clear:both"></div>
    <img id="image" src="images/placeholder.png" alt="" width="450px" />
    <p id="des">选择一个图片</p>

    <script>
        //第一种方法
        // $(function () {
        //     //把a标签的href存到自定义属性
        //     let as = $('#imagegallery a')
        //     for (i = 0; i < as.length; i++) {
        //         as.eq(i).attr('myhref', as.eq(i).attr('href'))
        //         //a标签跳转失效  href="javascript:;"
        //         as.eq(i).attr('href', 'javascript:;')
        //     }

        //     //点击li, 获取当前li的后代a的myhref, 赋值给#image的src
        //     $('li').click(function () {
        //         let src = $(this).find('a').attr('myhref')
        //         let txt = $(this).find('a').attr('title')
        //         $('#image').attr('src', src)
        //         $('#des').html(txt)
        //     })
        // })

        // 另一种方法: 用jq的even方法
        $(function () {
            $('ul li a').click(function (e) {
                // e.stopPropagation() 阻止冒泡
                e.preventDefault();// 阻止认事件

                $('#image').attr('src', $(this).attr('href'))
                $('#des').text($(this).attr('title'))
            })
        })
    </script>
</body>
</html>

2.2 prop操作

在jQuery1.6之后,对于checked、selected、disabled这类boolean类型属性来说,不能用attr方法,只能用prop方法

官方的建议: true 和 false 两个属性属性,如 checked, selected 或者 disabled 使用prop(),其他的使用 attr()。

prop:property属性

获取在匹配的元素集中的一个元素的属性

//设置属性
$(“input:checked”).prop(“checked”,true);
//获取属性
$(“input:checked”).prop(“checked”);//返回true或者false

image-20201111223630582

//单选框和复选框的逻辑:
//1.单击复选框, 把单选框的状态和复选框一致
//2.单击单选框, 当选中的单选框数量等于单选框总数量时, 复选为true, 否则为false

$('input:checked') css的伪类选择器

jQ也有checked选择器 $(':checked'), 选取所有选中的复选框或单选按钮

https://www.w3school.com.cn/jquery/selector_input_checked.asp

3. jQuery动画+

jquery提供了三组基本动画,这些动画都是标准的、有规律的效果,jquery还提供了自定义动画的功能

3.1 三组基本动画

  • 显示(show)与隐藏(hide)是一组动画 (通过控制display)

  • 滑入(slideUp)与滑出(slideDown)与切换(slidetoggle),效果与卷帘门类似 (通过控制height)

  • 淡入(fadeIn)与淡出(fadeOut)与切换(fadetoggle) (通过控制opacity)

//语法
$(selector).show(speed,easing,callback)
参数 描述
speed 可选。规定显示效果的速度。认为 "0". 三种预定速度之一的字符串("slow","normal", or "fast")或表示动画时长的毫秒数值(如:1000) 备注: slow, normal, fast要加引号
easing 可选。规定在动画的不同点上元素的速度。认值为 'swing'。可能的值:'swing'- 在开头/结尾移动慢,在中间移动快, 'linear' - 匀速移动 备注: linear 和swing要加引号
callback 可选。show() 方法执行完之后,要执行的函数

slide动画:

slide

3.2 自定义动画

animate: 自定义动画

$(selector).animate({params},[speed],[easing],[callback]);
// {params}:要执行动画的CSS属性,带数字(必选)
// speed:执行动画时长(可选)
// easing: 执行效果认为swing(缓动)  可以是linear(匀速)
// callback:动画执行完后立即执行的回调函数(可选)

3.3 动画队列与停止动画

在同一个元素上执行多个动画,那么对于这个动画来说,后面的动画会被放到动画队列中,等前面的动画执行完成了才会执行。

1

//stop方法:停止动画队列中的所有动画效果
//jq对象.stop().当前要调用的动画
stop(clearQueue, jumpToEnd);
//第一个参数(可选):是否清除队列
//第二个参数(可选):是否跳转到最终效果
<script>
    $(function () {
        //鼠标移入
        $('li').mouseenter(function () {
            $(this).children('ul').stop().slideDown();
        });

        // 鼠标移出
        $('li').mouseleave(function () {
            $(this).children('ul').stop().slideUp();
        });

	});
</script>

4. 其他

隐式迭代

jQ内的方法普遍遍历内部的dom数组

js用单引号

为形成个人代码风格, 后续js一律有限单引号

js不用分号结束

es6推荐不使用;号结束一行代码, 为节省按键, 后续省略分号, 但如果下一行行首是(或者[, 就必须加分号, 不然会解析错误

jQ的链式写法

$(*this*).addClass('active').siblings().removeClass('active')

实际上链式操作仅仅是通过对象上的方法最后return this
把对象再返回回来,对象当然可以继续调用方法啦,所以就可以链式操作了

浏览器调试模式常见错误

访问一个不存在的变量,则报错,访问对象的不存在的属性,返回undefined

使a标签跳转失效

方法一: href="javascript:;"

方法二: 取消事件的认动作。

event.preventDefault() 方法阻止元素发生认的行为。

例如:

  • 当点击提交按钮时阻止对表单的提交
  • 阻止以下 URL 的链接
元素.click.(function(e){
	e.preventDefault()
})

//联想: DOM Event 对象也有preventDefault()方法
//e.stopPropagation(), 不再派发事件,阻止冒泡

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐