【jQuery】案例代码+思路解析

news/2024/7/11 1:32:46 标签: JavaScript, jquery, 案例

 
排他性
在这里插入图片描述

$("button").click(function() {
    $(this).siblings().css("backgroundColor", "");
    $(this).css("backgroundColor", "tomato");
})

 
 
隐藏下拉菜单
在这里插入图片描述

$(".nav>li").mouseover(function() {			// 鼠标经过,ul显示
	$(this).children("ul").show();
})
$(".nav>li").mouseout(function() {			// 鼠标离开,ul隐藏
	$(this).children("ul").hide();
})

// 优化(下拉动画效果)
$(".nav>li").hover(function() {
	$(this.children("ul")).stop().slideToggle();
})

 
 
tab栏切换(点击)
在这里插入图片描述

$("tab-list li").click(function() {											// 隐式迭代
	$(this).addClass("current").siblings().removeClass("current");			// 链式编程
	var index = $(this).index();
	$("tab-con li").eq(index).show().siblings().hide();
})

 
 
全选
在这里插入图片描述

// 关键思路(分别对应两个功能):
// 1. 当全选内勾选/取消时,所有的小按钮都被勾选/取消
// 2. 当小按钮被勾选/取消时,如何此时被选中的小按钮数===全部的小按钮数,则全选被勾选;否则不选中

// 全选按钮影响小按钮———勾选全选,所有按钮被勾选;取消全选,所有勾选被取消
$(".checkAll").change(function() {
        $(".checkOne").prop("checked", $(this).prop("checked"));
    })
// 小按钮影响全选按钮———当小按钮全被选中时候,全选按钮自动被勾选;否则,自动取消勾选
$(".checkOne").change(function() {
    if ($(".checkOne:checked").length === $(".checkOne").length) {		// length可以获得jQuery伪数组的长度	
        $(".checkAll").prop("checked", true);							// :checked写在选择器中,可选出所有被勾选的按钮
    } else {
        $(".checkAll").prop("checked", false);
    }
})

 
 
发布留言板(可删除留言)
在这里插入图片描述

<!-- 结构很简单 -->
<textarea name="" id="txt" cols="30" rows="10"></textarea>
<button class="btn">发布</button>
<ul></ul>
$(".btn").on("click", function() {		 	// 点击发布按钮,就将文本域的内容发布到ul的li中
    var li = $("<li></li>");
    li.html($("#txt").val() + "<a href='javascript:;'>删除</a>");
    $("ul").prepend(li);
    $("#txt").val("");
})
$("ul").on("click", "a", function() {		// 删除li
    $(this).parent().remove();
})


// 优化:li出现时的下拉效果(以及删除时的上拉效果)
$(".btn").on("click", function() {
    var li = $("<li></li>");
    li.html($("#txt").val() + "<a href='javascript:;'>删除</a>");
    $("ul").prepend(li);
    li.slideDown();			// 在这之前,在css中将li设置为dispaly:none,防止append时直接出现
    $("#txt").val("");
})
$("ul").on("click", "a", function() {
    $(this).parent().slideUp(function() {	// this指向【实际触发时间的a】而不是【绑定事件的ul】
        $(this).remove();					// this指向调用者,这里当然是调用回调函数的li
    });
})

/*
* 说几个重要的知识点:
* 1. 绑定删除事件时,采用了on的委托绑定写法;使用on是因为on可以给未来动态增加的新元素绑定事件
* 2. 删除li后的上拉效果,思路是"先上拉,再删除",且删除发生在上拉之后———正好可以使用回调函数
* 3. 注意一下上面标出的this的指向
*/

 
 
回到顶部
在这里插入图片描述

$(window).scroll(function() { 				// 小盒子出现和消失
    if ($(document).scrollTop() >= n) {
        $(".littleBox").fadeIn();
    } else {
        $(".littleBox").fadeOut();
    }
})

$(".littleBox").on("click", function() { 	// 回到顶部
     $(document).scrollTop(0);
})

