DOM相关内容

  1. DOM
  1. 简介

DOM是针对HTML和XML文档的一个API(应用程序编程接口),DOM描绘了一个层次化的节点树,允许开发人员添加,移除,修改页面的某一部分。1998年10月DOM1级规范成为W3C的推荐标准,为基本的文档结构以及查询提供了接口。但是要注意,IE中的所有DOM对象都是以COM对象的形式实现的。这意味着IE中的DOM对象与原生JavaScript对象的行为或活动特点并不一致。

DOM可以将任何HTML或XML文档描绘成一个由多层节点构成的结构。节点分为几种不同的类型,每种类型分别表示文档中不同的信息或标记。每个节点拥有各自的特点,数据和方法,另外也有与其他节点存在某种关系。节点之间的关系构成了层次,所有页面标记则表现为一个以特定节点为根节点的树形结构。

文档对象模型 Document Object Model  dom

第三方库, 浏览器厂商提供的js操作html的api

不同的浏览器厂商提供的api可能不同,所以dom存在兼容性问题(少部分)

低于等于IE9

本地编辑(sublime/vsCode)-->本地浏览器打开(审查元素)  

URL: file://C:/user/briup/1.html

本地编辑--》FTP工具---》服务器/var/www/html/chap09-->本地浏览器打开(审查元素)

URL :  http://121.133.22.101/chap09/1.html

服务器vi---》服务器/var/www/html/chap09-->本地浏览器打开

构造函数树

Node、Document、Element、Text、Comment

<div id="one"></div>

var one = document.getElementById('one');

document 是 HTMLDocument实例对象,是window的属性

one 是 HTMLDivElement实例对象

可以调用

HTMLDivElement.prototype

HTMLElement.prototype

Element.prototype 【元素】

Node.prototype 【节点】

Object.prototype 【底层对象方法】

中的属性和方法

vi 1-constructor-tree.html

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>constructor-tree</title>

<style>

#one {

background-color: teal;

color:#fff;

width: 300px;

height: 300px;

}

</style>

</head>

<body>

<button id="btn">按钮</button>

<div id="one">this is one</div>

<script>

var one = document.getElementById('one');

console.log('one',one);

console.log('typeof one',typeof one);

var btn = document.getElementById('btn');

btn.onclick = function(){

one.innerText = "这是一";

alert(one.nodeName);

alert(btn.nodeName);

}

console.log('btn',btn);

console.log('typeof btn',typeof btn);

// 测试关系

console.log("document", document);

console.log("document constructor",document.constructor);//function HTMLDocument

console.log(document instanceof HTMLDocument);//true

console.log(document instanceof Document);//true

console.log(document instanceof Node);//true

console.log(document instanceof Object);//true

console.log(document instanceof Element);//false

console.log(HTMLDocument.prototype instanceof Document);//true

console.log("----");

console.log("one",one);

console.log("one constructor",one.constructor);//function HTMLDivElement

console.log(one instanceof HTMLDivElement);//true

console.log(one instanceof HTMLElement);//true

console.log(one instanceof Element);//true

console.log(one instanceof Node);//true

console.log(one instanceof Object);//true

console.log(one instanceof Document);//false

console.log(HTMLDivElement.prototype instanceof Element);//true

</script>

</body>

</html>

  1. Node.prototype

Node类型

DOM1级定义为一个Node接口,该接口将由DOM中的所有节点类型实现。除了IE之外,在其他所有浏览器中都可以访问到这个类型。javascript中所有的节点类型都继承自Node类型,所有节点类型都共享着相同的基本属性和方法。

节点关系

属性:

nodeType 表示节点类型

      Document--> 9;Element -->1;TextNode -->3;Comment--> 8

      document 是Document构造函数的实例

      document.body是Element构造函数的实例

      document.body.firstChild 是TextNode构造函数的实例

nodeName

      该属性取决于节点类型,如果是元素类型,值为元素的标签名

nodeValue

      该属性取决于节点类型,如果是元素类型,值有null

 childNodes

      保存一个NodeList对象,NodeList是一种类数组对象用来保存一组有序的节点,NodeList是基于DOM结构动态执行查询的结果,DOM结构变化可以自动反应到NodeList对象中。访问时可以通过中括号访问,也可以通过item()方法访问。可以使用slice方法将NodeList转换为数组

  var arr = Array.prototype.slice.call(nodes,0);

parentNode

  指向文档树中的父节点。包含在childNodes列表中所有的节点都具有相同的父节点,每个节点之间都是同胞/兄弟节点。

previousSibling 兄弟节点中的前一个节点

nextSibling  兄弟节点中的下一个节点

firstChild  childNodes列表中的第一个节点

lastChild  

childNodes列表中的最后一个节点

ownerDocument  

指向表示整个文档的文档节点。任何节点都属于它所在的文档,任何节点都不能同时存在于两个或更多个文档中。

方法:

hasChildNodes()

在包含一个或多个子节点的情况下返回true

操作节点

以下四个方法都需要父节点对象进行调用!

appendChild()

向childNodes列表末尾添加一个节点。返回新增的节点。关系更新如果参数节点已经为文档的一部分,位置更新而不插入,dom树可以看做是由一系列的指针连接起来的,任何DOM节点不能同时出现在文档中的多个位置  

insertBefore()  //第一个参数:要插入的节点;第二个参数:作为参照的节点;

被插入的节点会变成参照节点的前一个同胞节点,同时被方法返回。如果第二个参数为null将会将该节点追加在NodeList后面

replaceChild()  //第一个参数:要插入的节点;第二个参数:要替换的节点;

要替换的节点将由这个方法返回并从文档树中被移除,同时由要插入的节点占据其位置

removeChild() //一个参数,即要移除的节点。

移除的节点将作为方法的返回值。其他方法,任何节点对象都可以调用。

其他方法

cloneNode()

用于创建调用这个方法的节点的一个完全相同的副本。有一个参数为布尔类型参数为true时,表示深复制,即复制节点以及整个子节点数。参数为false的时候,表示浅复制,只复制节点本身。该方法不会复制添加到DOM节点中的JavaScript属性,例如事件处理程序等。该方法只复制特定,子节点,其他一切都不复制。但是IE中可以复制,建议标准相同,在复制之前,移除所有事件处理程序。

normalize()

处理文档树中的文本节点,由于解析器的实现或DOM操作等原因,可能会出现文本节点不包含文本,或者接连出现两个文本节点,当在某个节点上调用了该方法,会删除空白节点,会找到相邻的两个文本节点,并将他们合并为一个文本节点。

属性:

层次结构

parentNode 父节点

childNodes 获取所有子节点(文本,元素,注释)

firstChild 获取当前节点的第一个子节点

lastChild 获取当前节点的最后一个子节点

nextSibling 获取当前节点下一个兄弟节点

previousSibling 获取当前节点上一个兄弟节点

ownerDocument 获取当前document

节点属性:

nodeName

如果文本节点:#text

如果元素节点:元素的名称大写

nodeType

Node.ELEMENT_NONE

Node.DOCUMENT_NONE  

