DOM、BOM(一)

目录

Web API

API概念

JavaScript的组成

DOM

DOM概念

获取页面中的元素

根据id获取元素

根据标签名获取元素

根据标签的name属性获取元素

 根据标签的class属性获取元素

根据选择器来获取元素

注册事件及应用

注册事件步骤:

案例之点击按钮切换图片

属性操作

非表单元素的属性

案例二点击按钮显示和隐藏div同时按钮文字改变

案例三点击图片有放大效果,并显示对应的图片文字

innerHTML、innerText、textContent

兼容性处理

表单元素属性

案例一之设置文本框的值并输出以|为分割线的各文本框的值

 案例二检测用户名密码是否符合字数,不满足则改变文本框颜色以示警告

案例三之点击设置按钮随机选择下拉框的一个选项案例四之搜索文本框在输入内容时,提示字消失

案例四之搜索文本框在输入内容时,提示字消失

案例五之全选与反选

自定义属性操作

案例六之模拟DOM(文档树)结构

节点

案例点击菜单后高亮显示所点选项并显示选项下的所有主体内容?

动态创建元素

如案例:点击按钮生成列表

动态创建表格

案例选择水果

 


目标:

  • 掌握API和Web API的概念
  • 掌握常见浏览器提供的API的调用方式
  • 能通过Web API开发常见的页面交互功能
  • 能够利用搜索引擎解决问题

Web API

API概念

API(Application Programming Interface,应用程序编程接口),即API=接口,它定义了一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。通俗的讲:API就是一个工具

  • 任何开发语言都有自己的API
  • API的特征输入和输出(I/O)   如: var max = Math.max(9,8,26);  那么max就是输出,(9,8,26)就是输入
  • API的使用方法(console.log()) 指控制台上可输出

JavaScript的组成

由三部分组成:ECMAScript、DOM、BOM

  • ECMAScript,指由ECMA组织制定了一套规范的语法和语句,它定义了脚本语言的所有属性、方法和对象。其他语言可以实现ECMAScript来作为功能的基准,JavaScript就是遵守了这一基准
  • BOM。broswer object model:浏览器对象模型。比如:弹出新的浏览器窗口、关闭浏览器窗口大小、提供用户屏幕分辨率详细信息的屏幕对象
  • DOM。document object model:文档对象类型。  DOM将把整个页面规划成由节点层级构成的文档。如html、head、title、body等

DOM

DOM概念

简单的说就是一个接口一个API。详细的说DOM是文档对象模型,是W3C组织推荐的处理可扩展标记语言的标准编程接口,它是一种与平台和语言无关的应用程序接口(API),它可以动态的访问程序的脚本,更新其内容、结构和www文档的风格(目前HTML和XML文档是通过说明部分来定义的)。文档可以进一步被处理,处理的结果可以加入到当前的页面。DOM是一种基于树的API文档。它要求在处理过程中整个文档都表示在存储器中。

 DOM又称文档树模型,是一个对象。其下树枝有:

  • 文档:一个网页可以称为一个文档
  • 节点:网页中所有内容都是节点(标签、属性、文本、注释等)
  • 元素:网页中的标签
  • 属性:标签的属性

文档里面所有的东西都是一个对象,都有属性和方法

DOM经常进行的操作

  • 获取元素,也称获取对象,因为元素就是对象
  • 对元素进行操作(设置其属性或调用其方法)
  • 动态创建元素
  • 事件(什么时候做相应的操作)

获取页面中的元素

为什么要获取页面中的元素?

例如:我们想要操作页面上的某部分(显示/隐式,动画),需要先获取到该部分对应的元素,才进行后续的操作。

根据id获取元素

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

innerHTML、innerText、textContent

获取开始标签和结束标签之间的内容,所有标签都适用,如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其实也可以用于个标签自带的属性,但是不够方便

案例六之模拟DOM(文档树)结构

在HTML里其实存在文本节点和注释节点,如1 2

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 节点类型

  1. 元素节点、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;

}

案例点击菜单后高亮显示所点选项并显示选项下的所有主体内容?

  • 首页
  • ...(省略n个li标签及a标签)...


                    
                    

你可能感兴趣的:(前端大集合)