$(".littleBox").on("click", function() { 	// 回到顶部(优化)
    $("body, html").stop().animate({ 		// 用一个动画回到顶部,而不是直接跳到顶部; 元素才能做动画,千万不要写成了document文档
        scrollTop: 0						// 这里的scorllTop是animate的一个属性
    })
})

 

 

todoList
在这里插入图片描述

>>> todoList的实现原理,
>>> 并不是 在每次check后,就把一个li在todoList和doneList移动————这样的话刷新后,数据绝对丢失
>>>
>>> 而是所有数据是一个对象: { title:..., done:...}; 所有数据(对象)组成一个数组
>>> 然后将整个数组转化为json格式,【存储在本地(浏览器中)】。再把这些数据读取为数组,渲染到浏览器上————★ 核心:修改的不是DOM而是本地数据
>>>
>>> 下面封装的三个函数是这个案例的核心,分别是:
         1. getData,读取本地数据。并将json转换为数组
         2. saveData,存储数据。getData的反操作,将数据转换为json并存入本地
         3. ★ load,加载渲染数据。根据数据数组的done属性,分别渲染到todoList和doneList之中
>>>
>>>
>>> 下面,尝试不要从【DOM】而是从【本地数据+渲染】的思路去理解todoList的功能:
		 1. 回车添加新的待办事项: 从本地读取数据(一个数组),更新(追加)数据,存回去。渲染。
		 2. 删除事项: 本地读取数据(一个数组),删除对应元素(对象),存回去。渲染。
		 3. ★ todoList和doneList事项的转移 :读取数据(一个数组),更改对应元素(对象)的done属性。渲染。
<header>
    <section class="w">
        <label for="title">TodoList</label>
        <!-- 输入框 -->
        <input type="text" id="title" name="title" placeholder="添加ToDo" required="required" autocomplete="off">
    </section>
</header>


<section class="w">

    <h2>正在进行<span id="todoCount"></span></h2>
    <ul class="todoList">
        <!-- <li>						【li的示例】
            <input type="checkbox">
            <p>萝莉赛高</p>
            <a href="#">删除</a>
        </li> -->							
    </ul>
    
    <h2>已经完成<span id="doneCount"></span></h2>
    <ul class="doneList">
        <li></li>
    </ul>
</section>
// var todoList = [{title: '萝莉', done: false}, {title: '萝莉',done: false}]     // 数组形式的数据【示例】

load();				// 打开页面就渲染一次

$("#title").on("keydown", function(e) { 				// 1. 思路:拿来本地原先的数据,追加后再存回去
    if (e.keyCode === 13 && $(this).val() !== "") {
        var local = getData();
        local.push({
            title: $(this).val(),
            done: false
    	});
    	
    	saveData(local);
    	load();
    	$(this).val("");
    }
})

$("ul").on("click", "a", function() { 	  			 // 2. 删除de思路:读取数据,删除数据,重新保存,渲染
    var data = getData();
    var index = $(this).attr("id");
    data.splice(index, 1);
    saveData(data);
    load();
})

$(".todoList, .doneList").on("click", "input", function() { 	// 3. 切换done属性
        var data = getData();
        var index = $(this).siblings("a").attr("id");
        data[index].done = $(this).prop("checked");
        saveData(data);
        load();
    })


// 下面封装的三个函数是这个案例的核心,分别是:
// 1. getData,读取本地数据。并将json转换为数组
// 2. saveData,存储数据。getData的反操作,将数据转换为json并存入本地
// 3. load,加载渲染数据。根据数据数组的done属性,分别显示到todoList和doneList之中


function getData() { 											// 读取本地存储的数据
    var data = localStorage.getItem("todoList");
    if (data !== null) {
        return JSON.parse(data); 	// 解析为存入时的数组格式(对象)
    } else {
        return []; 	// 返回一个空的数组对象
    }
}

function saveData(data) { 										// 保存本地存储的数据
    localStorage.setItem("todoList", JSON.stringify(data));
}