Node.COMMENT_NONE

Node.TEXT_NODE

nodeValue

注释节点

文本节点

方法:

【父节点调用的方法】

appendChild() 追加孩子节点

insertBefore(new,reference) 将new节点插入到reference之前

removeChild(child) 移除指定的子节点元素

replaceChild(new, old) 使用new节点替换old节点

cloneNode() 克隆节点

normalize()

contains() 判断某个节点是否是当前节点的后代节点

hasChildNodes() 盘点某个节点是否是当前节点的子节点

Vi 2-Node-test.html

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Node-test</title>

</head>

<body>

<div id="one" name="first" class="first">

<div>hello</div>

<div>world</div>

</div>

<div id="two">

<!-- 注释 -->

<p></p>

</div>

<script>

console.log("function Node",Node);//除了IE之外,在其他所有浏览器中都可以访问到这个类型,新版本IE(大于9)可以使用

console.log("document obj",document);

// 获取body元素

var body = document.body;

console.log("body",body);

// 判断类型

console.log("body.nodeType",body.nodeType);//1 Element

// 标签名字

console.log("body.nodeName",body.nodeName.toLowerCase());//body

// 标签值

console.log("body.nodeValue",body.nodeValue);//null

//信息判断

console.log("body.ownerDocument",body.ownerDocument);//HTMLDocument

console.log(body.ownerDocument===document);//true

console.log(body.hasChildNodes());//true

// 获取父节点

console.log("body.parentNode",body.parentNode); //<html>

// 获取子节点 测试childNodes  在不同浏览器下的结果

console.log("body.childNodes",body.childNodes);//NodeList

console.log("body.childNodes.length",body.childNodes.length);

//将类数组对象转换为数组,并过滤出元素节点

var childs = body.childNodes;

var arr = Array.prototype.slice.call(childs,0);

var result = arr.filter(function(item){

// 过滤元素节点  nodeType=1  Element

return item.nodeType == 1;

});

console.log("body.childNodes",result);//Array 没有#text

//类数组对象可以调用数组的方法吗?   不可以调用数组中的方法

//arr.slice(begin, end)  [begin,ben)返回一个新的数组对象

/*arr.slice()    //正确

childs.slice()  //错误

slice.call(childs,0)  //正确*/

var one = document.getElementById("one");

console.log('baseURI element:',one.baseURI);

console.log('baseURI document:',document.baseURI);

//获取所有子节点-Node

console.log('childNodes List:',one.childNodes);//NodeList

console.log(one.firstElementChild);//div hello

console.log(one.childNodes[0].nodeName);//#text  空白

console.log(one.childNodes[1].nodeType == Node.ELEMENT_NODE);

//true

console.log(one.nextSibling.nextSibling);//div#tow

// 获取所有子元素-Element

console.log("children element:",one.children);//HTMLCollection

console.log("children element:",one.children.item(1));

// 获取one的信息

console.log("innerHTML",one.innerHTML);

console.log("attributes",one.attributes);

one.setAttribute("class","second");

//节点操作

var one = document.getElementById("one");

var two = document.getElementById("two");

// 将节点two克隆一份,并且修改id

//如果写了参数true,则代表深复制。浅复制是默认的

var two_copy = two.cloneNode(true);

var two_copy_2 = two.cloneNode(true);

two_copy.setAttribute("id","two_copy");

two_copy_2.setAttribute("id","two_copy_2");

// 将克隆的节点追加到one孩子的最后

one.appendChild(two_copy);

one.appendChild(two_copy);//添加子元素到父元素中,并放到最后,每个节点对象只能出现一次

one.insertBefore(two_copy_2,two_copy);

</script>

</body>

</html>

  1. Document.prototype HTMLDocument.prototype

Document类型

Javascript通过使用Document类型表示文档。在浏览器中,document对象是HTMLDocument的一个实例,表示整个HTML页面。document对象是window对象的一个属性,因此可以直接调用。HTMLDocument继承自Document。

文档子节点

可以继承Node中所有的属性和方法

属性:

documentElement 始终指向HTML页面中的<html>元素。

body  直接指向<body>元素

doctype  访问<!DOCTYPE>, 浏览器支持不一致,很少使用

title   获取文档的标题

URL   取得完整的URL

domain  取得域名,并且可以进行设置,在跨域访问中经常会用到。服务器测

referrer               取得链接到当前页面的那个页面的URL,即来源页面的URL。

images  获取所有的img对象,返回HTMLCollection类数组对象

    forms  获取所有的form对象,返回HTMLCollection类数组对象

links      获取文档中所有带href属性的<a>元素

查找元素

getElementById()  

参数为要取得元素的ID,如果找到返回该元素,否则返回null。如果页面中多个元素的ID值相同,只返回文档中第一次出现的元素。如果某个表单元素的name值等于指定的ID,该元素也会被匹配。

getElementsByTagName()

参数为要取得元素的标签名,返回包含另个或者多个元素的NodeList,在HTML文档中该方法返回的是HTMLCollection对象,与NodeList非常类似。可以通过[index/name],item(),namedItem(name)访问

getElementsByName()

参数为元素的name,返回符合条件的NodeList

getElementsByClassName()

参数为一个字符串,可以由多个空格隔开的标识符组成。当元素的class属性值包含所有指定的标识符时才匹配。HTML元素的class属性值是一个以空格隔开的列表,可以为空或包含多个标识符。

属性:

PPT中有详细介绍

head

title

body

forms

images

hidden

links

location 跳转

方法:

createElement(tagName)

getElementById()

通过id获取元素

getElementsByClassName()

获取类名获取元素

getElementsByName()

通过名称获取元素

getElementsByTagName()

通过标签名获取元素

create..()

Vi 3-Document-test.html

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Document-test</title>

<style>

#one {

border: 1px solid #ccc;

width: 500px;

padding: 20px;

}

.pink {

background-color: pink;

color: #fff;

}

</style>

</head>

<body>

<img src="../images/2.jpg" alt="Sorry,图片迷路了...">

<img src="../images/3.jpg" alt="Sorry,图片迷路了...">

<form action=""></form>

<form action=""></form>

<a href=""></a>

<a href=""></a>

<a href=""></a>

<a></a>

<div id="one"></div>

<div class="two" name="hi">two1</div>

<div class="two">two2</div>

<script>

console.log("function Document",Document);

// 获取html标签

console.log(document.documentElement);

// body标签

console.log(document.body);

// doctype

console.log(document.doctype);//name:”html”

// title

console.log(document.title);

// images

console.log(document.images);//HTMLCollection 2个

var arr = Array.prototype.slice.call(document.images,0);

console.log(arr);

// forms

console.log(document.forms);//HTMLCollection 2个

// links  带有href属性的a标签

console.log(document.links);//HTMLCollection 3个

// getElementsByTagName

console.log(document.getElementsByTagName("div"));//HTMLCollection 3个

var one = document.getElementById("one");

console.log(one);//1个

var twos = document.getElementsByClassName("two");

console.log(twos);//HTMLCollection 2个

//HTMLCollection的遍历  twos.[i]  twos.item(i)

