摘要:常说的浏览器执行的包含两部分基础知识标准标准的内容包括事件绑定请求包括协议存储标准没有规定任何基础相关的东西。如果未经允许即可获取,那是浏览器同源策略出现了漏洞。
常说的JS(浏览器执行的JS)包含两部分
JS基础知识(ECMA 262 标准)
JS-Web-API(W3C 标准)
JS-Web-API的内容包括
DOM
BOM
事件绑定
ajax请求(包括http协议)
存储
W3C 标准没有规定任何JS基础相关的东西。W3C不管变量类型、原型、作用域和异步,只管定义于浏览器中JS操作页面的API和全局变量。
DOMDOM(Document Object Model) 文档对象模型
DOM可以理解为:浏览器把拿到的html代码,结构化成浏览器能识别并且JS可操作的一个模型
DOM 是哪种基本的数据结构?
树
DOM 操作的常用API有哪些?
获取节点,以及节点的 property 和 attribute
获取父节点,获取子节点
新增节点,移动节点,删除节点
DOM 节点的 attribute 和 property 有何区别?
attribute 是对html标签属性的操作BOM
property 是对js对象属性的操作
BOM(Browser Object Model) 浏览器对象模型
如何检测浏览器的类型?
// navigator var ua = navigator.userAgent; var isChrome = ua.indexOf("Chrome"); console.log(isChrome);
如何拆解url的各部分?
// location console.log(location.href); // 整个地址 console.log(location.protocol); // 协议 "http:" "https:" console.log(location.host); // 域名 "172.24.1.99" console.log(location.pathname); // path "/home/subject" console.log(location.search); // "?uid=99" console.log(location.hash); // "#mid=100"
如何获取当前设备的屏幕分辨率?
// screen console.log(screen.width); console.log(screen.height);
浏览器的后退和前进功能?
// history history.back(); // 后退 history.forward(); // 前进事件绑定
事件冒泡的过程?
事件冒泡是指,触发内层的事件之后,事件会按照DOM的树形结构像水泡一样不断的向上触发直至顶端。
示例:
激活
取消
取消
取消
取消
取消
function bindEvent(elem, type, fn) { elem.addEventListener(type, fn); } // 冒泡的应用 var p1 = document.getElementById("p1"); var body = document.body; bindEvent(p1, "click", function (e) { e.stopPropagation(); alert("激活"); }); bindEvent(body, "click", function (e) { alert("取消"); });
对于一个无限下拉加载图片的页面,如何给每个图片绑定事件?
// 使用代理 var div3 = document.getElementById("div3"); div3.addEventListener("click", function (e) { var target = e.target; if (target.nodeName === "A") { alert(target.innerHTML); } });
一个通用的事件监听函数(通用事件绑定)
function bindEvent(elem, type, selector, fn) { if (fn == null) { fn = selector; selector = null; } elem.addEventListener(type, function (e) { var target; if (selector) { target = e.target; if (target.matches(selector)) { fn.call(target, e); } } else { fn(e); } }); }
// 使用代理 var div1 = document.getElementById("div1"); bindEvent(div1, "click", "a", function (e){ console.log(this.innerHTML); }); // 不使用代理 var a1 = document.getElementById("a1"); bindEvent(a1, "click", function (e){ console.log(a1.innerHTML); });ajax
手动编写一个ajax,不依赖第三方库
var xhr = new XMLHttpRequest(); xhr.open("GET", "http://api.douban.com/v2/movie/top250", false); // false => 异步 xhr.onreadystatechange = function () { // 这里的函数异步执行 if (xhr.readyState === 4) { if (xhr.status === 200) { console.log(xhr.responseText); } } }; xhr.send(null);
状态码说明
readyState
0 - (未初始化) 还没有调用send()方法
1 - (载入) 已调用send()方法,正在发送请求
2 - (载入完成) send()方法执行完成,已经接收到全部响应内容
3 - (交互) 正在解析响应内容
4 - (完成) 响应内容解析完成,可以在客户端调用了
status http状态码跨域
2xx - 表示成功处理请求。如200
3xx - 需要重定向,浏览器直接跳转
4xx - 客户端请求错误,如404
5xx - 服务端错误
什么是跨域?
浏览器有同源策略,不允许ajax访问其他域的接口
跨域条件:协议、域名、端口,有一个不同就算跨域
跨域的几种实现方式?
前端:JSONP,vue proxyTable设置代理
服务器端:设置 http header
JSONP简单示例
可以跨域的标签?
用于打点统计,统计网站可能是其他域