js与DOM的关系
- DOM对象:把div body p等节点树看成一个对象。
- html源码在内存里形成一个DOM对象(文档对象),
- 浏览器有渲染html代码功能;
-
浏览器内部有个一js的解释器/执行器/引擎,
-
我们在html里写一个js代码,js代码被引擎所执行,而执行结果就是对DOM的操作,
-
对DOM操作结果,就是我们常看到的特效,如图片漂浮,文字便是。
js
引入js
- 直接写在html页面中
<script>
code...
</script>
- 引入外部js文件
<script src='02.js'>
</script>
注意:此处scirpt标签内不能写js代码!
变量声明
用var声明,不用var会污染全局!
变量名由 $ 、数字、字母、_、组成,不能以数字开头。
变量类型
字符串、数字、布尔、数组、对象、Null、Undefined
数组:var cars=["Audi","BMW","Volvo"];
调用字段值有一种方法:
console.log(person[0])
对象:var person={firstname:"Bill", lastname:"Gates", id:5566};
调用字段值有两种方法:
console.log(cars[‘id’])
console.log(cars.id)
运算符
需要注意逻辑运算符:
var c=5||2;
document.write(c)//5
而php中,
$c=5||2;
var_dump($c);//bool(true)
控制结构
遍历:
- 遍历数组:
For of 遍历(需要ES6支持)
1. for(let value of arr){
2. console.log("第四种遍历方式\t"+value);
3. }
一般的方法:for(var i=0;i<10;i++){}
- 遍历对象:
For-in 遍历
for (var k in arr){
console.log(arr[index]);
console.log(index);
}
参考:js数组遍历和对象遍历
内置对象
JavaScript 中的所有事物都是对象:字符串、数字、数组、日期,等等。
在 JavaScript 中,对象是拥有 属性和方法的 数据。
常用属性和方法
String对象
- length属性:长度
- concat(string):连接2个或更多字符串
- indexOf(string) 查找字符串出现位置
注释: indexOf() 方法对大小写敏感!
注释: 如果要检索的字符串值没有出现,则该方法返回 -1。
可用str.indexOf(search)>-1
来检测是否存在字符串。 - substr(start[,length] )截取字符串
- toLowerCase() 转换成小写
- toUpperCase() 转换成大写
- replace(regexp/substr,replacement) 字符串替换
Date日期对象
- getFullYear() 返回4位年份
- getMonth()
- getDate()
- getDay() 返回星期数0-6
- getHours()
- getMinutes()
- getSeconds()
- getMilliseconds()
Math对象
- ceil(x) 向上取整
- floor(x) 向下取整
- min(x,…) 返回最小值
- max(x,…) 返回最大值
- pow(x,y) 返回x的y次方
- randow(x) 返回0-1之间的随机数 [0,1)
- round(x) 四舍五入
- sqrt(x) 开平方根
Array对象
- concat(arrayX,arrayX,…,arrayX) 连接两个或多个数组并返回新数组
- join(separator) 把数组中的所有元素放入一个字符串并返回
- pop() 删除并返回数组的最后一个元素
- push() 向数组的末尾添加一个或多个元素,并返回新的长度
- shift() 把数组的第一个元素从其中删除,并返回第一个元素的值
- unshift() 向数组的开头添加一个或更多元素,并返回新的长度
- sort(sortby) 对数组的元素进行排序,并返回排序后的array对象
若省略参数,是按照字符编码的顺序进行排序。
<script type="text/javascript">
function sortNumber(a,b)
{
return a - b
}
var arr = new Array(6)
arr[0] = "10"
arr[1] = "5"
arr[2] = "40"
arr[3] = "25"
arr[4] = "1000"
arr[5] = "1"
document.write(arr + "<br />")
document.write(arr.sort(sortNumber))
</script>
- reverse() 颠倒数组中元素的顺序,并返回重新排序后的array对象
- slice(start,end) 返回数组的一个片段
- splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目、
window对象
window对象是浏览器宿主对象,和js语言无关。
window对象方法
- close() 方法用于关闭浏览器窗口
<html>
<head>
<script type="text/javascript">
function closeWin()
{
myWindow.close()
}
</script>
</head>
<body>
<script type="text/javascript">
myWindow=window.open('','','width=200,height=100')
myWindow.document.write("This is 'myWindow'")
</script>
<input type="button" value="Close 'myWindow'"
onclick="closeWin()" />
</body>
</html>
- open() 方法用于打开一个新的浏览器窗口或查找一个已命名的窗口
window对象的子对象
navigator属性
- appCodeName 浏览器的代码名
- appName 浏览器的名称
- appVersion 浏览器的平台和版本信息
- platform 浏览器的操作系统类型
- userAgent 用户代理信息
- cookieEnabled 是否支持cookie
location(地址栏)属性
- host 主机名
- port 端口
- href 地址
- pathname 当前 URL 的路径部分
- protocol 协议
- search 查询的字符串
- assign(url) 页面跳转
history(历史记录)属性
- length 历史记录数目
- back()
- forward()
- go()
screen(屏幕对象)属性
- height 高度
- width 宽度
- availHeight 可用高度
- availWidth 可用宽度
- colorDepth 颜色
document(文档对象)属性
操作次对象可动态改变页面内容,是js的主战场。
找对象
- 通过id查询,返回值为对象:document.getElementById()
- 通过标签查询,返回值为对象集合:document.getElementsByTagName()
- 通过name查询(对于表单元素来说),返回值为对象集合:document.getElementsByName()
- 通过class查询,返回值为对象集合:document.getElementsByClassName();
- 通过子节点查询,返回集合:
children 非标准属性,但兼容性很好,只包含元素节点,不包含空白节点,childNodes:包含所有类型的节点
补充:在DOM中,每个部分都为节点, - 文档本身是文档节点
- 所有 HTML 元素是元素节点
- 所有 HTML 属性是属性节点
- HTML 元素内的文本是文本节点
- 注释是注释节点
- 空白是空白节点
修改对象
- CSS属性与DOM对象属性的对应关系:
obj.style.width
obj.style.background
注意 :如果css属性带有横线,如border-top-style,则把横线去除并横线后首字母大写:
obj.style.borderTopStyle
obj.style.marginLeft
- 标签属性与DOM对象属性的对应关系:
绝大部分二者相同,例如:
imgobj.src
属性对应<img src=''>
中的src属性。
也有例外,例如:
<div class='main'>
中,操作class属性用divobj.className
小练习:
点击div,其宽高分别增加10px,border-bottom-width增加1px
<div id="test2" onclick="bian()" style="width: 100px;height:100px;border-bottom-width:10px">
<script>
function bian() {
let div=document.getElementById('test2');
let w=parseInt(div.style.width);
let h=parseInt(div.style.height);
let b=parseInt(div.style.borderBottomWidth);
div.style.width=w+10+'px';
div.style.height=h+10+'px';
div.style.borderBottomWidth=b+1+'px'
div.style.background='purple'
}
</script>
注意:
- parseInt() 函数可解析一个字符串,并返回一个整数
- 上述例子中,obj.style只能获取到行内样式,获取不到外部样式,如果写在style标签里,点击div,无效。
补充:获取计算后的css样式:
window方法:getComputedStyle()
语法:
var style = window.getComputedStyle(element [,pseudoElt ]);
element:
要获取其计算风格的Element。
pseudoElt(可选的):
指定要匹配的伪元素的字符串。必须省略(或null)常规元素。
注意:此函数只能获取对象的样式,要改样式还得通过obj.style
上述例子改进如下:
<div id="test2" onclick="bian()" style="width: 100px;height:100px;border-bottom-width:10px">
function getStyle(obj,attr) {
return getComputedStyle(obj,null)[attr];
}
function bian() {
let div=document.getElementById('test2');
let w=parseInt(getStyle(div,'width'));
let h=parseInt(getStyle(div,'height'));
div.style.width=w+10+'px';
div.style.height=h+10+'px';
}
删除对象
步骤:
- 找到对象
- 找到他的父对象parentObj
- parentObj.removeChild(子对象)
<div id="test2" onclick="bian()" style="width: 100px;height:100px;">
<p>1</p>
<p>2</p>
<p>3</p>
</div>
<button onclick="shan()">qqq</button>
function shan() {
var parent=document.getElementById('test2');
var last=parent.children[parent.children.length-1];
parent.removeChild(last)
}
创建对象
步骤:
- 创建对象
- document.createElement()
- document.createTextNode()
- document.createAttribute()
- 找到父对象parentObj
- parentObj.appendChild(对象)
小例子:
<div id="test2" style="width: 100px;height:100px;"></div>
<button onclick="add()">增加</button>
<script>
function add() {
//创建元素节点。
var a = document.createElement('a');
//创建文本节点
var text = document.createTextNode('链接');
var parent = document.getElementById('test2');
//添加属性节点方法一
// a.setAttribute('href','http://baidu.com')
//添加属性节点方法二开始:
var attr = document.createAttribute('href');//创建属性节点
attr.value = 'http://baidu.com';
a.setAttributeNode(attr);
//添加属性节点方法二结束
a.appendChild(text);
parent.appendChild(a)
}
</script>
暴力操作对象
innerHTML 属性设置或返回表格行的开始和结束标签之间的 HTML
联动菜单
<select name="" id="prov" onchange="change()">
<option value="" disabled>请选择</option>
<option value="0">北京</option>
<option value="1">安徽</option>
</select>
<select name="" id="city"></select>
<script>
function change() {
var arr = [
['朝阳', '海淀', '门头沟'],
['淮南', '淮北', '合肥']
];
var sel = document.getElementById('prov');
var opt = '';
var len = arr[sel.value].length;
for (var i = 0; i < len ; i++) {
opt += "<option value=\"" + i + "\">" + arr[sel.value][i] + "</option>";
}
document.getElementById('city').innerHTML=opt;
}
</script>
定时器
属于window对象。
- setTimeout() 在指定的毫秒数后调用函数或计算表达式一次。
- setInterval() 按照指定的周期(以毫秒计)来调用函数或计算表达式。
小练习:定时炸弹
- 使用setInterval实现:
倒计时:
<input type="button" name="time" value="5">
<img src="a.jpg" alt="">
<script>
function miao() {
var div = document.getElementsByName('time')[0];
var time = div.value - 1;
div.value = time;
if (time < 1) {
var img = document.getElementsByTagName('img')[0];
img.src = 'b.jpg';
clearInterval(clock)
}
}
var clock = setInterval(miao, 1000)
</script>
- 使用setTimeout实现
zz这是燕十八老师给的方法:
倒计时:<input type="button" name="time" value="5">
<img src="a.jpg" alt="">
<script>
function out() {
var time = document.getElementsByName('time')[0].value - 1;
document.getElementsByName('time')[0].value = time;
if (time == 0) {
var img = document.getElementsByTagName('img')[0];
img.src = 'b.jpg';
clearTimeout(clock);
//这里clock变量在函数内,函数内未定义找不到就会到函数外找,这点与php有所不同。
} else {
setTimeout(out, 1000)
}
}
var clock = null;
clock = window.setTimeout(out, 1000);
</script>
常见事件
表单事件
- onfocus() 获得焦点时
- onblur() 失去焦点时
- onsubmit() 表单提交时
注意: οnsubmit=“return func()”;func()函数才能拦截提交效果。
鼠标事件
- onclick() 点击时
- onmouseover() 鼠标移到某元素之上
框架/对象(Frame/Object)事件
- onload() 在页面或图像加载完成后立即发生
事件委托
target事件属性应用实例:
五子棋小例子:
样式:
td{
width: 100px;
height: 100px;
background: #fff;
border: 1px solid wheat;
}
table{
border: 0;
border-collapse: collapse;
}
结构:
<table>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</table>
行为:
var i=0;
document.getElementsByTagName("table")[0].onclick=function (ev) {
ev.target.style.background=i++%2==0?'black':'pink'
}
这样写的好处是,不用在25个td上都绑定onclick,节省内存!
js使用正则
- test() 方法用于检测一个字符串是否匹配某个模式.如果字符串中有匹配的值返回 true ,否则返回 false。
- exec() 方法用于检索字符串中的正则表达式的匹配。如果字符串中有匹配的值返回该匹配值,否则返回 null。
匹配邮箱小实例:
<form action="12.html" id="form1">
姓名:<input type="text" name="name" id="name">
邮箱:<input type="text" name="mail" id="mail">
<input type="submit" value="提交">
</form>
<script>
document.getElementById('form1').onsubmit = function () {
var patt1 = /^[a-zA-Z0-9]{6,12}$/;
var patt2 = /^\w+@[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]+)*$/;
if (!patt1.test(document.getElementById('name').value)) {
alert('用户名错误');
return false;
}
if (!patt2.test(document.getElementById('mail').value)) {
alert('邮箱错误');
return false;
}
}
</script>