for(var i = 0;i<twos.length;i++){

twos[i].setAttribute("class","two pink")//Element

}

// 将一个类数组对象转换为数组

var array_twos = Array.prototype.slice.call(twos,0);

console.log(array_twos);

//创建元素

var p1 = document.createElement("p");//Document.prototype

p1.innerHTML = "hello world";//Element.prototype

p1.setAttribute("class","two pink");//Element.prototype

one.appendChild(p1);//Node.prototype

</script>

</body>

</html>

Vi 4-Document-open.html

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Document-open</title>

<script>

//不要和 window.open() 方法混淆。

     //document.open 可用于对当前的文档追加内容, 而 window.open 是提供了打开一个新的窗口的方法

document.open(); //打开一个文档流区追加写入内容

document.write("<p>Hello world!</p>");

document.write("<p>I am a fish</p>");

document.write("<p>The number is 42</p>");

document.close();  

alert(1);

document.write(new Date());//会发生自动的 document.open()调用

</script>

</head>

<body>

<div>加载顺序的影响</div>

</body>

</html>

  1. Element.prototype HTMLElement.prototype

Element类型

HTML元素

所有的HTML元素都由HTMLElement类型表示,或者其子类型表示。每个HTML元素都应具有如下一些属性以及html元素特有的属性。

id   元素在文档中的唯一标识符

title   有关元素的附加说明信息

className  与元素class特性对应

src   img元素具有的属性

alt   img元素具有的属性

lang  元素内容的语言代码,很少使用!

dir   语言方向,ltr,rtl 左到右,右到左、

每个元素都有一个或者多个特性,这些特性的用途是给出相应元素或内容的附加信息。可以通过属性访问到该属性对应的值,特性的名称是不区分大小写的,即"id""ID"表示相同的特性,另外需要注意的是,根据HTML5规范,自定义特性应该加上data-前缀,以便验证。

取得自定义属性

getAttribute() 参数为实际元素的属性名,class,name,id,title,lang,dir一般只有在取得自定义特性值的情况下,才会用该方法。大多数直接使用属性进行访问,比如style,onclick

设置属性

  dom.className = "one"

  dom.setAttribute("className","one");

  setAttribute() :两个参数,第一个参数为要设置的特性名,第二个参数为对应的值。如果该值存在,替换

移除属性 removeAttribute() 移除指定的特性

attributes属性,其中包含了一个NamedNodeMap,与NodeList类似

  getNamedItem(name) 返回nodeName属性等于name的节点,再访问nodeValue

  removeNamedItem(name)  从列表中删除nodeName属性等于name的值

  setNamedItem(attrNode)   向列表中添加一个节点

    var attr=document.createAttribute(”title“);

attr.nodeValue=”test“;   

btn.attributes.setNamedItem(attr);

  item(index)  返回位于数字index位置处的节点

创建元素

document.createElement()    参数为要创建元素的标签名。该标签名在HTML中不区分大小写,但是在XML中区分大小写

元素的子节点

  <ul>

   <li>item1</li>

   <li>item2</li>

  </ul>

   ie8及以下版本浏览器 2个子节点

  其他浏览器  5个子节点

特殊特性

style

通过getAttribute()访问时,返回的style特性值中包含的是CSS文本,而通过属性来访问返回一个对象,由于style属性是用于以编程方式访问元素样式的,因此并没有直接映射到style特性

onclick

类似的事件处理程序,通过getAttribute()访问时,返回相应代码字符串;访问onclick属性时,返回一个javascript函数

作为文档树的文档

将文档看做是Element对象树,忽略文档Text,Comment节点。Element中的属性

    children 类似于childNodes,返回NodeList对象,但是该对象中仅包含Element对象

firstElementChild 第一个孩子元素节点

lastElementChild 最后一个孩子元素节点

nextElementSibling 下一个兄弟元素节点

previousElementSibling 上一个兄弟元素节点

childElementCount 子元素的数量,返回值和children.length值相等元素内容

innerHTML    返回元素内容,包括html标签

innerText      元素内部的文本,去除回车和换行

textContent    元素内部的文本,不去除空格和回车

属性:

获得元素 获得节点

children------Elements childNodes-----Nodes

firstElementChild------Element firstChild-----Node

lastElementChild------Element lastChild-----Node

nextElementSibling------Element nextSibling-----Node

previousElemetSibling------Element   previousSibling-----Node

children 获取所有子元素(子 Element)

firstElementChild 获取当前元素的第一个子元素

lastElementChild 获取当前元素的最后一个子元素

nextElementSibling 获取当前元素的下一个兄弟元素

previousElementSibling 获取当前元素的上一个兄弟元素

childElementCount

获得该元素里的内容:

Node.prototype.nodeValue   Element-->null

innerHTML 兼容性比较好,获取或者设置元素内部的html,标签可以被解析

textContent 非IE

innerText IE

获得元素的属性:

attributes:  NamedNodeMap

id

className

name

href

src

alt

...

获得元素尺寸:

clientWidth 宽(padding + 内容)

clientHeight 高(padding + 内容)

clientTop 上边框的宽度

clientLeft 左边框的宽度

方法:

getAttribute(key)

setAttribute(key,val)

removeAttribute()

querySelector()     HTMLDocument.prototype  HTMLElement.prototype

querySelectorAll()  HTMLDocument.prototype  HTMLElement.prototype

Vi 5-Element-test.html

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Element-test</title>

<style>

body {

margin: 0;

padding: 0;

}

#one {

width: 100px;

height: 100px;

padding: 20px;

border: 10px solid #ccc;

position: relative;

left: 100px;

}

</style>

</head>

<body>

<div id="one" class="first" name="photo">

<span>相片夹</span>

</div>

<div id="three">3</div>

<div id="four">4</div>

<input type="text" name="username" id="two" class="second">

<a href="http://www.baidu.com">百度一下</a>

<script>

var one = document.getElementById("one");

var three = document.getElementById("three");

var four = document.getElementById("four");

console.log(one.innerHTML);//innerHTML  兼容性比较好

console.log(one.textContent);// 非IE浏览器

console.log(one.innerText);// IE浏览器

console.log("one.id",one.id);//one

console.log("one.name",one.name);//undefined // attr 自有

console.log("one.name",one.getAttribute("name"));//photo //prop 添加

console.log("one.className",one.className);//first

console.log("width",one.clientWidth);//140

console.log("left",one.clientLeft);//10

one.clientWidth = 300;//此方式修改失败

one.style.width="300px";

//div#three更新内容

three.innerText = "<h1>hello</h1>"; //innerHTML  兼容性比较好

three.innerHTML = "<h1>world</h1>";

//创建ul/li元素追加给div#four

var newUL = document.createElement("ul");//Document.prototype

newUL.innerHTML = `

<li>one</li>

<li>two</li>

`;//Element.prototype

four.appendChild(newUL); //Node.prototype

var a = document.getElementsByTagName("a")[0];

console.log(a);

console.log(a.constructor);//HTMLAnchorElement

console.log(a.href);

