JS-Web-API —— ECMAScript,BOM,DOM

一个完整的JavaScript实现应该由三部分组成 —— ECMAScript(核心),DOM(文档对象模型),BOM(浏览器对象模型)。

ECMAScript


由ECMA-262定义的ECMAScript与Web浏览器没有依赖关系。ECMAScript定义的只是这门语言的基础。

我们常见的Web浏览器只是ECMAScript实现可能的宿主环境之一。我们学习的这个是浏览器端的JS,而nodejs中就没有BOM的定义,因为nodejs不是跑在浏览器中的,而是服务端的。


BOM


BOM,是 Browser Object Model 的缩写,即浏览器对象模型。而这个BOM是用来做什么的,是提供与浏览器交互的方法和接口(即访问和操作浏览器)。

  • BOM的核心对象window,表示浏览器的一个实例
    • 在浏览器中,window对象有着双重角色,既是通过JavaScript访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象。
  • 提供浏览器详细信息的navigator对象
  • 提供浏览器所加载页面的详细信息的location对象
  • 提供用户显示器分辨率详细信息的screen对象
  • 保存用户上网的历史记录的history对象


location对象


location对象的所有属性

  • hash:返回URL中的hash(#号后跟零个或多个字符),如果URL中不包含散列,则返回空字符串
  • host:返回服务器名称和端口号(如果有)
  • hostname: 返回不带端口号的服务器名称
  • href:返回当前加载页面的完整URL。而location对象的toString()方法也返回这个值
  • pathname:返回URL中的目录和(或)文件名
  • port:返回URL中指定的端口号。如果URL中不包含端口号,则该属性返回空字符串
  • protocol:返回页面使用的协议。通常是http:https:
  • search:返回URL的查询字符串。这个字符串以问号开头.

一个小例子

 // 地址:https://www.baidu.com:8080/page/?tn=22073068_9_oem_dg#test

location.href       // https://www.baidu.com:8080/page/?tn=22073068_9_oem_dg#test
location.protocol   // https:
location.host       // www.baidu.com:8080
location.hostname   // www.baidu.com
location.port       // 8080
location.pathname   // /page/
location.search     // ?tn=22073068_9_oem_dg
location.hash       // #test

面试题:提取url中查询参数

function getQueryStringArgs () {
    // 取得查询字符串并去掉开头的问号
    var qs = location.search.length > 0 ? location.search.slice(1) : '';

    // 保存数据的对象
    var args = {};

    // 保存每一项
    var items = qs.length ? qs.split('&') : [];
    var item = null;
    var key = null;
    var value = null;

    // 逐个将每一项添加到args对象中
    for (var i = 0, len = items.length; i < len; i++) {
        item = items[i].split('=');
        key = decodeURIComponent(item[0]);
        value = decodeURIComponent(item[1]);

        if (key.length > 0) {
            args[key] = value;
        }
    }

    // 返回args对象
    return args;
}



可以用来识别客户端浏览器(和浏览器的一些插件)。这在工作开发中很常见。现在浏览器很多很杂,我们开发时难免要为某一个特别一点的浏览器做一些特别的处理,这个时候,识别浏览器就很重要了。特别是移动端,ios和android差别不是一般的大,所以这个时候可以使用navigator对象去识别。

一个小例子

var ua  = navigator.userAgent;  
var isChrome = ua.indexOf('Chrome');  
console.log(isChrome); // 打印匹配到的字符的位置
// 下面的是直接打印navigator.userAgent的值
// Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36

var isIos = ua.indexOf('iPhone');
console.log(isIos); // 打印匹配到的字符的位置
// 下面的是直接打印navigator.userAgent的值
// Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1


screen对象


screen对象时包含浏览器窗口外部的显示器的信息。这个在PC端开发没什么大用出。但是在移动端的开发就很有用了。具体的去看文档吧——Screen MDN


history对象


history对象保存着用户上网的历史记录,从窗口被打开的那一刻算起。

  • 使用history.go()方法可以在用户的历史记录中任意跳转。这个方法接收一个参数,表示向后或者向前跳转的页面数的一个整数值。负数表示向后跳转,整数表示向前跳转。也可以给该方法传递一个字符串参数,此时浏览器会跳转到历史记录中包含该字符串的第一个位置——可能后退,也可能前进,具体要看哪个位置最近。
// 后退一页
history.go(-1);

// 前进一页
history.go(1);

// 跳转到最近的 https://www.baidu.com 页面
history.go('https://www.baidu.com');
  • 可以使用两个简写方法back()forward()来代替。顾名思义,可以模仿浏览器中的“后退”“前进”按钮。
// 后退一页
history.back();

// 前进一页
history.forward();


DOM


DOM,是 Document Object Model 的缩写,即文档对象模型。是针对XML但经过扩展用于HTML的应用程序编程接口(API,Application Programming Interface)。DOM把整个页面映射为一个多层节点结构(一种数据结构)。

DOM核心规定的是如何映射基于XML的文档结构,以便简化对文档中任意部分的访问和操作。


DOM操作的一些常见API

  • 获取DOM节点
    • document.getElementById:根据ID查找元素,大小写敏感
    • document.getElementsByTagName:根据标签查找元素, * 表示查询所有标签,返回一个 HTMLCollection
    • document.getElementsByClassName:根据类名查找元素,多个类名用空格分隔,返回一个 HTMLCollection
    • document.getElementsByName:根据元素的name属性查找,返回一个 NodeList
    • document.querySelector:返回单个Node,如果匹配到多个结果,只返回第一个
    • document.querySelectorAll:返回一个 NodeList
  • 获取和操作节点的property(属性)和attribute(特性)
    • setAttribute:element.setAttribute(name, value); 其中name是特性名,value是特性值。如果元素不包含该特性,则会创建该特性并赋值。
    • getAttribute:var value = element.getAttribute('id'); 返回指定的特性名相对应的特性值。如果不存在,则返回 null 。
    • 获取property(举一些例子)
      • 获取class:var className = div.className;
      • 获取align:var align = div.align;
      • 获取id:var id = div.id;
    • 赋值property(举一些例子)
      • 赋值class:div.className = 'sidebar';
      • 赋值align:div.align = 'center';
  • 获取父节点和子节点
    • 获取父节点:Node.parentNode,返回当前节点的父节点
    • 获取子节点
      • Node.childNodes,返回当前节点的所有子节点
      • Node.firstChild,返回当前节点的第一个子节点
      • Node.lastChild,返回当前节点的最后一个子节点
    • 新增节点:Node.appendChild(node),向节点添加最后一个子节点
    • 删除节点:Node.removeChild(node),删除节点,在要删除节点的父节点上操作


浏览器渲染页面的过程

查看详情

  • 根据 HTML 结构生成 DOM Tree
  • 根据 CSS 生成 CSSOM
  • 将 DOM 和 CSSOM 整合形成 Render Tree
  • 根据 RenderTree 开始渲染和展示
  • 遇到

你可能感兴趣的:(JS-Web-API —— ECMAScript,BOM,DOM)