目录
Web API
API概念
JavaScript的组成
DOM
DOM概念
获取页面中的元素
根据id获取元素
根据标签名获取元素
根据标签的name属性获取元素
根据标签的class属性获取元素
根据选择器来获取元素
注册事件及应用
注册事件步骤:
案例之点击按钮切换图片
属性操作
非表单元素的属性
案例二点击按钮显示和隐藏div同时按钮文字改变
案例三点击图片有放大效果,并显示对应的图片文字
innerHTML、innerText、textContent
兼容性处理
表单元素属性
案例一之设置文本框的值并输出以|为分割线的各文本框的值
案例二检测用户名密码是否符合字数,不满足则改变文本框颜色以示警告
案例三之点击设置按钮随机选择下拉框的一个选项案例四之搜索文本框在输入内容时,提示字消失
案例四之搜索文本框在输入内容时,提示字消失
案例五之全选与反选
自定义属性操作
案例六之模拟DOM(文档树)结构
节点
案例点击菜单后高亮显示所点选项并显示选项下的所有主体内容?
动态创建元素
如案例:点击按钮生成列表
动态创建表格
案例选择水果
目标:
API(Application Programming Interface,应用程序编程接口),即API=接口,它定义了一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。通俗的讲:API就是一个工具
- 任何开发语言都有自己的API
- API的特征输入和输出(I/O) 如: var max = Math.max(9,8,26); 那么max就是输出,(9,8,26)就是输入
- API的使用方法(console.log()) 指控制台上可输出
由三部分组成:ECMAScript、DOM、BOM
简单的说就是一个接口一个API。详细的说DOM是文档对象模型,是W3C组织推荐的处理可扩展标记语言的标准编程接口,它是一种与平台和语言无关的应用程序接口(API),它可以动态的访问程序的脚本,更新其内容、结构和www文档的风格(目前HTML和XML文档是通过说明部分来定义的)。文档可以进一步被处理,处理的结果可以加入到当前的页面。DOM是一种基于树的API文档。它要求在处理过程中整个文档都表示在存储器中。
DOM又称文档树模型,是一个对象。其下树枝有:
文档里面所有的东西都是一个对象,都有属性和方法
DOM经常进行的操作
为什么要获取页面中的元素?
例如:我们想要操作页面上的某部分(显示/隐式,动画),需要先获取到该部分对应的元素,才进行后续的操作。
var div = document.getElementById(‘main’); console.log(div); // 打印出来的div类型为HTMLDivElement,对象都是有类型的 console.dir(div); //.dir为打印对象,即打印出来的div为一个对象,可展开查看属性和方法
document是一个文档对象
get 获取 Element 元素 By 根据 Id 标示
如果页面上没有对应id,此时返回null
注意一:文档是从上到下执行的,若
//style里的css样式省略 //body下的第一个div id=’imagegallery’,存放四个a标签,且每个a标签各添加一个
, //并且a标签的href地址指向对应的img图片路径,title为各自img的title; //body下还有一个img标签用来作占位符,用于显示点击图片放大后的图片; //然后body下还有一个p标签用来显示放大后图片对应的title
获取开始标签和结束标签之间的内容,所有标签都适用,如div、span、p等
innerHTML: 获取内容的时候,如果内容中有标签,就会把标签也获取到,即原封不动的把内容获取到
innerText: 获取内容的时候,如果内容中有标签,就会把标签过滤调,即会把前后的换行和空白都去掉
两个都可以用来设置标签之间的内容: 如 box.innerHTML = ‘’; 指清空该标签的内容
innerText和textContent作用一样,都是用来获取内部文本,只是浏览器兼容问题。谷歌、新版的火狐和新版的IE两个都支持,旧版的火狐只支持textContent,旧版的IE只支持innerText
兼容性处理
//如何知道浏览器是否支持元素的某个属性?可以用输出元素的属性来查看 var box = document.getElementById(‘box’); //当属性不存在的时候返回的是undefined,存在的时候返回的是该属性的类型 console.log(typeof box.id); //处理innerText的兼容性问题 function getInnerText(element) { //判断当前浏览器是否支持元素的innerText属性,即支持innerText适用element.innerText获取内容, //如果不支持innerText则使用element.textContent获取内容 if (typeof element.innerText === ‘string’) { return element.innerText; }else { return element.textContent; } } var box = document.getInnerText(‘box’); console.log(gerInnerText(box));
value:用于大部分表单元素的内容的获取(option除外)
type:可以获取input标签的类型(输入框和复选框等)
disabled:禁用属性,如禁用文本框输入等
checked:复选框选中属性
selected:下拉菜单选中属性
当html中标签属性的属性值只有一个的时候,DOM中对应的元素的属性值是布尔类型,只有true和false,如以上disabled、checked和selected属性要特别注意
//body标签里有9个文本框,一个type为button其余八个input的type为text //1.当页面加载完毕,给所有的文本框赋值 var inputs = document.getElementsByTagName(‘input’); //获取所有input的标签 var array = []; for (var i = 0; i < inputs.length; i++) { //遍历标签将按钮的input去除 var input = inputs[i]; //根据type属性,判断是否是文本框 if (input.type === ‘text’) { input.value = i; } } //2.当点击按钮的时候,获取所有的文本框的值,并适用|分割输出的值 var btn = document.getElementById(‘btn’); btn.onclik = function () { var array = []; for (var i =0; i < inputs.length; i++) { var input = inputs[i]; //判断是否是文本框 if (input.type === ‘text’) { array.push(input.value); } } console.log(array.join(‘|’)); }
//body标签里有三个input,分别为用户名文本框、密码文本框、登陆按钮的input var btnLogin = document.getElementById(‘btnLogin’); btnLogin.onclick = function () { //检测用户名是否是3-6位,密码是否是6-8位 var txtUserName = document.getElementById(‘txtUserName’); var txtUserPassword = document.getElementById(‘txtUserPassword’); //检测用户名是否是3-6位 ,value为文本框的内容属性,类型为string,所以有length if(txtUserName.value.length < 3 || txtUserName.value.length > 6) { txtUserName.className = ‘bg’; //这里若满足则要跳转到class为.bg的样式 return; }else { txtUserName.className = ‘’; //class名本身就为空,此处只是去掉文本框的颜色 return; } //检测密码是否是6-8位 if(txtUserPassword.value.length < 6 || txtUserPassword.value.length > 8) { txtUserPassword.className = ‘bg’; //这里若满足则要跳转到class为.bg的样式 return; }else { txtUserPassword.className = ‘’; //class名本身就为空,此处只是去掉文本框的颜色 return; } console.log(‘执行登陆’); }
//body里有一个select标签,该标签下有五个option标签,value值分别为1-5 //1.给按钮注册事件 var btnSet = document.getElementById(‘btnSet’); btnSet.onclick = function () { //2.获取下拉框中所有的option var selCities = document.getElementById(‘selCities’); var options = selCities.getElementByTagName(‘option’); //3.随机生成索引 var randomIndex = parseInt(Math.random() * option.length); //4.根据索引获取option,并让option选中 var option = options[randomIndex]; option.selected = ture; }
//body下有两个input,分别为文本框和按钮 //当文本框获得焦点,如果文本框里的内容是 请输入搜索关键字,清空文本框,并且让字体变为黑色 var txtSearch = document.getElementById(‘ txtSearch’); //获得焦点也是一个事件,就像鼠标点击onclick一样,此处为focus txtSearch.onfocus = function () { if (this.value === ‘请输入搜索关键字’) { this.value = ‘’; //获得焦点时清空文本框的提示字 this.className = ‘black’; //设置样式为.black的样式 } } //当文本框失去焦点,如果文本框里的内容为空,还原文本框里的文字,并且让字体变为灰色 //失去焦点的事件为blur txtSearch.onblur = function () { //判断文本框中的内容为空可用if(this.value===’’),但是下面的方法更常用 if(this.value.length === 0 || this.value ===’请输入搜索关键字’) { this.value = ‘请输入搜索关键字’; this.className = ‘gray’; //调用样式为.gray的样式 } }
//获取父checkbox,注册点击事件 var j_tb = document.getElementById(‘j_tb’); var inputs = j_tb.getElementByTagName(‘input’); var j_cbAll = document.getElementById(‘j_cbA’); //父checkbox j_cbAll.onclick = function () { //找到所有子checkbox,让这些checkbox的状态与父checkbox的状态保持一致 for(var i = 0; i
除了各标签自带的一些属性外,我们也可以给标签自定义一些属性,如:
我是一个自定义属性的div但是要获得这些自定义的属性值时时要用getAttribute( );
首先还是要先获取id
然后console.log(No1.getAttribute(‘age’));
设置自定义属性用setAtrribute():
No1.setAttribute(‘age’, ‘23’); 两个参数,分别操作属性和值
移除自定义属性要用removeAtrribute():
No1.removeAttribute(‘age’);
上面的attribute其实也可以用于个标签自带的属性,但是不够方便
在HTML里其实存在文本节点和注释节点,如
3
45, body下其实有五个节点,可以用console.dir(body的id)查看body的节点。
模拟DOM对象下html、head、body、span层次,首先创建一些列具有相同属性的对象,即创建构造函数
function Node(options) { //传入的参数为一个对象/函数 if (options.className) { //因为在DOM里如果一个属性没有属性值,默认为null而不是undefined,所有我们要用if来判断一下 this.className = options.className; }else { this.className = ‘’; } //但是用if来判断那么多的属性会过于麻烦,所有换成了下面逻辑或||来判断 this.className = options.className || ‘’; //有这个属性则设置为className,没有则默认为 null this.id = options.id || ‘’; this.nodeName = options.nodeName || ‘’;//节点的名称,是的话则为标签的名称 this.nodeType = options.nodeType || ‘1’;//节点的类型,元素节点为1,属性2,文本3 this.nodeValue = options.nodeValue || null;//节点的值,如果是元素节点,始终未null this.children = options.children || []; //即用来创建元素的 层次关系,如html、body } var html = new Node( { //创建html节点 nodeName: ‘html’; }); var head = new Node({ nodeName: ‘head’; }); html.children.push(head); //设置html中的字节的head var body = new Node({ nodeName: ‘body’; }); html.children.push(body); //设置html中的子节点body console.dir(html); //在运行的时候,浏览器内部维护了一颗DOM树,即自身创建了树模型 //在这颗树里我们要深刻理解DOM;了解节点的相关属性如nodeName、nodeType、nodeValue; //了解节点的层次关系
父子结构:parentNode 父节点(只有一个) childNodes 子节点(有很多个,空白也是节点叫text节点,注释comment也是节点)
children 子元素(注意:注释comment也是一个子元素)
有没有能够直接获取子元素的属性? children,获取到的是所有的子元素
nodeType 节点类型
- 元素节点、2.属性节点、3.文本节点(即空白区域)
nodeName 节点的名称(标签名称) nodeValue 节点值 (元素节点的nodeValue始终是null)
如何获取第一个子标签和最后一个子标签?子元素呢?
如 box.firstChild 为获取第一个子节点,但空白区域也是一个text节点,所以不可取。
box.firstElementChild 获取第一个子元素,但有兼容性问题,IE9以后才支持,以前的可能会包含注释comment子元素
同理有lastChild、lastElementChild
处理关于element兼容性问题示例:
function getFirstElementChild(element){
var node,nodes = element.childNodes,i = 0;
while (node = nodes[i++]) {
if (node.nodeType === 1){
return node;
}
}
return null;
}
案例点击菜单后高亮显示所点选项并显示选项下的所有主体内容?
你可能感兴趣的:(前端大集合)