a.href = "http://www.briup.com";

//var myCollection = document.getElementsByTagName("div");

var myNodelist = document.querySelectorAll("div");

console.log("selector",myNodelist );//3个

console.log(myNodelist[1].innerHTML) ;

console.log(myNodelist.length);

//改变节点列表中所有 <div> 元素的背景色:

for (var i = 0; i < myNodelist.length; i++) {

   myNodelist[i].style.backgroundColor = "red";

}

</script>

</body>

</html>

Vi Selector-test.html--不讲

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>选择器Selector</title>

<style>

body {

margin: 0;

padding: 0;

}

#one>div {

line-height: 2em;

color: #fff;

}

#one>div:first-child {

background-color: lightblue;

}

#one>div:nth-child(3) {

background-color: pink;

}

</style>

</head>

<body>

<div id="one">

<div>one</div>

<div>two</div>

<div>three</div>

</div>

<p>hello</p>

<h1>world</h1>

<script>

// 获取类数组对象

var divs = document.body.querySelectorAll("#one > div");

console.log(divs);

// 遍历完成后逐个绑定

for(var i=0; i<divs.length ; i++){

var div = divs[i];

div.onclick = function(event){

alert(event.target.innerText);

}

}

</script>

</body>

</html>

Vi selector-jquery.html--不讲

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>选择器</title>

<style>

body {

margin: 0;

padding: 0;

}

#one>div {

line-height: 2em;

color: #fff;

}

#one>div:first-child {

background-color: lightblue;

}

#one>div:nth-child(3) {

background-color: pink;

}

</style>

</head>

<body>

<div id="one">

<div>one</div>

<div>two</div>

<div>three</div>

</div>

<p>hello</p>

<h1>world</h1>

<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>

<script>

var divs = $("#one > div")

divs.on("click",function(event){

alert(event.target.innerText);

document.location = "http://www.baidu.com";

});

divs.append($("<h1>hi</h1>"))

// ...【 DOM 】 / BOM /ECMAScript

</script>

</body>

</html>

vi 6-element-img.html

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>element-img</title>

</head>

<body>

<img class="test" date-now="today" src="1.jpg" alt="Sorry...." style="height:100px;width:100px">

<button id="btnreset">复原</button>

<button id="btnbig">放大</button>

<script type="text/javascript">

var img = document.images[0];

//获取属性

// 获取class属性的值

console.log(img.className);//test

console.log(img.getAttribute("class"));//test

//获取自定义属性

console.log(img["date-now"]);//undefined

console.log(img.getAttribute("date-now"));//today

// 获取height和width属性

console.log(img.height);//100

console.log(img.width);//100

console.log(img.style.height);//100px

console.log(img.style.width);//100px

//获取src

console.log(img.src);//file://xxxx/1.jpg

console.log(img.getAttribute("src"));//1.jpg

// 获取img标签的所有属性

console.log(img.attributes);//NamedNodeMap

console.log(img.attributes[0]);

console.log(img.attributes.item(0));

console.log(img.attributes.getNamedItem("alt"));

console.log(img.attributes.removeNamedItem("alt"));

img.removeAttribute("src");

console.log(img.attributes);

var btnreset = document.getElementById("btnreset");

var btnbig = document.getElementById("btnbig");

// 点击按钮1,复原图片原来的尺寸、src

//src="../images/2.jpg"

//height:100px;width:100px

btnreset.onclick = function(){

//img.src = "../images/2.jpg";

img.setAttribute("src","1.jpg");

img.style.height = "100px";

img.style.width = "100px";

}

// 点击按钮2,图片放大2倍

btnbig.onclick = function(){

img.style.height = "200px";

img.style.width = "200px";

}

// 点击图片,替换图片

img.onclick = function(){

img.src = "2.jpg";

}

// 获取onclick

console.log(img.onclick);

// 模拟点击事件

// img.onclick();

</script>

</body>

</html>

  1. Text.prototype Comment.prototype

Text类型(文本类型)

文本节点,包含的是可以按照字面解释的纯文本内容。

length      //文本长度

appendData(text)   //追加文本

deleteData(beginIndex,count)  //删除文本

insertData(beginIndex,text)  //插入文本

replaceData(beginIndex,count,text)  //替换文本

splitText(beginIndex)    //从beginIndex位置将当前文本节点分成两个文本节点

document.createTextNode(text) //创建文本节点,参数为要插入节点中的文本

substringData(beginIndex,count)  //从beginIndex开始提取count个子字符串

Comment类型:  注释类型

<div id = "myDiv"><!--a comment--></div>

<!--a comment--> Comment类型

Vi 7-text-comment.html

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>text-test</title>

</head>

<body>

<!-- 这是注释 -->

hello

<script type="text/javascript">

var body = document.body;

var text = body.firstChild;//Node ,Elelemtn: firstElementChild

console.log(text);//空行

// 获取文本内容

console.log(text.data.trim().length);//0

console.log(text.length);//2

text.appendData("world");

//追加内容

var briup=document.createTextNode("briup");

console.log(briup);

text.appendData(briup);

//text.appendChild(briup);error

body.appendChild(briup);//Node

// Comment

var comment = body.firstChild.nextSibling;

console.log(comment);

// 获取内容

console.log(comment.data);

</script>

</body>

</html>

  1. 学习地址

JavaScript HTML DOM

文档对象模型 (DOM) - Web API 接口参考 | MDN

  1. 事件机制
  1. 简介

为元素添加事件响应函数,当执行相应的操作的时候会执行该函数

Vi 1-demo.html:只需填补<script>代码

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>事件机制</title>

<style>

.btn {

padding: .5em 1em;

border-radius: 3px;

background-color: teal;

color: #ededed;

cursor: pointer;

display: inline-block;

}

</style>

</head>

<body>

<div id="one" class="btn">one</div>

<script>

// 1. 事件源/事件目标  event target

var one = document.getElementById("one");

// 2. 绑定事件处理函数 event handler

var a = 1;

one.onclick = function(event){

// 3. 事件对象event object

console.log(event);

alert(a);

}

</script>

</body>

</html>

JavaScript与HTML之间的交互是通过事件实现的。事件就是文档或浏览器窗口中发生的一些特定的交互瞬间。

事件三要素:

事件目标(event target)

发生的事件与之相关联或与之相关的对象

事件处理程序(event handler)

处理或相应事件的函数

事件对象(event object)     

与特定事件相关且包含有关该事件详细信息的对象

为元素添加事件响应函数,当执行响应的操作的时候会执行该函数

事件源/事件目标  event target  :浏览器要去监听的元素

事件处理函event handler :浏览器在事件类型发生的时候去执行处理的函数

事件对象 event object: 由浏览器传递的实参值,事件对象

  1. 事件流

事件流

描述的是从页面中接受事件的顺序

事件冒泡 (IE事件流)

从内往外

事件开始由最具体的元素接收,然后逐级向上传播到不具体的节点

<html>

  <head></head>

  <body>

   <div>click me</div>

  </body>

</html>

当点击了<div>元素,这个click事件会按照如下顺序传播

