JS踩过的坑
一:DOM对象的查找
DOM的查找到的对象,除byID的之外,返回的都是一个数组,并不是DOM对象无法调用DOM对象的方法。
通过id查找:
因为id在一个HTML文件中唯一,因此查找到的只会是一个元素对象以数组形式(对象,)返回。直接就把对象赋值给变量了。
var dEle = document.getElementById('d1')
<div id="d1" class="left">…</div>
dEle.style.color = 'red'
通过其他选择器查找:
以标签选择器为例
var dEle = document.getElementsByTagName('div')
HTMLCollection(5) [div#d1.left,div.item, div.item, div.right, d1: div#d1.left]
//查找到了5个对象,以数组形式返回,赋值给了变量dEle
dEle.style.color = 'red'
VM279:1 Uncaught TypeError: Cannot set property 'color' of undefined
at <anonymous>:1:5
//程序报错,dEle并不是一个DOM对象,是一个数组,无法调用DOM的对象方法。
二:JQuery对象查找
以任何方式查找到的都是jQuery对象,但是有很大的可能,是多个元素的集合体。
以id选择器查找
var $d1Ele = $('#d1')
$d1Ele.css('color','yellow')
以类选择器查找
$('.item').length;
9
$('.item').css('color','red');
三:jQuery操作标签样式
踩坑点:左侧菜单实例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>左侧菜单示例</title>
<style>
body {
width: 100%;
margin: 0;
height: 1000px;
}
.hide {
display: none;
}
.left {
width: 20%;
height: 100%;
background-color: #222222;
}
.item {
color: black;
margin-bottom: 15px; }
.title {
margin-top: 15px;
margin-bottom: 15px;
background-color: red;
}
.items {
background-color: blueviolet;
}
</style>
</head>
<body> <div id = 'd1' class="left">
<div class="menu">
<div clas="title">菜单一</div>
<div class="items">
<div class="item">111</div>
<div class="item">222</div>
<div class="item">333</div>
</div>
<div class="title">菜单二</div>
<div class="items hide">
<div class="item">111</div>
<div class="item">222</div>
<div class="item">333</div>
</div>
<div class="title">菜单三</div>
<div class="items hide">
<div class="item">111</div>
<div class="item">222</div>
<div class="item">333</div>
</div>
</div>
</div>
<div class="right"></div>
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script> <script>
$('.title').click(function () {
$('.items').addClass('hide');
$(this).next().removeClass('hide')
});
</script>
$('.title').click(function () {
$('.items').addClass('hide');
$(this).next().removeClass('hide')
});
画蛇添足,在操作jQuery对象修改CSS样式时,随手给类加了点变成('.hide'),直接GG,愚蠢的错误。
教训:要严格区分开对象的查找和CSS样式修改的差异化。
四:jQuery文档处理
把B元素追加到A元素内部的后面
$(A).append(B)// 把B追加到A
$(A).appendTo(B)// 把A追加到B
在这里需要注意,如果要把B元素追加A元素内部:
如果A元素是块级元素,那么B元素可以是文本字符,也可以是HTML标签
$('.c1')
w.fn.init [div#d1.c1, prevObject: w.fn.init(1)]
//$('.c1')是块级元素div $('.c1').append(p1Ele) //追加P标签
$('.c1').append('p1Ele') //追加文本'p1Ele'
如果A元素是行内元素,那么B元素只可以是文本字符,不能够追加HTML标签
五:clone()方法
在文件中第一次新增正常,第二次添加,出现同一元素被克隆两次
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>作业</title>
<style>
table {
text-align: center;
background-color: burlywood;
} td, th {
width: 100px;
height: 30px;
background-color: white;
} #b1 {
width: 105px;
height: 30px;
} .cover {
position: fixed;
background-color: darkgrey;
top: 0;
bottom: 0;
left: 0;
right: 0;
z-index: 9;
} .modal {
width: 600px;
height: 400px;
background-color: white;
position: fixed;
left: 50%;
top: 50%;
margin-left: -300px;
margin-top: -200px;
z-index: 10;
} .hide {
display: none;
}
</style>
</head>
<body>
<button id="b1">新增</button>
<div class="modal hide">
<p>
姓名
<input type="text" name="username">
</p>
<p>
爱好
<input type="text" name="hobby">
</p>
<input type="submit" value="提交">
<button id="b2">取消</button>
</div>
<div class="cover hide"></div> <table>
<thead>
<tr>
<th>#</th>
<th>姓名</th>
<th>爱好</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr>
<td class="num">1</td>
<td>egon</td>
<td>喊麦</td>
<td>
<button name='edit'>编辑</button>
<button name='del'>删除</button>
</td>
</tr>
<tr>
<td class="num">2</td>
<td>Alex</td>
<td>吹牛逼</td>
<td>
<button name='edit'>编辑</button>
<button name='del'>删除</button>
</td>
</tr>
<tr>
<td class="num">3</td>
<td>元昊</td>
<td>不洗头</td>
<td class="operate">
<button name='edit'>编辑</button>
<button name='del'>删除</button>
</td>
</tr>
</tbody>
</table>
<script src="../jquery-3.3.1.min.js"></script>
<script>
//新增功能
$('#b1').on("click", function () {
$('.hide').removeClass('hide');
});
//提交输入数据
$("input[type = 'submit']").on("click", function () {
var $name = $("input[name = 'username']");
var $hobby = $("input[name = 'hobby']");
if (!$name.val()){ }
var trEle = document.createElement('tr');
$('tbody').append(trEle); var tdEle1 = document.createElement('td');
$(tdEle1).text($('tbody>tr').length);
$(trEle).append(tdEle1); var tdEle2 = document.createElement('td');
$(tdEle2).text($name.val());
$(trEle).append(tdEle2); var tdEle3 = document.createElement('td');
$(tdEle3).text($hobby.val());
$(trEle).append(tdEle3); $(trEle).append($($('.operate')[0]).clone(true)); $('.modal').addClass('hide');
$('.cover').addClass('hide'); $name.val('');
$hobby.val(''); }); //取消新增
$("#b2").on("click", function () {
$("input[name = 'username']").val('');
$("input[name = 'hobby']").val('');
$('.modal').addClass('hide');
$('.cover').addClass('hide');
}); </script>
</body>
</html>
将上面之前出现错误的的代码拿下来分析:
$(trEle).append($('.operate').clone(true));
$(trEle).append($($('.operate')[0]).clone(true));
//以为选择器选取查找元素,上述表达式,在第一次clone时,会正常进行,第二次会变成二,第三次会变成六。
//这是因为,第一次克隆时,只找到一个元素,当克隆完成后,HTML中就有了两个class = 'operate'的元素了。因此就查
//找到了两个元素,然后这两个元素被拷贝,添加到新的一项中去
$(trEle).append($('.operate')[0].clone(true));
//对查找到的元素处理一下,只取第一个克隆,就避免了上面的问题。
持续踩坑中。。。。。。。。。
JS踩过的坑的更多相关文章
- react基础学习和react服务端渲染框架next.js踩坑
说明 React作为Facebook 内部开发 Instagram 的项目中,是一个用来构建用户界面的优秀 JS 库,于 2013 年 5 月开源.作为前端的三大框架之一,React的应用可以说是非常 ...
- web开发实战--弹出式富文本编辑器的实现思路和踩过的坑
前言: 和弟弟合作, 一起整了个智慧屋的小web站点, 里面包含了很多经典的智力和推理题. 其实该站点从技术层面来分析的话, 也算一个信息发布站点. 因此在该网站的后台运营中, 富文本的编辑器显得尤为 ...
- "开发路上踩过的坑要一个个填起来————持续更新······(7月30日)"
欢迎转载,请注明出处! https://gii16.github.io/learnmore/2016/07/29/problem.html 踩过的坑及解决方案记录在此篇博文中! 个人理解,如有偏颇,欢 ...
- 第八篇:web之前端踩的一些坑
前端踩的一些坑 前端踩的一些坑 本节内容 事件代理 清除标签的所有事件 bootstrap的模态框自定义方法 ajax在django里面实现post提交 ajax提交数据嵌套 1.事件代理 之前写 ...
- 使用vue开发项目需要注意的问题和可能踩到的坑
最近,在公司给一些刚刚使用vue进行开发的同学做了一次分享, 其中包括一些vue开发中需要注意的点, 以及一些可能会踩到的坑.具体内容如下: 一.生命钩子使用需要注意的地方 1.beforeCreat ...
- react + antd 实现打印功能(踩了不少坑)
最近在有网页打印需求,尝试了一下react的打印功能,遇到了不少的坑: 1.react本身有一些打印的组件,但都不好用,都是基于window.print(),但是window.print()如果直接打 ...
- 使用pace监控ajax踩过的坑
使用vue.js开发移动端的活动页面时,有时候会出现因为请求的数据没有返回而使得当前活动页结构混乱或者不美观,这个时候可以考虑使用pace.js,通过设置参数值,在ajax全部请求结束之前显示load ...
- [坑况]——webpack搭建前端环境踩过的坑啊
前言 嘿哈,webpack搭建前端环境踩过的坑啊! 第一个:完全不知所措 webpack4 下面用不了HtmlWebpackPlugin 和 ExtractTextPlugin 解决方案: html- ...
- 小程序——微信小程序初学踩过的坑
微信小程序初学踩过的坑 一.前言 最近因为某些需要和个人兴趣打算开发一下微信小程序,经过在官方网站上的基本了解,我大体知道了微信小程序开发的大致过程,其实最本质的就是MVVM,借用了很多模式上 ...
随机推荐
- java中的Serializable接口的作用
实现java.io.Serializable 接口的类是可序列化的.没有实现此接口的类将不能使它们的任一状态被序列化或逆序列化. 序列化类的所有子类本身都是可序列化的.这个序列化接口没有任何方法和域, ...
- [官网]SQLSERVER ON linux 的最低要求 以及安装方法
快速入门:在 Red Hat 上安装 SQL Server 并创建数据库 总体说明: 适用于: SQL Server (仅限 Linux)Azure SQL 数据库Azure SQL 数据仓库并行数据 ...
- java 常量 因为常量不依赖对象 所以一般都会将常量设置为 类属性
- 【uoj#213】[UNR #1]争夺圣杯 单调栈+差分
题目描述 给出一个长度为 $n$ 的序列,对于 $1\sim n$ 的每一个数 $i$ ,求这个序列所有长度为 $i$ 的子区间的最大值之和,输出每一个 $i$ 的答案模 $998244353$ 后异 ...
- zabbix自定义web检测
zabbix自定义web检测 本博客使用zabbix 版本 4.0.3 Web监控的原理 Web监控即对HTTP服务的监控,模拟用户去访问网站,对特定的结果进行比较,如状态码.返回字符串等特定的数据进 ...
- MT【131】$a_{n+1}\cdot a_n=\dfrac 1n$
已知数列\(\{a_n\}\)满足\(a_1=1\),\(a_{n+1}\cdot a_n=\dfrac 1n\)(\(n\in\mathbb N^*\)). (1) 求证:\(\dfrac{a_{n ...
- 51nod 1766 树上的最远点对 | LCA ST表 线段树 树的直径
51nod 1766 树上的最远点对 | LCA ST表 线段树 树的直径 题面 n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间,表示点的标号请你求出两个区间内各选一点之间的最大距离,即 ...
- 洛谷 P1306 斐波那契公约数 解题报告
P1306 斐波那契公约数 题意:求\(Fibonacci\)数列第\(n\)项和第\(m\)项的最大公约数的最后8位. 数据范围:\(1<=n,m<=10^9\) 一些很有趣的性质 引理 ...
- 解题:POI 2008 Station
题面 水水的换根裸题,不过以前还真没做过换根的题 换根的思想就是在DFS中利用树的信息更新出当前点为根时的信息,具体来说一般是考虑子树外和子树内两部分 每个点的答案$ans$就是$ans[fa]+n- ...
- vmware中centos7设置静态IP
1.vmware—>Edit—>Virtual Network Editor,选中vmnet8-Nat设置,查看网关IP 2.在centos中设置: vi /etc/sysconfig/n ...