序——按钮提示
事件:用户操作
onmouseover
class在js里要写成className才能用!!!
选项卡
1.style加样式 行间;
2.style取样式 行间;
3.对于同一个元素:要么只动class要么只动style;
4.多个input要用函数统一写→提取行间事件
提取行间事件
匿名函数:没有函数名!
1.function 名字()
{
……
}
oBtn.οnclick=名字
2.oBtn.οnclick=function()
{
……
}
但是2有个问题 如果放在head里 程序加载不出来,因为onclick的部分找不到对应的id(程序自上到下运行,到了id那找不到 自动终端停止)
解决上面问题的方法: window.onload→页面加载完之后发生
外面套一个
window.οnlοad=function()
{
你的东西
}
行为 样式 结构三者分离!!
收件箱里一堆input(勾选框) 怎么解决:
getElementsByTagname(){}
数组概念引入
利用循环合并:
这样做又有个问题:邮箱邮件未知多少个,你不能写死多少个
直接写成i<aDiv.length
邮箱的全选 不选
\
this :当前发生事件的元素
通过js加index可以,但是行内html不可以加 会不兼容?
和面向对象有关??后面说
innerHTML:
flex布局方式 好好了解一下啊!!!!
js基础!!!
js组成
1.ECMAScript:翻译器、翻译; →核心
2.DOM Document Object Model HTML 操作HTML的能力;
3.BOM Browser Object Model 浏览器 window;
兼容性问题:
ECMA:几乎没有兼容问题;
DOM:有一些操作不兼容;
BOM:没有兼容问题(完全不兼容);
变量类型
alert(typeof a) -->
console.log(‘a’) -->
number、string、boolean、undefined、object、function;
一个变量最好只存一种数据类型;
字符串转数字
var a=‘12’
alert(parseInt(a)+1) -->13
alert(isNan(a)) ->true or false
隐式类型转换:
1.a=5,b=‘5’;
ab -->true 先转换类型,然后比较;
a=b -->false 不转换类型,直接比;
2.a+b; ‘12‘+’5‘=’125‘
a-b; ‘12‘-’5‘=7 number
3.parseInt parseFloat
局部变量(在函数里面定义的变量;)
<script>
function aaa()
{
var a=12;
}
function bbb()
{
alert(a);
}
</script>
闭包
<script>
function aaa()
{
var a=12;
function bbb()
{
alert(a);
}
}
</script>
这时候弹出的a在函数bbb里未定义,但是bbb在大的aaa函数里,所以还是可以正常弹出,这就叫闭包;
aaa:父函数
bbb:子函数
闭包:子函数可以使用父函数的局部变量 ;
以前也用过→
闭包的应用:回头再说
给变量取名字
匈牙利命名法:
1.类型前缀:
数组:a
布尔值:b
浮点数:f
函数:fn
整数:i
对象:o
正则表达式:re
字符串:s
变体变量:v
2.首字母大写
常用运算符
12%5 2 求余数 用于 隔行变色、秒转时间
parseInt转int型
i=i+1 ===== i+=1
i*=1 ------- i=i*1
!= 不等于 改变类型之后判断
!== 也是不等于 和===一样 就是说做判断时不改变类型
&& 与,并且
|| 或者 或
! 否 非
条件语句
if----------------------------------------------------------------------------------
if(条件1)
{
语句1
}
else if (条件)
{
语句2
}
else
{
语句n
}
swich-----------------------------------------------------------------------------
swich(变量)
{
case 值1:
语句1
break;
case值2:
语句1
break;
………
default: (默认值)
语句n
}
三目运算符 ?:
条件?语句1:语句2
循环语句
跳出: break continue
break:中断 中断整个循环程序 跳出来
continue:继续 中断这一次的循环
什么是真,什么是假:
真:true 非0的数字 非空字符串(’ ‘这种算非空) 非空对象
假:false 数字0 空字符串’‘ 空对象null undefined
Json
就是字典形式!
var json={a:12,b:5,c:'acx',};
json.b++;
alert(json.b);
json和数组的区别:
1…json索引可以写成json[‘a’],索引下标为字符串;数组用数字索引;
2…json没有length,数组有;
3…怎么循环json呢(没有lenth):
数组循环:
var arr1=[1,5,9,8,7,1,'+65'];
for(var i=0;i<arr1.length;i++)
{
alert('第'+i+'个东西:'+arr1[i]);
}
或者
for(var i in arr1)
{
alert('第'+i+'个东西是'+arr1[i]);
}
jason只能用for in 遍历
var json={a:12,b:5,c:'acx',};
for(var i in json)
{
alert('第'+i+'个东西是'+json[i]);
}
建议:数组都用以前的for length;json都用for in;
函数返回值
简单例子:就是把12返回给show()这个函数
<script>
function show()
{
return 12;
}
alert(show());
</script>
函数传参
arguments可变参/不定参 →数组
<script>
window.onload=function()
{
function sum()
{
var result=0;
for(var i=0;i<arguments.length;i++)
{
result+=arguments[i];
}
return result;
};
alert(sum(12,5,9,6,7,25,6,6,8,2,3,6,9));
}
</script>
是个数组 存了所有的参数!!
css函数 用来获取/设置样式的
css(oDiv, ‘width’) 获取样式;
css(oDiv, ‘width’, ‘200px’) 设置样式、
注意上面的css是一个函数 !!!!
<script>
function css()
{
if(arguments.length==2)
{
return arguments[0].style[arguments[1]]; //两个就是获取样式
}
else
{
arguments[0].style[arguments[1]]=arguments[2]; //三个是设置样式
}
}
window.onload=function()
{
var oDiv=document.getElementById('div1');
alert(css(oDiv,'width')); //获取oDiv的width样式
css(oDiv,'background','green'); //设置更改红变绿
}
</script>
<body>
<div id="div1" style="width:200px;height: 200px;background:red"></div>
</body>
现在有个问题,这里面1,2,3好乱 改名字!
<script>
function css(obj,name,value)
{
if(arguments.length==2)
{
return obj.style[name]; //两个就是获取样式
}
else
{
obj.style[name]=value; //三个是设置样式
}
}
window.onload=function()
{
var oDiv=document.getElementById('div1');
alert(css(oDiv,'width')); //获取oDiv的width样式
css(oDiv,'background','green'); //设置更改红变绿
}
</script>
</head>
<body>
<div id="div1" style="width:200px;height: 200px;background:red"></div>
</body>
改成 obj name value来代替
注意!!!这个style只能操作行间样式 不能操作style表里的
解决办法:currentStyle来替代style 但是不兼容问题存在 只兼容IE
Chrome FF 怎么做:getComputesStyle(oDiv,null) (第二个参数没用 随便定) 意思是得到oDiv的style →IE9不支持这个!!!
所以:
currentStyle在FF中是undefined,在IE是object →用真假if语句
<style>
#div1 {
width:200px;
height: 200px;
background:red;
}
</style>
<script>
window.onload=function()
{
var oDiv=document.getElementById('div1');
if (oDiv.currentStyle) //不用写=true因为本身如果是object自动为真
{
//走IE
alert(oDiv.currentStyle.width);
}
else
{
//走FF
alert(getComputedStyle(oDiv,false).width);
console.log('测试测试');
};
}
</script>
99%的兼容问题都用这种办法处理
把这种常用功能封装 便捷使用。
<script>
function getStyle(obj,name)
{
if(obj.currentStyle)
{
return obj.currentStyle[name];
}
else
{
return getComputedStyle(obj,false)[name];
}
};
window.onload=function()
{
var oDiv=document.getElementById('div1');
alert(getStyle(oDiv,'width'));
}
</script>
封装的思想,建立一个函数 拿过来用;
复合样式:background、border;
单一样式:width,height;
数组基础
定义
- var a=[1,2,3,4,5,6]样 一般用这个
- var arr=new Array(12,5,8,9)
length的小功能:
可以获取也可以设置 如果a.length=3 则alert(arr)=1,2,3;
例子:可以快速清空数组的值a.length=0;
s数组的添加
<script>
var arr=[1,2,3];
arr.push(4); //输出1,2,3,4 尾部添加
arr.pop(); //输出1,2 尾部删除
arr.shift(); //输出2,3 删除头部
arr.unshift(5); //输出5,1,2,3 头部加东西
arr.splice(1,1); // 输出1,3 从第二个开始删,删除1个| 删除元素的用法splice(起点,长度)
arr.splice(1,0,'a','b','c'); // 输出1,2,'a','b','c',3|插入用法splice(起点,长度,元素……)
arr.splice(1,2,'a','b'); //输出1,'a','b'|替换操作
</script>
两数组连接
<script>
var a=[1,2,3];
var b=[4,5,6];
a.concat(b); //输出1,2,3,4,5,6
b.concat(a); //输出4,5,6,1,2,3
</script>
<script>
var a=[1,2,3,4];
a.join('-'); //输出1-2-3-4
</script>
数组排序
<script>
var a = [1, 'zoom', 'float', 2, 3, 'alpha', 4];
a.sort();
alert(a); //输出 1,2,3,4,alpha,float,zoom
//但是实际会排序金额等,例如淘宝钱数排序等
var b = [112, 95814, 3547, 25, 10, 20, 29];
b.sort();
alert(b); //输出10,112,20,25,29,3547,95814
//可以看到,不是按照顺序排列的!!!
//他是把数字作为字符串来排序的,先第1位,然后第2位比较这样;
//原因:数组的sort只认识字符串
//解决办法:
b.sort(function (n1, n2) {
if (n1 < n2) {
return -1; //只要是负数就够了
}
else if (n1 > n2) {
return 1;
}
else {
return 0;
}
}
);
alert(b); //现在输出10,20,25,29,112,3547,95814
//所以上述if函数有个简化写法
var c = [112, 95814, 3547, 25, 10, 20, 29];
c.sort(function (n1, n2) {
return n1-n2; //也是在输出负数/整数/0,同样效果
}
);
alert(c); //现在输出10,20,25,29,112,3547,95814
</script>
定时器
什么是定时器
<script>
function show()
{
alert('a');
};
setInterval(show,1000); //每隔100毫秒弹出来一次
setTimeout(show,1000); //只执行一次!
</script>
如何停止一个定时器
<script>
window.onload=function()
{
var oBtn1=document.getElementById('btn1');
var oBtn2=document.getElementById('btn2');
var timer;
console.log('测试');
oBtn1.onclick=function()
{
timer=setInterval(function(){
alert('a');
},3000);
};
oBtn2.onclick=function()
{
clearInterval(timer);
};
};
</script>
</head>
<body>
<input id="btn1" type="button" value="开启"/>
<input id="btn2" type="button" value="关闭"/>
</body>
数码时钟
要点:
1.用图片控制时间,先用js调用图片,for语句来更改图片的路径;
把能修改的字符串和图片关联,用索引调用,字符串是几就能调出来第几张图片
for(var i=0;i<aImg.length;i++){
aImg[i].src='img/'+str[i]+'.png';
}; //1.修改图片路径的方法!!!接下来就要控制修改字符串
2.调用时间函数来控制字符串;
有几个问题:时间函数出来的都是数字,且个位数前面没有0,要用一套if语句把数字都变成双位且都是字符串(输出的时候用+号方便)
function toDou(n){ //让时间数字中6转为06且都转为字符串!
if (n<10){
return '0'+n ;
}
else{
return ''+n;
} //加空字符串保证返回字符串;
}
var oDate=new Date(); //new用来创建一个对象 后面具体讲
var aImg=document.getElementsByTagName('img');
// var str='015365';
var str=toDou(oDate.getHours())+toDou(oDate.getMinutes())+toDou(oDate.getSeconds());
for(var i=0;i<aImg.length;i++){
aImg[i].src='img/'+str[i]+'.png';
}; //1.修改图片路径的方法!!!接下来就要控制修改字符串
最后要用到定时器来调整刷新,每秒刷新一次
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>获取日期</title>
<style>
body{
background: #000;
color:white;
font-size:100px;
};
</style>
<script>//思路:用js来修改图片的路径控制数字变化;调用时间函数控制这个变化;然后让他动起来!
function toDou(n){ //让时间数字中6转为06且都转为字符串!
if (n<10){
return '0'+n ;
}
else{
return ''+n;
} //加空字符串保证返回字符串;
}
window.onload=function(){
tick=function(){ //注意把该放进去的东西都放进去,每次更新都要调用的东西
var oDate=new Date(); //new用来创建一个对象 后面具体讲
var aImg=document.getElementsByTagName('img');
// var str='015365';
var str=toDou(oDate.getHours())+toDou(oDate.getMinutes())+toDou(oDate.getSeconds());
for(var i=0;i<aImg.length;i++){
aImg[i].src='img/'+str.charAt(i)+'.png'; //因为str[0]不兼容,换成这个可以,调取字符串的某一位
}; //1.修改图片路径的方法!!!接下来就要控制修改字符串
}
setInterval(tick,1000);
tick(); //执行一次tick函数,这样不会出现延迟
}
</script>
</head>
<body>
<img src="img/0.png"/>
<img src="img/0.png"/>
:
<img src="img/0.png"/>
<img src="img/0.png"/>
:
<img src="img/0.png"/>
<img src="img/0.png"/>
</body>
</html>
还有问题:
本质问题:alert(str[0])这句话在低版本不兼容!
解决办法:
总结一下:
1.Date对象:var oDate=new Date
2.getHours();
3.字符串连接;
4.空位补零;
5.str兼容性问题 str.charAt(i)通用
年月日的问题:
1.getFullYear()
2.getMonth()+1
3.getDate()
4.星期:getDay()
0 周日
1 周一
2 ……
3
4
5
6 周六
延时提示框
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>延时功能</title>
<!-- 功能:鼠标移入div1出现div2,且移入div2不会消失 -->
<style>
#div1{
float:left;
margin-right:20px;
width:50px;
height: 50px;
background:red;
}
#div2{
float:left;
display:none;
width:100px;
height: 100px;
background:gray;
}
</style>
<script>
window.onload=function(){
var oDiv1=document.getElementById('div1');
var oDiv2=document.getElementById('div2');
var timer=null;
oDiv1.onmouseover=function(){
clearTimeout(timer); //加这个避免让红灰之间移动时灰框闪来闪去
oDiv2.style.display='block';
};
oDiv1.onmouseout=function(){
timer=setTimeout(function(){
oDiv2.style.display='none';
},500);
};
oDiv2.onmouseover=function(){
clearTimeout(timer);
};
oDiv2.onmouseout=function(){
timer=setTimeout(function(){
oDiv2.style.display='none';
},500);
}
}
</script>
</head>
<body>
<div id="div1"></div>
<div id="div2"></div>
</body>
</html>
但是上述有很多需要合并的地方,太复杂:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>延时功能</title>
<!-- 功能:鼠标移入div1出现div2,且移入div2不会消失 -->
<style>
#div1{
float:left;
margin-right:20px;
width:50px;
height: 50px;
background:red;
}
#div2{
float:left;
display:none;
width:100px;
height: 100px;
background:gray;
}
</style>
<script>
window.onload=function(){
var oDiv1=document.getElementById('div1');
var oDiv2=document.getElementById('div2');
var timer=null;
oDiv2.onmouseover=oDiv1.onmouseover=function(){
clearTimeout(timer); //加这个避免让红灰之间移动时灰框闪来闪去
oDiv2.style.display='block';
};
oDiv2.onmouseout=oDiv1.onmouseout=function(){ //可以合并!
timer=setTimeout(function(){
oDiv2.style.display='none';
},500);
};
}
</script>
</head>
<body>
<div id="div1"></div>
<div id="div2"></div>
</body>
</html>
无缝滚动
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#div1{
width:200px;
height: 100px;
background: red;
position: absolute;
left:200px;
top:300px;
margin:50px;
}
</style>
</head>
<body>
<div id="div1" onclick="alert(this.offsetLeft)"></div> <!--输出250,是div1距离左边的距离,会加上margin,很方便-->
</body>
</html>
<!-- 获取:offsetLeft/offsetTop
offsetWidth/offsetHeight -->
获取:offsetLeft/offsetTop offsetWidth/offsetHeight
无缝滚动思路:用定时器,每隔一段时间把div1的left改大一点
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
*{
margin:0;
padding:0;
}
#div1{
width:480px;
height:230px;
margin:100px auto;
position:relative; /*因为用大的ul来移动,小图片位置绝对*/
background:red;
}
#div1 ul{
position:absolute;
}
#div1 ul li{
float:left;
width:120px;
height:108px;
list-style:none;
}
</style>
<script>
window.onload=function(){
var oDiv=document.getElementById('div1');
var oUl=oDiv.getElementsByTagName('ul')[0];
setInterval(function(){
oUl.style.left=oUl.offsetLeft-2+'px';
},30);
}
</script>
</head>
<body>
<div id="div1">
<ul>
<li><img src="1.png"></li>
<li><img src="2.png"></li>
<li><img src="3.png"></li>
<li><img src="4.png"></li>
</ul>
</div>
</body>
</html>
现在可以移动,但是存在问题,移过去之后 后面的补不上来了。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>无缝滚动</title>
<style>
*{
margin:0;
padding:0;
}
#div1{
width:480px;
height:230px;
margin:100px auto;
position:relative; /*因为用大的ul来移动,小图片位置绝对*/
overflow:hidden; /*设置了8个,所以要多的隐藏掉*/
}
#div1 ul{
position:absolute;
}
#div1 ul li{
float:left;
width:120px;
height:108px;
list-style:none;
}
</style>
<script>
window.onload=function(){
var oDiv=document.getElementById('div1');
var oUl=oDiv.getElementsByTagName('ul')[0];
var aLi=oUl.getElementsByTagName('li');
oUl.innerHTML=oUl.innerHTML+oUl.innerHTML; //oUl的内容多了一份
oUl.style.width=aLi[0].offsetWidth*aLi.length+'px'; //把oUl的宽度撑开,让li都在一行
setInterval(function(){
if(oUl.offsetLeft<-oUl.offsetWidth/2){ //left值为负,要注意!!!!
oUl.style.left='0';
};
oUl.style.left=oUl.offsetLeft-2+'px';
},30);
}
</script>
</head>
<body>
<div id="div1">
<ul>
<li><img src="1.png"></li>
<li><img src="2.png"></li>
<li><img src="3.png"></li>
<li><img src="4.png"></li>
</ul>
</div>
</body>
</html>
加上了左右滚动:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>无缝滚动</title>
<style>
*{
margin:0;
padding:0;
}
#div1{
width:480px;
height:230px;
margin:100px auto;
position:relative; /*因为用大的ul来移动,小图片位置绝对*/
overflow:hidden; /*设置了8个,所以要多的隐藏掉*/
}
#div1 ul{
position:absolute;
}
#div1 ul li{
float:left;
width:120px;
height:108px;
list-style:none;
}
</style>
<script>
window.onload=function(){
var oDiv=document.getElementById('div1');
var oUl=oDiv.getElementsByTagName('ul')[0];
var aLi=oUl.getElementsByTagName('li');
var speed=2;
// 可以写成oUl.innerHTML+=oUl.innerHTML;
oUl.innerHTML=oUl.innerHTML+oUl.innerHTML; //oUl的内容多了一份
oUl.style.width=aLi[0].offsetWidth*aLi.length+'px'; //把oUl的宽度撑开,让li都在一行
var move=function(){
if(oUl.offsetLeft<-oUl.offsetWidth/2){ //left值为负,要注意!!!!
oUl.style.left='0';
};
oUl.style.left=oUl.offsetLeft+speed+'px';
}
var timer=setInterval(move,30);
oDiv.onmouseover=function(){
clearInterval(timer);
};
oDiv.onmouseout=function(){
timer=setInterval(move,30);
}
var oA=document.getElementsByTagName('a');
oA[0].onclick=function(){
speed=-2;
};
oA[1].onclick=function(){
speed=2;
};
}
</script>
</head>
<body>
<a href="javascript:;">向左走</a>
<a href="javascript:;">向右走</a>
<div id="div1">
<ul>
<li><img src="1.png"></li>
<li><img src="2.png"></li>
<li><img src="3.png"></li>
<li><img src="4.png"></li>
</ul>
</div>
</body>
</html>
总结:
setInterval 间隔型; clearInterval
setTimeout 延时型 只执行一次!cleaTimeout
charAt方法来找数组里的数、
DOM
DOM基础—document
DOM节点
标签 CSS
元素 JS
节点 DOM
<script>
window.onload=function(){
var oUl=document.getElementById('ul1');
alert(oUl.childNodes.length); //childNodes。length表示子节点的长度
}; //输出5!!!注意,把空节点也算上了
</script>
</head>
<body>
<ul id="ul1"> //这里算空节点
<li></li>
<li></li>
</ul>
sdfsdflk //这个是文本节点
<span></span> //这个是元素节点
</body>
childNotes
怎么解决呢??
<script>
window.onload=function(){
var oUl=document.getElementById('ul1');
for(var i=0;i<oUl.childNodes.length;i++){
//nodeType==3 -> 文本节点
//nodeType==1 -> 元素节点
alert(oUl.childNodes[i].nodeType);
}
};
</script>
</head>
<body>
<ul id="ul1">
<li></li>
<li></li>
</ul>
sdfsdflk
<span></span>
</body>
用nodeType来判断,3是文本节点,1是元素节点
if (oUl.childNodes[i].nodeType==1){
oUl.childNodes[i].style.background='red';
}
适用所有的浏览器的操作
有个更好用的东西:children
var oUl=document.getElementById('ul1');
alert(oUl.children.length);
for(var i=0;i<oUl.children.length;i++){
oUl.children[i].style.background='red';
}
children选出所有的元素节点
注意:子节点只算第一层的!!!!!!
如果li里面有个span 不算子节点!!!哈哈哈
父节点
oUl.parentNode 检查父节点
应用:隐藏→调用到父节点,整体隐藏
<script>
window.onload=function(){
var aA=document.getElementsByTagName('a');
for(var i=0;i<aA.length;i++){
aA[i].onclick=function(){
this.parentNode.style.display='none';
};
};
}
</script>
</head>
<body>
<ul id="ul1">
<li>sfasfsdf <a href="javascript:;">隐藏</a></li>
<li>sfa撒旦发射点发射点f <a href="javascript:;">隐藏</a></li>
<li>sfasf水电费33sdf <a href="javascript:;">隐藏</a></li>
<li>fs1231232df <a href="javascript:;">隐藏</a></li>
</ul>
offsetParent ?
css
绝对定位,根据谁定位?
根据有定位的父级的位置进行定位,如果父亲没定位,继续一级一级往上找到body为止
相对定位绝对定位?????好好看看!!!
<style>
#div1{
width: 200px;
height: 200px;
background:gray;
margin:100px;
}
#div2{
width:100px;
height: 100px;
background: red;
position:absolute;
left:50px;
top: 50px; /*父亲没有定位,所以灰盒子移动红盒子不和他一起动*/
}
</style>
<body>
<div id="div1">
<div id="div2"></div>
</div>
</body>
<style>
#div1{
width: 200px;
height: 200px;
background:gray;
margin:100px;
position: relative;
}
#div2{
width:100px;
height: 100px;
background: red;
position:absolute;
left:50px;
top: 50px; /*父亲没有定位,所以灰盒子移动红盒子不和他一起动*/
}
</style>
<script>
window.onload=function(){
var oDiv1=document.getElementById('div1');
var oDiv2=document.getElementById('div2');
//把div2中能获取定位的父级style改变
oDiv2.offsetParent.style.background='black';
}
</script>
<body>
<div id="div1">
<div id="div2"></div>
</div>
获取的是有关定位的父级元素
如果div1不给定位的话:
将变成这样:
颜色加在了body上
其他的
firstChild 首个子节点 低版本用不出问题,空节点不算
lastChild 最后一个
firstElementChild首个元素子节点 用于高版本浏览器,反而低版本不兼容!!!! 下同
lastElementChild
兄弟节点:
有兼容性问题
nextSibing下一个兄弟节点
nextElementSibling
previousSibing
previousElementChild
所以要用if来解决这个兼容问题f
DOM操作元素属性
<script>
window.onload=function(){
var oTxt=document.getElementById('txt');
var oBtn=document.getElementById('btn');
oBtn.onclick=function(){
// oTxt.value='sdfsdfsdfd';
// oTxt['value']='sdfsdfn';
oTxt.setAttribute('value','s;ldijfsd');
};
}
</script>
</head>
<body>
<input id="txt" type="text"/>
<input id="btn" type="button" value="提交"/>
</body>
dom用oTxt.setAttribute(属性名name,想要的value)来操作
获取getAttribute (名称,值)
移除removeAttribute (名称)
className的用处
选定具体的class来进行修饰
<script>
window.onload=function(){
var oUl1=document.getElementById('ul1');
var aLi=oUl1.getElementsByTagName('li');
for(var i=0;i<aLi.length;i++){
if (aLi[i].className=='box'){
aLi[i].style.background='red';
}
}
}
</script>
</head>
<body>
<ul id="ul1">
<li></li>
<li class="box"></li>
<li></li>
<li></li>
<li class="box"></li>
<li></li>
<li></li>
<li class="box"></li>
<li class="box"></li>
<li></li>
</ul>
</body>
但是这样过于麻烦
封装 成函数把
function getByClass(oParent,sClass){
var aEle=oParent.getElementsByTagName('*');
var aResult=[];
for(var i=0;i<aEle.length;i++){
if(aEle[i].className==sClass){
aResult.push(aEle[i]);
}
}
return aResult;
}
调用这个函数就很轻松了
window.onload=function(){
var oUl=document.getElementById('ul1');
var aBox=getByClass(oUl,'box');
for(var i=0;i<aBox.length;i++){
aBox[i].style.background='red';
}
DOM操作应用
创建DOM appendChild
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
window.onload=function(){
oBtn=document.getElementById('btn');
oUl=document.getElementById('ul1');
oTxt=document.getElementById('txt');
oBtn.onclick=function(){
var oLi=document.createElement('li');
oUl.appendChild(oLi);
oLi.innerHTML=oTxt.value;
}
}
</script>
</head>
<body>
<input id="txt" type="text"/>
<input id="btn" type="button" value="创建"/>
<ul id="ul1"> </ul>
</body>
</html>
但是 存在问题,一般微博新写的东西都在顶端
插入元素 insertBefore
父级.insertBefore(子节点,在谁之前)
<script>
window.onload=function(){
oBtn=document.getElementById('btn');
oUl=document.getElementById('ul1');
oTxt=document.getElementById('txt');
oBtn.onclick=function(){
var oLi=document.createElement('li');
var aLi=oUl.getElementsByTagName('li');
oLi.innerHTML=oTxt.value;
if(aLi.length>0){
oUl.insertBefore(oLi,aLi[0]);
};
else{
oUl.appendChild(oLi);
};
};
}
</script>
</head>
<body>
<input id="txt" type="text"/>
<input id="btn" type="button" value="创建"/>
<ul id="ul1"> </ul>
</body>
这里为了保持兼容,应用了if:
如果没有li就正常添加第一个;如果有li就插在第一个位置;
删除DOM
父级.removeChild(子集)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
window.onload=function(){
var oUl=document.getElementById('ul1');
var aLi=oUl.getElementsByTagName('li');
var aA=oUl.getElementsByTagName('a');
for(var i=0;i<aA.length;i++){
aA[i].onclick=function(){
oUl.removeChild(this.parentNode);
}
}
}
</script>
</head>
<body>
<ul id="ul1">
<li>sdfsdf<a href="javascript:;">删除</a></li>
<li>sdfwe'r'we'rwerwersdf<a href="javascript:;">删除</a></li>
<li>sdse'r'feserfef<a href="javascript:;">删除</a></li>
<li>sdf121sdf<a href="javascript:;">删除</a></li>
</ul>
</body>
</html>
文档碎片 这东西应该不怎么用了,可能会问到
文档碎片可以提高DOM操作性能(理论上):
就相当于,我加li时先添加到文档碎片中,等所有操作都做完了再由文档碎片加入到整个文件中,只需要渲染一次,快!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>w nt</title>
<script>
window.onload=function(){
var oUl=document.getElementById('ul1');
var oFrag=document.createDocumentFragment();
for(var i=0;i<100000;i++){
var oLi=document.createElement('li');
oFrag.appendChild(oLi)
// oUl.appendChild(oLi); 之前直接存,现在先存一个包里
};
oUl.appendChild(oFrag);
}
</script>
</head>
<body>
<ul id="ul1"></ul>
</body>
</html>
DOM高级应用
表格应用
隔行变色问题:
<script>
window.onload=function(){
var oldColor='';//为了存储表格原本的颜色,防止鼠标移入移出变色把原来的颜色覆盖!
var oTab=document.getElementById('tab1');
// alert(oTab.tBodies[0].rows[1].cells[1].innerHTML);
//只有table有的简易操作,第一个tBody(tBody)可以有很多个,rows行,cell这一行的所有单元格
for(var i=0;i<oTab.tBodies[0].rows.length;i++){
oTab.tBodies[0].rows[i].onmouseover=function(){
oldColor=this.style.background;
this.style.background='green';
};
oTab.tBodies[0].rows[i].onmouseout=function(){
this.style.background=oldColor;
};
if (i%2)
{
oTab.tBodies[0].rows[i].style.background='gray';
}
}
}
表格的增删改查:
增加:document.createElement
删除:removeChild 注意选择父级
查找:模糊查找用toLowerCase()全转为小写
search()搜查并返回出来值
关键词查找:split()
筛选:搜索之后只弹出筛选过的:用到匹配后display='block’就可以
注意:appendChild属性:
//注意:appendChild有两个效果:1.先把元素从原有父级上删掉;
//2.添加到新的父级元素上!!!!所以不需要加removeChild()
关于数组排序:
数组里的东西默认都是字符串,如果你要
alert(arr1);
会弹出这个
必须要加alert(arr1.innerHTML);
列表、表格排序思路:
列表实际上不是数组不能直接用sort
所以直接把列表转成数组,但是要注意,不能直接转列表的值,列表本身每个li可以作为数组的每个object且通过索引找到,然后通过数组转成值来排序,最后再赋给列表;