div->body->html->document

注意:IE8以及更早版本只支持事件冒泡。

事件捕获 (Netscape事件流)

不太具体的节点更早接收事件,具体的节点到最后接收事件。当点击了<div>元素,按照如下方式触发click事件

document->html->body->div

 DOM事件流

“DOM2级事件”规定了事件流包括三个阶段:事件捕获阶段,处理目标阶段和事件冒泡阶段。首先发生的是事件捕获,为截获事件提供了机会。然后是实际的目标接收到事件。最后是事件冒泡。

    事件捕获: document->html->body  

    处理目标: 事件处理

    事件冒泡: body->html->document

事件流(元素嵌套,为每层元素添加事件处理函数)

1. 事件捕获(外->内)

2. 事件冒泡(内->外)

在多数浏览器中,默认按照事件冒泡的方式来执行事件处理函数,也就是越靠里的元素上的事件处理函数越先执行。

3.DOM2级事件规定了事件流的三个阶段

事件捕获: document->html->body  

处理目标: 事件处理

事件冒泡: div->body->html->document

元素嵌套,为每层元素添加事件处理函数

<div class=”outer” onclick>

<div class=”center” onclick>

<div class=”inner” onclick></div>

</div>

</div>

1.事件捕获:谁被点击了    外---->内

document->html->body->div.outer Y ->div.center Y ->div.inner Y

2.处理目标:事件处理 div.outer  div.center  div.inner

3.事件冒泡:执行处理函数   内-->外

div.inner.handler()-->div.center.handler()-->div.outer.handler()

  1. 事件处理程序

事件处理程序

事件就是用户或浏览器自身执行的某种动作,响应某个事件的函数为事件处理程序,事件处理程序以"on"开头(onclick,onload)

HTML事件处理程序

某个元素支持的每种事件,都可以使用一个与相应事件处理程序同名的HTML特性来指定。这个特性的值应该是能够执行的JavaScript代码。

<input type="button" value="clickMe" onclick = "alert('is clicked')">

<input type="button" value="clickMe" onclick = "showMsg()">

<script type="text/javascript">

function showMsg(){

  alert("is clicked");

}

</script>

点击按钮会调用showMsg()函数,事件处理程序的代码在执行时,有权访问全局作用域的任何代码。

缺点:1)时差问题,用户可能会在HTML元素一出现在页面上就触发相应的事件,但当时的事件处理程序有可能尚不具备执行的条件。2)这种扩展事件处理程序的作用域链在不同浏览器中会导致不同结果。3)HTML与JavaScript代码紧密耦合。

DOM0级事件处理程序

通过javascript指定事件处理程序的传统方式,将一个函数赋值给一个事件处理程序属性。特点是简单,跨浏览器。

var btn = document.getElementById("btn");

btn.onclick = function(){

alert('cliked');

}

dom0级方法制定的事件处理程序被认为是元素的方法,因此这个时候事件处理程序是在元素的作用域中运行,this指向当前元素。

btn.onclick = null;    //删除事件处理程序

DOM2级事件处理程序

 DOM2级规范以一种符合逻辑的方式来标准化DOM事件,IE9, Firefox, Opera, Safari, Chrome全部已经实现了"DOM2级事件"模块的核心部分。IE8是最后一个仍然使用其专有事件系统的主要浏览器

非IE事件处理程序

addEventListener() 事件绑定

参数:

要绑定的事件名 ,不加on前缀

作为事件处理的函数

布尔值:true在捕获阶段调用事件处理程序;false在冒泡阶段调用【默认】

removeEventListener() 事件解绑

参数:

要删除的事件名,不加on前缀

作为事件处理的函数

    布尔值:true在捕获阶段调用事件处理程序;false在冒泡阶段调用【默认】

可以添加多个事件处理程序,并且按照添加她们的顺序触发。移除事件传入的参数与添加处理程序时使用的参数相同,添加事件时如果使用匿名函数将无法删除

 IE事件处理程序

事件处理程序会在全局作用域中运行,因此this指向window对象。为一个对象添加两个相同的事件,事件处理程序的顺序是按照添加相反顺序进行处理。

attachEvent()  事件绑定

参数:  

  事件类型,加on前缀

  事件处理函数

detachEvent() 事件移除

参数:

  事件类型,加on前缀

  事件处理函数

事件处理程序都被添加到冒泡阶段

事件处理函数的绑定 event handler

1. HTML特性来指定

2.普通绑定(绝大多数浏览器都兼容)DOM0级事件处理程序

事件源.onxxx = function(event){

执行过程

}

事件对象通过事件处理函数形式参数来接受即可

事件源.onxxx=null

3. 标准方法(新版本都兼容)  DOM2级事件处理程序

A)非IE,>IE9:

  事件源.addEventListener(“xxx”,handler,boolean)

事件源.addEventListener("xxx",function(event){},boolean)

事件对象通过事件处理函数形式参数来接受即可

  事件源.removeEventListener(“xxx”,handler,boolean)

B)<IE9:

  事件源.attachEvent(“xxx”,handler);

  事件源.attachEvent("xxx",function(){window.event})

  事件源.detachEvent(“xxx”,handler)