function load() { 												// 渲染数据
    var data = getData();
    $(".todoList, .doneList").empty();
    // 计数
    var todoCount = 0;
    var doneCount = 0;
    
    $.each(data, function(key, value) { 	// 每次渲染,都是删掉之前的li,遍历一次重新生成
        if (value.done) {
            $(".doneList").prepend("<li><input type='checkbox' checked='checked'><p>" + value.title + "</p><a href='#' id=" + key + ">删除</a></li>");
            doneCount++;
        } else {
            $(".todoList").prepend("<li><input type='checkbox'><p>" + value.title + "</p><a href='#' id=" + key + ">删除</a></li>");
            //id是给每条数据标识一下,点击a的时候可以对用这条数据(数组)(因为index方法没法对应到a上,因为a被li包裹,a之间不再是亲兄弟的关系)
            todoCount++;
        }
    })
    
    $("#todoCount").html(todoCount);
    $("#doneCount").html(doneCount);
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

☀ Loli & JS

♫ Suki


http://www.niftyadmin.cn/n/1330499.html

相关文章

HDU1711 (匹配第一个子串的位置)

Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 40539 Accepted Submission(s): 16730 Problem Description Given two sequences of numbers : a[1], a[2], …… , a[N], and b[1], b[2], ………

【Java】浅谈多线程与并发(图解)

▊ 线程 ① Thread是个表示线程的类。ta有启动线程、连接线程、闲置线程等方法 ② Java中每个线程都有独立的执行空间&#xff08;在栈上独立。而堆是公共空间&#xff09; ③ 如何启动自定义的新线程&#xff1f; ❶ 写一个实现Runnable的类&#xff08;Thread()需要一个任…

【图解算法】模板+变式——带你彻底搞懂字典树(Trie树)

啥是字典树&#xff1f; 【字典树】(Trie Tree) 是一种树形结构&#xff0c;是一种哈希树的变种。典型应用是用于统计&#xff0c;排序和保存大量的字符串&#xff08;但不仅限于字符串&#xff09;。 它的优点是&#xff1a;利用字符串的公共前缀来减少查询时间&#xff0c;最…

HDU 2087 (剪花布条 kmp 贪心找出最多有多少个子串)

Problem Description 一块花布条&#xff0c;里面有些图案&#xff0c;另有一块直接可用的小饰条&#xff0c;里面也有一些图案。对于给定的花布条和小饰条&#xff0c;计算一下能从花布条中尽可能剪出几块小饰条来呢&#xff1f; Input 输入中含有一些数据&#xff0c;分别…

【LeetCode】Sama的个人记录_25

【Q108】(md) 有序矩阵中第k小的元素 给定一个 n x n 矩阵&#xff0c;其中每行和每列元素均按升序排序&#xff0c;找到矩阵中第 k 小的元素。 请注意&#xff0c;它是排序后的第 k 小元素&#xff0c;而不是第 k 个不同的元素。 示例&#xff1a; matrix [ [ 1, 5, 9 …

【Java】常用的函数式接口(含示例)

有且只有一个抽象方法的接口。 FunctionalInterface // 注解&#xff1a;检测接口是否是一个函数式接口 修饰符 interface 接口名称 {public abstract void method(); // public abstract 还是推荐加上 }函数式接口通常与Lambda表达式配合使用&#xff08;戳这里&#x…

hiho1625 重复字符串匹配(重复拼接成母串)

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个字符串A和B&#xff0c;请你求出字符串A最少重复几次才能使得B是A的子串。 例如A”hiho”&#xff0c;B”hohihohi”。则A重复3次之后变为”hihohihohiho”&#xff0c;这时B是A的子串。 输入 输入包含多…

【Java】lambda表达式与函数式接口的完美配合

▊ lambda表达式的引入 ▌为什么需要lambda表示式&#xff1f; 举几个栗子&#xff1a; sort方法需要传入一个实现Comparator接口的类的实例&#xff1b;Timer需要传入一个实现ActionListener接口的类的实例&#xff1b;Thread需要传入一个实现Runnable接口的类的实例… 这是…