1 javascript组成
三部分:
ECMAScript:是核心,规定了语法
浏览器对象模型:Browser Object Model,简称BOM
文档对象模型:Document Object Model,简称DOM
Bom的window对象的具体内容,请看下图(存为大图查看)
2 Dom操作
2.1
通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素。
当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。
HTML DOM 模型被构造为对象的树:
2.2 查找 HTML 元素
2.2.1 通过 id 查找 HTML 元素
var x=document.getElementById("intro");
如果找到该元素,则该方法将以对象(在 x 中)的形式返回该元素。
2.2.2通过标签名查找 HTML 元素
var y=x.getElementsByTagName("p");
2.2.3通过类名找到 HTML 元素
var x=document.getElementsByClassName("intro");
2.2.4通过name属性值找到 HTML 元素
document.getElementsByName()
2.3
以上方式,只有通过id的方式,返回的是一个元素对象,
其他三种方式,返回的都是数组,数组元素才是元素对象。
所以,元素对象的可以这样表示:
var texts=document.getElementsByClassName('u-text')[0];
示例:找到div下面的p
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>标题</title> </head> <body> <div id="box"> <p>找到这里</p> </div> <script> var box=document.getElementById('box').getElementsByTagName('p')[0]; console.log(box); </script> </body> </html>
console结果:<p>找到这里</p>
2.4通过节点的方式找到html元素(不常用)
http://www.runoob.com/dom/dom-node.html
https://blog.csdn.net/qq_39198420/article/details/78020557
以下操作内容、样式、事件、属性等都是针对具体的元素对象:
2.5 改变 HTML 元素的内容
2.5.1
非表单元素:使用 innerHTML 属性
例:var con=div.innerHTML; //获取内容
con=123; //修改内容
2.5.2 表单元素:value是表单元素的内容
2.6 改变 HTML 元素的属性
(1)div.getAttribute('id'); //获取属性
div.setAttribute('class','red'); //设置属性
div.removeAttribute(); //移除属性
(2)可以直接用“点”的方式,但是只能获取到元素官方规定的属性,例如 img.src,自定义的属性无法获取到
2.7 改变 HTML 样式
语法:document.getElementById(id).style.property=新样式
1)只能获取/设置 行内样式
2)类似background-color这样中间带线的属性,用style操作时,要改成驼峰式命名,把第二个单词改成大写。
3 事件
事件就是动作
HTML 事件的例子:
当用户点击鼠标时
当网页已加载时
当图像已加载时
当鼠标移动到元素上时
当输入字段被改变时
当提交 HTML 表单时
当用户触发按键时
3.1 事件属性
如需向 HTML 元素分配 事件,可以使用事件属性。直接在标签里添加事件属性:
<button onclick="displayDate()">点这里</button>
3.2 使用 HTML DOM 来分配事件
在js中用匿名函数的方式:
document.getElementById("myBtn").onclick=function(){displayDate()};
3.3常用事件:
onclick 事件:点击
onchange 事件:会在域的内容改变时发生
onmouseover 和 onmouseout 事件:鼠标移入移出
onmousedown、onmouseup 事件:鼠标按下和松开
3.4 addEventListener() 方法
3.4.1说明:
addEventListener() 方法用于向指定元素添加事件句柄。
addEventListener() 方法添加的事件句柄不会覆盖已存在的事件句柄。
可以向一个元素添加多个事件句柄。
可以向同个元素添加多个同类型的事件句柄,如:两个 "click" 事件。
可以向任何 DOM 对象添加事件监听,不仅仅是 HTML 元素。如: window 对象。
addEventListener() 方法可以更简单的控制事件(冒泡与捕获)。
当使用 addEventListener() 方法时, JavaScript 从 HTML 标记中分离开来,可读性更强, 在没有控制HTML标记时也可以添加事件监听。
可以使用 removeEventListener() 方法来移除事件的监听。
3.4.2语法
element.addEventListener(event, function, useCapture);
第一个参数是事件的类型 (如 "click" 或 "mousedown").
第二个参数是事件触发后调用的函数。
第三个参数是个布尔值用于描述事件是冒泡还是捕获。该参数是可选的。
3.5 事件流
事件传递有两种方式:冒泡与捕获。
事件传递定义了元素事件触发的顺序。 如果将 <p> 元素插入到 <div> 元素中,用户点击 <p> 元素,
在 冒泡 中,内部元素的事件会先被触发,然后再触发外部元素,即: <p> 元素的点击事件先触发,然后会触发 <div> 元素的点击事件。
在 捕获 中,外部元素的事件会先被触发,然后才会触发内部元素的事件,即: <div> 元素的点击事件先触发 ,然后再触发 <p> 元素的点击事件。
addEventListener() 方法可以指定 "useCapture" 参数来设置传递类型:
addEventListener(event, function, useCapture);
默认值为 false, 即冒泡传递,当值为 true 时, 事件使用捕获传递。
示例:事件流冒泡和获取的演示
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>事件流</title> <style> #box1{ 100px;height: 100px;background: #0168B7;margin: 30px auto 0;} #box2{ 200px;height: 200px;background:#20B2AA;margin: 30px auto 0;} #box3{ 300px;height: 300px;background:#286CC9;color: #fff;} </style> </head> <body> <div id="box3"> 内容3,调用函数3 <div id="box2"> 内容2,调用函数2 <div id="box1"> 内容1,调用函数1 </div> </div> </div> <script> var box1=document.getElementById('box1'); var box2=document.getElementById('box2'); var box3=document.getElementById('box3'); //事件冒泡 box1.addEventListener('click',f1); box2.addEventListener('click',f2); box3.addEventListener('click',f3); //事件捕获 //box1.addEventListener('click',f1,true); //box2.addEventListener('click',f2,true); //box3.addEventListener('click',f3,true); function f1(e){ console.log('调用函数1'); e.stopPropagation(); //停止事件的传播 } function f2(e){ console.log('调用函数2'); e.stopPropagation(); //停止事件的传播 } function f3(e){ console.log('调用函数3'); e.stopPropagation(); //停止事件的传播 } </script> </body> </html>
3.6 removeEventListener() 方法
removeEventListener() 方法移除由 addEventListener() 方法添加的事件句柄:
4 事件对象
每个事件(包括鼠标、键盘事件)触发执行的过程中,都有对应的事件对象,通过事件对象可以获得鼠标相对页面的坐标信息、通过事件对象也可以感知什么键子被 触发执行、通过事件对象还可以阻止事件流产生、阻止浏览器默认动作。
4.1 获得事件对象
node.onclick = function(evt){evt就是事件对象}
addEventListener(类型,function(evt){}/函数名字);
function 函数名称(evt){}
事件处理函数的第一个形参就是事件对象
4.2 事件对象作用
获得鼠标的坐标信息
event.clientX/clientY; //相对dom区域坐标
event.pageX/pageY; //相对dom区域坐标,给考虑滚动条位置
event.screenX/screenY; //相对屏幕坐标
阻止事件流:
event.stopPropagation(); //主流浏览器
冒泡型、捕捉型都可以进行阻止,为了浏览器兼容处理,只考虑冒泡型。
阻止浏览器默认动作
浏览器默认动作,注册form表单页面,提交表单的时候,浏览器的页面会根据action属性值进行跳转,这个动作称为“浏览器默认动作”。
event.preventDefault(); //主流浏览器
感知被触发键盘键子信息
event.keyCode 获得键盘对应的键值码信息
通过事件触发时候获得的keyCode数值码信息可以对应键盘的键子信息。
示例:键盘事件
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>键盘事件</title> </head> <body> <input type="text" id="tt"/> <script> var inputDom=document.getElementById('tt'); inputDom.onkeydown=function(e){ console.log(e.keyCode); if(e.keyCode==13){ alert(this.value); } } </script> </body> </html>
Dom操作综合练习:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>练习</title> <style> .box{ 100px;height: 100px;border: 1px solid green;margin-top: 20px;transition: 3s;} </style> </head> <body> <input type="text" class="u-text" value="现在value值是1"/> <input type="button" id="btn" value="点击改变value值" /> <input type="button" id="btn2" value="点击移除内容" /> <hr> <div class="box"> 这是一个div </div> <input type="button" value="点击改变" onclick="change()" name="btnBg"/> <script> var texts=document.getElementsByClassName('u-text')[0]; //通过className找到文本框 var btn=document.getElementById('btn'); //通过id找到按钮 var btn2=document.getElementById('btn2'); //通过id找到按钮 btn.onclick=function(){ texts.setAttribute('value','我要改成我的内容'); //改变value var con=texts.getAttribute('value'); //获取value console.log(con); } btn2.onclick=function(){ texts.removeAttribute('value'); //移除value } var box=document.getElementsByClassName('box')[0]; //通过class获取div var bgBtn=document.getElementsByName('btnBg')[0]; //通过name值获取按钮 function change(){ //改变 box.style.backgroundColor='red'; box.style.color='white'; box.innerHTML='改变了颜色'; box.style.width='200px'; } </script> </body> </html>