C)兼容性

  在script的开头添加不兼容的方法到内置原型中

  if(element.addEventListener){

element.addEventListener(“click”,modifyText,false);

  }else if(element.attachEvent){

element.attachEvent("onclick",modifyText);

  }else{

element["onclick”] = handler;

  }

Vi 2-event-flow.html:填补<script>代码

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>事件流</title>

<style>

div {

border: 1px solid #666;

box-sizing: border-box;

}

div.outer {

width: 400px;

height: 400px;

margin: 0 auto;

padding: 50px;

}

div.center,

div.inner  {

height: 100%;

padding: 50px;

}

</style>

</head>

<body>

<div class="outer">

       outer

<div class="center">

           center

<div class="inner">inner</div>

</div>

</div>

<script>

var outer = document.getElementsByClassName("outer")[0];

var center = document.getElementsByClassName("center")[0];

var inner = document.getElementsByClassName("inner")[0];

function handler(event){

console.log(this,this.className,this.nodeName,this.constructor);

// 获取事件对象

// 非IE9之下,使用event直接获取

console.log(event);

// 在IE9之下,则使用window.event获取

console.log(window.event);

console.log(event.target,event.currentTarget);

alert(event.currentTarget.className);

//在事件处理程序内部,对象this始终等于currentTarget值,而target则只包含事件的实际目标。如果直接将事件处理程序指定给了目标元素,this,currentTarget,target包含相同的值。

//event.stopPropagation();//取消事件的进一步捕获或者冒泡

}

//普通绑定:画图描述捕获、冒泡过程  DOM0级

outer.onclick = handler;

center.onclick = handler;

inner.onclick = handler;

//解绑

Inner.οnclick=null;

// IE9以下的

/*绑定方法attachEvent

inner.attachEvent("onclick",handler);

center.attachEvent("onclick",handler);

outer.attachEvent("onclick",handler);*/

// 解绑

// inner.detachEvent("onclick",handler);

//标准绑定 DOM2级

outer.addEventListener("click",handler,true);//true 事件捕获阶段调用

outer.addEventListener("click",function(){

alert("~~~~~");

},true)

outer.removeEventListener("click",handler,true)//可删除、内存开销小

center.addEventListener("click",handler,false);//false 冒泡阶段调用

// 封装绑定事件和解绑事件函数。

var handler = function(event){

alert(event.currentTarget.className);

}

var utils = {

bind:function(element,type,handler){

if(element.addEventListener){

element.addEventListener(type,handler,false);

}else if(element.attachEvent){

// element.attachEvent("on"+type,handler);

element.attachEvent("on"+type,function(){

handler.call(element);

});

}else{

element["on"+type] = handler;

}

}

};

utils.bind(inner,"click",handler);

utils.bind(center,"click",handler);

utils.bind(outer,"click",handler);

// 在DOM0级绑定事件中,this指向currentTarget(当前目标)【都是】

// 在DOM2级非IE9以下绑定事件中,this指向currentTarget(当前目标)

// 在DOM2级IE9以下绑定事件中,this指向window

// 获取事件对象:

// 使用DOM0级绑定函数中,在非IE9以下,直接使用event;在IE9之下,通过window.event来获取

// 使用DOM2级绑定函数中,使用event来获取

</script>

</body>

</html>

  1. 事件对象

事件对象

DOM的事件对象

在触发DOM上的某个事件时,会产生一个事件对象event,这个对象包含着所有与事件相关的信息,包括导致事件的元素,事件的类型以及其他与特定事件相关的信息。兼容DOM的浏览器默认会将event对象传入到事件处理函数中。

dom.onclick = function(event){

       console.log(event);

}

dom.addEventListener("click",function(event){

  console.log(event);      

},false);

事件对象的属性均为只读属性

属性                 类型  说明

      bubbles Boolean 事件是否冒泡

      cancelable Boolean 是否可取消事件默认行为

      currentTarget Element 事件处理程序当前正在处理事件的那个元素

      eventPhase Integer 调用事件处理程序的阶段;1捕获 2处于目标 3冒泡

      target  Element 事件真正目标

      type  String 事件类型,需要一个函数,处理多个事件时,可使用该属性。

     preventDefault() Function       取消事件的默认行为

     stopPropagation()Function       取消事件的进一步捕获或者冒泡

在事件处理程序内部,对象this始终等于currentTarget值,而target则只包含事件的实际目标。如果直接将事件处理程序指定给了目标元素,this,currentTarget,target包含相同的值。

IE中的事件对象

在使用DOM0级方法添加事件时,event对象可以作为window对象的一个属性存在,使用attachEvent添加事件处理程序的时候,event对象会作为参数传入事件处理函数中

      dom.onclick = function(){

   console.log(window.event);

   window.event.returnValue = false;//阻止默认行为

   window.event.cancalBubble = true;//取消冒泡

      }

      dom.attachEvent("onclick",function(event){

   console.log(window.event);

      });

属性                 类型            说明

cancelBubble Boolean  是否取消事件冒泡,值为true取消冒泡,      类似stopPropagation()

returnValue  Boolean  取消事件默认行为,值为false阻止,类似       preventDefault()

srcElement  Element  事件的目标 target

type  String  被触发的事件的类型

使用事件绑定的方式不同,获取事件对象的方式就不同

target

在一个嵌套的结构中,当点击内部元素,外部元素上绑定的onclick事件处理函数也会执行,这时候,这个事件处理函数中的event.target为内部元素;一般用于事件代理

currentTarget

在一个嵌套的结构中,当点击内部元素,外部元素上绑定的onclick事件处理函数也会执行,这时候,这个事件处理函数中的event.currentTarget为外部元素(绑定该事件处理函数的事件源)

target  内部元素

currentTarget  this  外部元素,绑定处理函数的那个对象

点击单选按钮,自动切换男女头像

Vi 3-eventObject.html:填补<script>代码

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>事件对象</title>

</head>

<body>

    <div>

        <label><input name="gender" type="radio" value="male" checked>男</label>

        <label><input name="gender" type="radio" value="female">女</label>

        <br>

        <img src="images/male.jpg" width="100" height="100" alt="图片显示不出来...">

      </div>

    <script>

    var img = document.getElementsByTagName('img')[0];

    // 1. 事件源/事件目标

    var gender=document.getElementsByName("gender");

    //console.log(gender[0].value,gender[1].value);

    for(var i=0;i<gender.length;i++){

        // 2. 绑定事件处理函数

        gender[i].onclick = function(event){

            // 3. 事件对象event

            console.log(event.target.value)//千万不能使用gender[i].value

            if(event.target.value=="male") img.src = 'images/male.jpg';

            if(event.target.value=="female") img.src = 'images/female.jpg';

        }

    }

</script>

</body>

</html>

stopPropagation():阻止事件流,

阻止捕获或者冒泡阶段中当前事件的进一步传播

HTML属性的绑定、普通绑定DOM0级:在冒泡阶段执行处理函数

标准绑定DOM2级,false:在冒泡阶段执行处理函数

标准绑定DOM2级,true:在捕获阶段执行处理函数

defaultPrevented:是否阻止了 false

preventDefault():阻止默认行为 true

form submit  默认提交表单

a    click   默认调转

    checkbox click 默认可以选择

Vi 3-preventDefault.html:填补<script>代码

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>阻止默认</title>

<style type="text/css">

form{

margin: 0 auto;

width: 700px;

padding-top: 100px;

border-right-style: none;

}

#search{

height: 16px;

width: 500px;

padding: 12px 16px;

font-size: 16px;

margin: 0;

vertical-align: top;

outline: 0;

box-shadow: none;

border-radius: 10px 0 0 10px;

border: 2px solid #c4c7ce;

background: #fff;

color: #222;

overflow: hidden;

}

#btn{

display: inline-block;

cursor: pointer;

width: 108px;

height: 44px;

padding: 0;

background: 0 0;

background-color: rgba(0, 0, 0, 0);

background-color: #4e6ef2;

border-radius: 0 10px 10px 0;

font-size: 17px;

color: #fff;

box-shadow: none;

font-weight: 400;

border: none;

outline: 0;

}

</style>

<script type="text/javascript">

</script>

</head>

<body>

<form action="http://www.briup.com">

<input type="text" placeholder="请输入关键字" id="search"><input type="submit" id="btn" value="百度一下">

</form>

<script type="text/javascript">

// 阻止默认:点击提交按钮的时候不让提交

var form = document.forms[0];

form.onsubmit = function(event){

// 非IE9以下

event.preventDefault();

// IE9以下

window.event.returnValue = false;

}

</script>

</body>

</html>

  1. 事件代理

将事件处理函数绑定在当前元素的父元素上,当点击当前元素的时候,父元素上绑定的事件处理函数就可以执行。可以通过event.target来获取触发事件的对象:当前元素;通过event.currentTarget获取事件处理函数绑定的对象:父元素。

好处在于不用为每个元素绑定事件处理函数,只需要为这些元素的父元素绑定一次即可。

