JavaScript 之 DOM选择器 及 事件
Dom Document object module 文档对象模型
DOM是一种用于HTML和XML文档的编程接口。它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式。我们最为关心的是,DOM把网页和脚本以及其他的编程语言联系了起来
DOM将html文件转换成文档对象,然后对文档对象进行操作 (找到标签及操作标签)
1、找到标签
获取单个元素 :document.getElementById('i1')
获取多个元素(列表):document.getElementsByTagName('div')
获取多个元素(列表): document.getElementsByClassName('c1')
a. 直接找
document.getElementById('i1') // 根据ID获取一个标签(html id 不能重复,因此获取的是单个元素)
document.getElementsByName('xxx') // 根据name属性获取标签集合(数组)
document.getElementsByClassName('c1') // 根据class属性获取标签集合(数组)
document.getElementsByTagName('div') // 根据标签名获取标签集合(数组)
b. 根据直接找的结果继续 间接找
parentElement // 父节点标签元素
children // 所有子标签
firstElementChild // 第一个子标签元素
lastElementChild // 最后一个子标签元素
nextElementtSibling // 下一个兄弟标签元素
previousElementSibling // 上一个兄弟标签元素
2、操作标签
文本操作
innerText 、innerHTML、value、selectedIndex
标签.innerText // 获取标签中的文本内容(若包含其他标签,则自动过滤,只获取文本)
标签.innerText = "" // 对标签内部文本进行重新赋值
> tags=document.getElementsByTagName('a');
> for(var i=0;i<tags.length;i++){tags[i].innerTaxt=123;}
标签.innerHTML // 获取标签中的所有内容包括所包含标签
obj.value // 获取当前标签中的值, 如<input>、<textarea>标签中输入的文本、<select value='xxx'>
obj.value=‘’ // 设置当前标签中的值
obj.selectedIndex // 获取select标签中值的索引
obj.selectedIndex= // 设置select标签中值的索引
checkbox对象.checked // 获取checkbox标签值
checkbox对象.checked = true // 设置checkbox标签值, 选中(打钩)
搜索框示例:

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Examples</title> </head> <body > <input type="text" placeholder="请输入关键字" > <!-- html最新浏览器才支持 --> <!-- 通过JS,可以实现输入关键字有智能提示,当用户输入字符时会悄悄往后台发请求,后台进行模糊匹配,把想要搜索的东西列举到输入框(position: relative;postion: absolute;)--> <input id="i1" onfocus="Focus();" onblur="Blur();" type="text" value="请输入关键字" /> <!-- onfocus 和 onbulr 属性监控鼠标或tab键 --> <script type="text/javascript"> function Focus(){ console.log('1') var tag= document.getElementById('i1'); var val= tag.value; if (val == "请输入关键字"){ tag.value = ""; } } function Blur(){ var tag= document.getElementById('i1'); var val= tag.value; if(val.length == 0){ tag.value = "请输入关键字"; } } </script> </body> </html>
样式操作
className、classList
obj.className='c1' // 定义或修改class=''的值
obj.classList // 获取class 列表
obj.classList.add('c2') // 添加指定样式
obj.classList.remove('样式名') // 删除指定样式
obj.style.xxx=''; // 设置某个样式属性
obj.style.frontSize='16px';
obj.style.backgroundColor='red';
示例:模态对话框
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.hide{
display: none;
}
.c1{
position: fixed;
left: 0;
top: 0;
right: 0;
bottom: 0;
background-color: black;
opacity: 0.6;
z-index: 9;
}
.c2{
width: 500px;
height: 400px;
background-color: white;
position: fixed;
left: 50%;
top: 50%;
margin-left: -250px;
margin-top: -200px;
z-index: 10;
}
</style>
</head>
<body style="margin: 0;">
<div>
<input type="button" value="添加" onclick="ShowModel();" />
<input type="button" value="全选" onclick="ChooseAll();" />
<input type="button" value="取消" onclick="CancleAll();" />
<input type="button" value="反选" onclick="ReverseAll();" />
<table>
<thead>
<tr>
<th>选择</th>
<th>主机名</th>
<th>端口</th>
</tr>
</thead>
<tbody id="tb">
<tr>
<td>
<input type="checkbox" />
</td>
<td>1.1.1.1</td>
<td>190</td>
</tr>
<tr>
<td><input type="checkbox"f id="test" /></td>
<td>1.1.1.2</td>
<td>192</td>
</tr>
<tr>
<td><input type="checkbox" /></td>
<td>1.1.1.3</td>
<td>193</td>
</tr>
</tbody>
</table>
</div>
<!-- 遮罩层开始 -->
<div id="i1" class="c1 hide"></div>
<!-- 遮罩层结束 -->
<!-- 弹出框开始 -->
<div id="i2" class="c2 hide">
<p><input type="text" /></p>
<p><input type="text" /></p>
<p>
<input type="button" value="取消" onclick="HideModel();"/>
<input type="button" value="确定"/>
</p>
</div>
<!-- 弹出框结束 -->
<script>
function ShowModel(){
document.getElementById('i1').classList.remove('hide');
document.getElementById('i2').classList.remove('hide');
}
function HideModel(){
document.getElementById('i1').classList.add('hide');
document.getElementById('i2').classList.add('hide');
}
function ChooseAll(){
var tbody = document.getElementById('tb');
// 获取所有的tr
var tr_list = tbody.children;
for(var i=0;i<tr_list.length;i++){
// 循环所有的tr,current_tr
var current_tr = tr_list[i];
var checkbox = current_tr.children[0].children[0];
checkbox.checked = true;
}
}
function CancleAll(){
var tbody = document.getElementById('tb');
// 获取所有的tr
var tr_list = tbody.children;
for(var i=0;i<tr_list.length;i++){
// 循环所有的tr,current_tr
var current_tr = tr_list[i];
var checkbox = current_tr.children[0].children[0];
checkbox.checked = false;
}
}
function ReverseAll(){
var tbody = document.getElementById('tb');
// 获取所有的tr
var tr_list = tbody.children;
for(var i=0;i<tr_list.length;i++){
// 循环所有的tr,current_tr
var current_tr = tr_list[i];
var checkbox = current_tr.children[0].children[0];
if(checkbox.checked){checkbox.checked = false;}else{checkbox.checked = true;}}}
</script>
</body>
</html>
示例:侧边栏菜单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.hide{
display: none;
}
.item .header{
height: 35px;
background-color: #2459a2;
color: white;
line-height: 35px;
}
</style>
</head>
<body>
<div style="height: 48px"></div>
<div style="width: 300px">
<div class="item">
<div id='i1' class="header" onclick="ChangeMenu('i1');">菜单1</div>
<div class="content">
<div>内容1</div>
<div>内容1</div>
<div>内容1</div>
</div>
</div>
<div class="item">
<div id='i2' class="header" onclick="ChangeMenu('i2');">菜单2</div>
<div class="content hide">
<div>内容2</div>
<div>内容2</div>
<div>内容2</div>
</div>
</div>
<div class="item">
<div id='i3' class="header" onclick="ChangeMenu('i3');">菜单3</div>
<div class="content hide">
<div>内容3</div>
<div>内容3</div>
<div>内容3</div>
</div>
</div>
<div class="item">
<div id='i4' class="header" onclick="ChangeMenu('i4');">菜单4</div>
<div class="content hide">
<div>内容4</div>
<div>内容4</div>
<div>内容4</div>
</div>
</div>
</div>
<script>
function ChangeMenu(nid){
var current_header = document.getElementById(nid);
var item_list = current_header.parentElement.parentElement.children;
for(var i=0;i<item_list.length;i++){
var current_item = item_list[i];
current_item.children[1].classList.add('hide');
}
current_header.nextElementSibling.classList.remove('hide');
}
</script>
</body>
</html>
属性操作
obj.attributes() // 获取属性的字典
> obj=document.getElementById('i1')
< <input id="i1" onfocus="Focus();" onblur="Blur();" type="text" value="请输入关键字">
> obj.attributes
< NamedNodeMap {0: id, 1: onfocus, 2: onblur, 3: type, 4: value, length: 5}
obj.setAttribute('key','value') //设置标签属性
> obj.setAttribute('key1','value1')
< undefined
> obj
< <input id="i1" onfocus="Focus();" onblur="Blur();" type="text" value="请输入关键字" key1="value1">
obj.removeAttribute('key) // 移除标签属性
> obj.removeAttribute('onblur')
< undefined
> obj
< <input id="i1" onfocus="Focus();" type="text" value="请输入关键字" key1="value1">
创建标签,并添加到HTML
a. 字符串形式 -- insertAdjacentHTML()
b. 对象的方式 -- createElement()、appendChild()
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Examples</title> </head> <body > <input type="button" onclick="AddEle1()" value="+"> <input type="button" onclick="AddEle2()" value="+"> <!-- beforeBegin --> <div id='i1'> <!-- afterBegin --> <p><input type="text" ></p> <!-- beforeEnd --> </div> <!-- afterEnd --> <script type="text/javascript"> function AddEle1(){ // 使用字符串创建标签 console.log('1') var tag = "<p> <input type='text' /> </p>" document.getElementById('i1').insertAdjacentHTML('beforeEnd',tag); // 参数为字符串 } function AddEle2(){ // 通过对象方式创建标签 var tag = document.createElement('input'); tag.setAttribute('type','text'); tag.style.frontSize='16px'; tag.style.color='red'; var p = document.createElement('p'); p.appendChild(tag); document.getElementById('i1').appendChild(p); // 参数为标签对象 } </script> </body> </html>
提交表单,任何标签通过DOM都可以提交表单
submit()
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Examples</title> </head> <body > <form id="f1" action="http://www.qq.com"> <input type="text" > <input type="submit" value="提交"> <a onclick="submitForm()"> 提交 </a> </form> <script type="text/javascript"> function submitForm() { document.getElementById('f1').submit() } </script> </body> </html>
其他操作:
console.log() // 输出
alert() // 弹出框
confirm() // 确认框
> alert(123)
> v = confirm('确定删除吗?')
< false // 点击取消返回值为 false,点击确定返回值为true

location.href // 获取当前url
location.href = “http://xxx” // 重定向,跳转
locate.reload() //页面刷新,相当与location.href = location.href
setInterval // 多次定时器
clearInterval // 清除多次定时器
> var obj=setInterval(function(){...}, time)
> clearInterval(obj);
setTimeout 单次定时器,只执行一次
clearTimeout 清除单次定时器
> var obj=setTimeout(function(){...}, time)
> clearTimeout(obj )
代码示例:alert()
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script> // 创建一个3秒的定时器 setInterval("alert(123);", 3000); </script> <script> function f1(){ console.log(1); } setInterval("f1();", 3000); </script> </body> </html>
代码示例:字体滚动
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="i1">欢迎周总莅临指导</div> <script> function func(){ // 根据ID获取指定标签的内容,赋于局部变量 var tag = document.getElementById('i1'); // 获取标签内部的内容 var content = tag.innerText; var f = content.charAt(0); var l = content.substring(1,content.length); var new_content = l + f; tag.innerText = new_content; } setInterval('func()', 500); </script> </body> </html>
事件

绑定事件三种方式
a. 直接在标签中绑定 :<标签 事件='func()'>
<input id='i1' type='button' onclick='clickOn(this) '> <!-- this 表示当前触发事件的标签 -->
function clickOn(self){
// self 当前点击的标签
}
b. 先获取Dom对象,然后进行绑定 :domObj.onclick = function(){...}
doument.getElementById('i1').onclick
<input id='i1' type='button'>
document.getElementById('i1').onclick = function(){
// this 代指当前点击的标签
}
示例:行为、样式、结构相分离的页面
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Examples</title> </head> <body > <table border='1' width='300px'> <tr><td>1</td><td>2</td><td>3</td></tr> <tr><td>1</td><td>2</td><td>3</td></tr> <tr><td>1</td><td>2</td><td>3</td></tr> </table> <script type="text/javascript"> var myTrs = document.getElementsByTagName('tr'); var len = myTrs.length; for(var i=0; i<len;i++){ // i=0, i=1, i=2 myTrs[i].onmouseover = function(){ // myTrs[i].style.backgroundColor = 'red'; // 注意这里不能写myTrs[i],循环时function()内部并未执行,当鼠标移动时执行函数此时i=2,所以看不到效果。 this.style.backgroundColor = 'red'; // 谁调用这个事件,this就指向谁 } myTrs[i].onmouseout = function(){ this.style.backgroundColor = ''; } } </script> </body> </html>
示例: 侧边栏(使用 this)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .hide{ display: none; } .item .header{ height: 35px; background-color: #2459a2; color: white; line-height: 35px; } </style> </head> <body> <div style="height: 48px"></div> <div style="width: 300px"> <div class="item"> <div class="header" onclick="ChangeMenu(this);">菜单1</div> <div class="content"> <div>内容1</div> <div>内容1</div> <div>内容1</div> </div> </div> <div class="item"> <div class="header" onclick="ChangeMenu(this);">菜单2</div> <div class="content hide"> <div>内容2</div> <div>内容2</div> <div>内容2</div> </div> </div> <div class="item"> <div class="header" onclick="ChangeMenu(this);">菜单3</div> <div class="content hide"> <div>内容3</div> <div>内容3</div> <div>内容3</div> </div> </div> <div class="item"> <div class="header" onclick="ChangeMenu(this);">菜单4</div> <div class="content hide"> <div>内容4</div> <div>内容4</div> <div>内容4</div> </div> </div> </div> <script> function ChangeMenu(self){ // self 形参表示当前点击的标签 // 如果在这里写this, 代指全局对象(window),而不是当前点击的标签 var current_header = self; var item_list = current_header.parentElement.parentElement.children; for(var i=0;i<item_list.length;i++){ var current_item = item_list[i]; current_item.children[1].classList.add('hide'); } current_header.nextElementSibling.classList.remove('hide'); } </script> </body> </html>
c. 先获取Dom对象,然后进行绑定 :domObj.addEventListener(‘事件',function(){..},false/true) 可以对同一Dom对象绑定多个事件
事件之捕捉与冒泡:

示例1:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id='test' style="background-color: red"> </div> <script> var mydiv= document.getElementById('test'); mydiv.addEventListener('click',function(){console.log('aaa')},false); mydiv.addEventListener('click',function(){console.log('bbb')},false); </script> </body> </html>
示例2:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style type="text/css"> #main { background-color: red; width:300px; height: 400px; } #content { background-color: pink; width: 150px; height: 200px; } </style> </head> <body> <div id='main'> <div id='content'></div> </div> <script> var mymain = document.getElementById('main'); var mycontent = document.getElementById('content'); // false 为冒泡,true 为捕捉 mymain.addEventListener('click',function(){console.log('main')},false); mycontent.addEventListener('click',function(){console.log('content')},false); </script> </body> </html>

浙公网安备 33010602011771号