应用:动态表格

Vi 4-dytable.html:填补<script>代码

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>动态表格</title>

<style>

.table {

border-collapse: collapse;

width: 100%;

text-align: center;

}

.table td {

border: 1px solid #ccc;

line-height: 2em;

}

.table tr.current {

background-color: #ededed;

}

.none {

display: none;

}

.btn {

padding: .5em 1em;

border-radius: 3px;

background-color: teal;

color: #ededed;

cursor: pointer;

display: inline-block;

}

.btns {

margin-bottom: .5em;

}

</style>

</head>

<body>

<h1>学生信息管理</h1>

<!-- 注释节点 -->

<div class="btns">

<div id="btn_add" class="btn">添加</div>

       <div id="btn_delmore" class="btn">批量删除</div>

<div id="btn_import" class="btn">批量导入</div>

</div>

<table class="table">

<thead>

<tr>

<td width="80px">编号</td>

<td>姓名</td>

<td>性别</td>

<td>手机号</td>

<td width="100px">操作</td>

</tr>

</thead>

<tbody>

<tr class="none">

<td><input type="checkbox"></td>

<td>winnie</td>

<td>female</td>

<td>188*****888</td>

<td>

<a class="btn_del" href="#">删除</a>

<a href="#">修改</a>

</td>

</tr>

</tbody>

</table>

<script>

// 给添加按钮绑定事件

var btn_add = document.getElementById("btn_add");

var tbody = document.getElementsByTagName("tbody")[0];

btn_add.onclick = function(){

// 向tbody中追加一行数据

var newTr = tbody.firstElementChild.cloneNode(true);

newTr.setAttribute("class","");

        newTr.children[1].innerHTML+=Math.floor(Math.random()*100);

console.log(newTr);

tbody.appendChild(newTr);

}

// 给删除按钮绑定事件

tbody.onclick = function(event){

if(event.target.nodeName === "A" &&     

          event.target.getAttribute("class") === "btn_del" ){

var current_tr = event.target.parentNode.parentNode;

// 将tr从tbody中移除

tbody.removeChild(current_tr);

}

}

  // 给批量删除按钮绑定事件

  document.getElementById("btn_delmore").addEventListener("click",

    function(e){

      var inputs = document.querySelectorAll("input[type=checkbox]");

      console.log(inputs);

      for(var i in inputs){

       if(inputs[i].checked){

       tbody.removeChild(inputs[i].parentNode.parentNode);

       }

      }

    },false);

</script>

</body>

</html>

  1. 事件类型

事件类型

UI事件

load

当页面完全加载后在window上触发,当所有框架加载完时在框架集上触发,当图像加载完毕时在img元素上触发,当嵌入的内容加载完时在<object>触发        

unload

当页面完全卸载后在window上触发,当所有框架都卸载后在框架集上触发,当嵌入的内容卸载完毕后再<object>上触发,(firefox不支持)

select

当用户选择文本框(<input>,<textarea>)中的一个或多个字符时

change

在select的下拉列表的选中的选项更改的时候触发

resize

当浏览器窗口被调整到一个新的高度或者宽度时,会触发

scroll

当用户滚动带滚动条的元素中的内容时,在该元素上触发resize,scroll会在变化期间重复被激发,尽量保持代码简单

焦点事件

blur  元素失去焦点的时候触发

focus 元素获得焦点的时候触发,不支持冒泡

//IE支持

focusin 与focus等价,支持冒泡

focusout 与blur等价,支持冒泡

鼠标与滚轮事件

click   

点击主鼠标按钮或者按下回车按键的时候触发。只有在一个元素上相继发生mousedown,mouseup事件,才会触发click事件

dblclick

双击主鼠标按钮时触发.只有在一个元素上相继触发两次click时间才会触发dbclick事件

mousedown 任意鼠标按钮按下时触发

mouseup 释放鼠标按钮触发

mousemove 鼠标在元素内部移动的时候重发触发

mousewheel 滚轮事件

mouseenter 鼠标光标从元素外部首次移动到元素范围内激发,不冒泡。   【不支持子元素】

mouseleave 在位于元素上方的鼠标光标移动到元素范围之外时触发,不冒泡【不支持子元素】

mouseover 鼠标位于元素外部,将其首次移入另一个元素边界之内时触发   【支持子元素】

mouseout   在位于元素上方的鼠标光标移入到另外一个元素中。【支持子元素】在被选元素上与mouseleave效果相同

Vi dytable.html

动态表格dytable.html继续添加事件:

// 当光标移动的某一行上,为这一行添加背景

tbody.onmouseover = function(event){

var target = event.target;

if(target.nodeName === "TD"){

target.parentNode.className = "current"

}

}

tbody.onmouseout = function(event){

var target = event.target;

if(target.nodeName === "TD"){

target.parentNode.className = ""

}

}

键盘与文本事件

keydown 按下键盘任意键时触发,如果按住不放会重复触发此事件

keypress 按下键盘字符键时触发,如果按住不放会重复触发此事件

keyup 释放键盘上键时触发

当键盘事件发生时,event对象的keyCode属性中会包含一个代码与键盘上的特定键对应,对数字字母键,keyCode属性的值与ASCII码中对应的小写字母和数字编码相同

相关元素,event特殊属性

客户区坐标位置

clientX,clientY 事件发生时,鼠标指针在视口中的水平和垂直坐标位置

页面坐标位置

pageX,pageY 事件发生时,鼠标指针在页面本身而非视口的坐标,页面没有滚动的时候,pageX和pageY的值与clientX和clientY值相等

屏幕位置 screenX,screenY

修改键  

值为boolean类型,用来判断对应的按键是否被按下shiftKey,ctrlKey,altKey,metaKey

鼠标按钮

mousedown,mouseup,该事件的event对象中包含了button属性,表示按下或释放的按钮。

  0表示主鼠标按钮

  1表示中间的滚动按钮

  2表示次鼠标按钮

Vi 5-event-type.html:填补<script>代码

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>事件类型</title>

    <style type="text/css">

      form{

        margin: 0 auto;

        width: 700px;

        padding-top: 100px;

        border-right-style: none;

      }

      #search{

        height: 16px;

        width: 500px;

        padding: 12px 16px;

        font-size: 16px;

        margin: 0;

        vertical-align: top;

        outline: 0;

        box-shadow: none;

        border-radius: 10px 0 0 10px;

        border: 2px solid #c4c7ce;

        background: #fff;

        color: #222;

        overflow: hidden;

      }

      #btn{

        display: inline-block;

        cursor: pointer;

        width: 108px;

        height: 44px;

        padding: 0;

        background: 0 0;

        background-color: rgba(0, 0, 0, 0);

        background-color: #4e6ef2;

        border-radius: 0 10px 10px 0;

        font-size: 17px;

        color: #fff;

        box-shadow: none;

        font-weight: 400;

        border: none;

        outline: 0;

      }

    </style>

<script type="text/javascript">

// 当网页加载完毕后执行后面的匿名函数

window.onload = function(){

//按下回车键也能触发搜索功能

document.querySelector("input[type=text]").onkeyup =

        function(event){

if(event.keyCode === 13){

alert(this.value);

alert(event.target.value);

}

}

//输入内容时输入框的边框高亮颜色,移除鼠标没有颜色

// this.style.borderColor = "#4e6ef2";

var input = document.getElementsByTagName("input")[0];

input.onfocus = function(event){

event.target.style.borderColor = "#4e6ef2";

}

input.onblur = function(){

this.style.borderColor = "";

}

//阻止表单提交

document.forms[0].οnsubmit=function(e){

e.preventDefault();

}

}

</script>

</head>

<body>

<form action="http://www.briup.com">

      <input type="text" placeholder="请输入关键字" id="search"><input type="submit" id="btn" value="百度一下">

    </form>

    <script type="text/javascript">

    

    </script>

</body>

</html>

vi 6-form.html:填补<script>代码

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>表单</title>

<style>

form{

width: 400px;

margin: 0 auto;

padding-top: 100px;

}

input{

display:block;

width: 300px;

     height: 20px;

     line-height: 20px;

     padding: 10px;

     margin: 20px;

     border: 1px solid #dedede;

     font-size: 12px;

     color: #666;

     transition: .3s;

     font-family: Tahoma,Helvetica,"Microsoft Yahei","微软雅黑",Arial,STHeiti;

}

input#btn{

width: 320px;

height: 40px;

line-height: 20px;

background: #2e82ff;

border-radius: 2px;

font-size: 16px;

font-weight: 800;

border: 0;

color: #fff;

cursor: pointer;

}

</style>

</head>

<body>

<form action="/a.controller">

<input type="text" name="username" placeholder="用户名" autofocus="autofocus"/>

<input type="password" name="password" placeholder="密码" />

<input type="submit" id="btn" value="登  录">

</form>

<script>

var input_username =

            document.body.querySelector("input[name=username]");

var input_password =

            document.body.querySelector("input[name=password]");

/*

表单提交时进行验证:

用户名6个字母以上

密码6个数字以上

成功有提示,不进行表单默认提交

*/

document.forms[0].onsubmit = function(event){

var username = input_username.value;

var password = input_password.value;

if(/^[a-z]{6,}$/i.test(username)){

if(/^\d{6,}$/.test(password)){

alert("偷偷与后台联系,校验用户名密码");

// ......

                    // 登录成功、BOM操作跳转到首页

} else {

alert("密码不符合要求");

input_password.focus();

}

} else {

alert("用户名不符合要求");

input_username.focus();

}

// 阻止表单默认的提交行为

event.preventDefault();

}

/*

填写信息的时候动态验证,错误红色边框提示,正确边框颜色正常

*/

input_username.onkeyup = function(event){

var val = event.target.value;

if(! /[a-z]{6,}/.test(val)){

event.target.style.borderColor="#fc4343";

} else {

event.target.style.borderColor="#dedede";

}

}

</script>

</body>

</html>

vi 7-省市联动.html:填补<script>代码

<!DOCTYPE html>

<html lang="en">

<head>

  <meta charset="UTF-8">

  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <title>省市联动</title>

  <script>

    //数组,存放省市信息

    var arr = [

    {

      id: 101,

      name: '江苏省',

      cities: [

        {id: 1001,name: '南京'},

        {id: 1002,name: '苏州'},

        {id: 1003,name: '盐城'}

      ],

    },

    {

      id: 201,

      name: '山西省',

      cities: [

        {id: 2001,name: '太原'},

        {id: 2002,name: '大同'},

        {id: 2003,name: '运城'}

      ]

    },

    {

      id: 301,

      name: '山东省',

      cities: [

        {id: 3001,name: '烟台'},

        {id: 3002,name: '潍坊'},

        {id: 3003,name: '青岛'}

      ]

    }

    ];

    window.onload = function () {

      var province = document.getElementById('province');

      var city = document.getElementById('city');

      //遍历省份到省份下拉列表

      var str = '<option value="">请选择</option>';

      arr.forEach(function (item) {

        // item-->就是一个一个的省份对象

        str += '<option value="' + item.id + '">' + item.name + '</option>';

      });

      //将内容设置到下拉列表中

      province.innerHTML = str;

      //给province绑定事件

      province.onchange = function (event) {

        //this.value是select下拉列表的value值。是用户选中的option的value值。是选中省份的id值。将对应的城市设置到城市列表

        //console.log(this.value);

        var provinceId = this.value;

        if (provinceId) {

          //将对应的城市设置到城市列表

          //通过省份id查找城市,result是省份对象

          var result = arr.filter(function (item) {

            return item.id == provinceId;

          })[0];

          //result.cities是城市数组

          var str2 = '<option value="">请选择</option>';

          result.cities.forEach(function (item) {

            //item-->城市对象

            str2 += '<option value="' + item.id + '">' + item.name + '</option>';

          });

          city.innerHTML = str2;

          // 设置city下拉列表可用

          city.disabled = false;

        } else {

          //用户选择了‘请选择’  城市列表要清空

          city.innerHTML = '<option value="">请选择</option>';

          // 设置city下拉列表不可用

          city.disabled = true;

        }

      }

    }

  </script>

</head>

<body>

  <select id="province">

  </select>

  <select id="city" disabled>

    <option value="">请选择</option>

  </select>

</body>

</html>

vi dytable-jqury.html  ---- 不讲

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>jQuery</title>

<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>

<style>

.table {

border-collapse: collapse;

width: 100%;

text-align: center;

}

.table td {

border: 1px solid #ccc;

line-height: 2em;

}

.table tr.current {

background-color: #ededed;

}

.none {

display: none;

}

.btn {

padding: .5em 1em;

border-radius: 3px;

background-color: teal;

color: #ededed;

cursor: pointer;

display: inline-block;

}

.btns {

margin-bottom: .5em;

}

</style>

<script>

// 文档加载完毕后执行

$(function(){

// 为添加按钮绑定事件

$("#btn_add").on('click',function(){

$(`<tr>

<td><input type="checkbox"></td>

<td>`+Math.random()+`</td>

<td></td>

<td></td>

<td>

<a class="btn_del" href="#">删除</a>

<a href="#">修改</a>

</td>

</tr>

`).appendTo($('tbody'));

})

// 为删除按钮绑定事件

$("tbody").on("click",'a',function(){

if(event.target.className == "btn_del"){

$(this).parents("tr").remove();

}

})

$("tbody").on({

mouseover:function(){

this.className = "current"

},

mouseout:function(){

this.className = ""

}

},'tr')

})

</script>

</head>

<body>

<p>学生信息管理</p>

<!-- 注释节点 -->

<div class="btns">

<div id="btn_add" class="btn">添加</div>

<div id="btn_import" class="btn">批量导入</div>

</div>

<table class="table">

<thead>

<tr>

<td width="80px">编号</td>

<td>姓名</td>

<td>性别</td>

<td>手机号</td>

<td width="100px">操作</td>

</tr>

</thead>

<tbody>

</tbody>

</table>

</body>

</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值