JavaScript高级

简介: 本文系统讲解前端DOM、BOM、事件机制与Ajax核心知识:涵盖DOM树结构、常用操作API、属性与样式的区别,BOM浏览器检测与URL解析,事件绑定、冒泡流程及代理应用,原生Ajax与JSONP跨域原理,并对比cookie、localStorage与sessionStorage的特性与限制,助力深入理解Web开发基础。

2.1 DOM操作
2.1.1 DOM的本质是什么?

/
<?xml version="1.0" encoding="UTF-8"> // 告诉浏览器以哪一种类型进行解析


/

<!DOCTYPE html>                                      // 以html类型进行解析文档内容
<html>
    <body>

    </body>
</html>

Copy
2.1.2 DOM操作的常用API有哪些?
节点查找API

  1. document.getElementById :根据ID查找元素,大小写敏感,如果有多个结果,只返回第一个;
  2. document.getElementsByClassName :根据类名查找元素,多个类名用空格分隔,返回一个 HTMLCollection 。注意兼容性为IE9+(含)。另外,不仅仅是document,其它元素也支持 getElementsByClassName 方法;
  3. document.getElementsByTagName :根据标签查找元素, * 表示查询所有标签,返回一个 HTMLCollection 。
  4. document.getElementsByName :根据元素的name属性查找,返回一个 NodeList 。
  5. document.querySelector :返回单个Node,IE8+(含),如果匹配到多个结果,只返回第一个。
  6. document.querySelectorAll :返回一个 NodeList ,IE8+(含)。
  7. document.forms :获取当前页面所有form,返回一个 HTMLCollection ;
    节点创建API
  8. createElement创建元素
  9. createTextNode创建文本节点
  10. cloneNode 克隆一个节点
  11. createDocumentFragment
    节点修改API
  12. appendChild
  13. insertBefore
  14. insertAdjacentHTML
  15. Element.insertAdjacentElement()
  16. removeChild
  17. replaceChild
    节点关系API
    ● 1、父关系API
    parentNode :每个节点都有一个parentNode属性,它表示元素的父节点。Element的父节点可能是Element,Document或DocumentFragment; parentElement :返回元素的父元素节点,与parentNode的区别在于,其父节点必须是一个Element元素,如果不是,则返回null;
    ● 2、子关系API
    children :返回一个实时的 HTMLCollection ,子节点都是Element,IE9以下浏览器不支持;
    childNodes :返回一个实时的 NodeList ,表示元素的子节点列表,注意子节点可能包含文本节点、注释节点等;
    firstChild :返回第一个子节点,不存在返回null,与之相对应的还有一个 firstElementChild ;
    lastChild :返回最后一个子节点,不存在返回null,与之相对应的还有一个 lastElementChild ;
    ● 3、兄弟关系型API
    previousSibling :节点的前一个节点,如果不存在则返回null。注意有可能拿到的节点是文本节点或注释节点,与预期的不符,要进行处理一下。
    nextSibling :节点的后一个节点,如果不存在则返回null。注意有可能拿到的节点是文本节点,与预期的不符,要进行处理一下。
    previousElementSibling :返回前一个元素节点,前一个节点必须是Element,注意IE9以下浏览器不支持。
    nextElementSibling :返回后一个元素节点,后一个节点必须是Element,注意IE9以下浏览器不支持。
    元素属性型API
    1、setAttribute 给元素设置属性: 2、getAttribute 3、hasAttribute
    样式操作API(面试考点)
    ● 1、直接修改元素的样式
    elem.style.color = 'red';
    elem.style.setProperty('font-size', '16px');
    elem.style.removeProperty('color');
    Copy
    ● 2、动态添加样式规则
    var style = document.createElement('style');
    style.innerHTML = 'body{color:red} #top:hover{background-color: red;color: white;}';
    document.head.appendChild(style);
    Copy
    ● 3、classList获取样式属性
    Note
    了解dom节点样式(classList)的remove, add, toggle, contains, replace等方法的使用。
    ● 4、window.getComputedStyle 通过 element.sytle.xxx 只能获取到内联样式,借助 window.getComputedStyle 可以获取应用到元素上的所有样式,IE8或更低版本不支持此方法。
    var style = window.getComputedStyle(element[, pseudoElt]);
    Copy
    2.1.3 DOM节点的attr和proerty的区别
    // proprty------>>>获取nodeName和nodeType(property实际上就是JS对象的一个属性)如:text : 3(#text), p : 1(p)
    console.log(pList[0].nodeName); // p
    console.log(pList[0].nodeType); // 1
    // attribute------>>> 获取一个HTML标签的属性信息(设置和修改)
    var a = document.getElementsByTagName('a')[0];
    console.log(a.getAttribute('data-origin'));
    console.log(a.getAttribute("href_name")); // 可以给一个HTML标签设置任意的属性名称,无论这个属性内部是否存在
    a. setAttribute('sex', 'male')
    // 区别:
    // (JS对象&HTML标签)property实际上是一个普通JS对象本身的基本属性,但是attribute实际上是一个HTML标签上面的属性信息
    Copy
    Note
    区别:(JS对象&HTML标签)property实际上是一个普通JS对象本身的基本属性,但是attribute实际上是一个HTML标签上面的属性信息
    2.2 BOM操作
    2.2.1 如何检测浏览器的类型?
    var ua = navigator.userAgent;
    var isChrome = ua.indexOf('Chrome');
    console.log('is Chrome?', isChrome > 0, navigator.userAgent);
    console.log('电脑屏幕大小:', screen.width, screen.height)
    Copy
    2.2.2 如何拆解URL的各个部分?
    // location
    console.log(location.href); // 完整的url地址,http://localhost:8080/JS-Professional/begin/02-%E5%9F%BA%E7%A1%80%E8%BF%9B%E9%98%B6/01-%E4%BB%8E%E5%9F%BA%E7%A1%80%E5%88%B0%E8%BF%9B%E9%98%B6.html?_ijt=i8ctmkc87dvh03tdaf51rn5v1i
    console.log(location.protocol) // http/https
    console.log(location.host, location.hostname) // www.52tech.tech
    console.log(location.pathname); // host之后的全部内容,JS-Professional/begin/02-%E5%9F%BA%E7%A1%80%E8%BF%9B%E9%98%B6/01-%E4%BB%8E%E5%9F%BA%E7%A1%80%E5%88%B0%E8%BF%9B%E9%98%B6.html
    console.log(location.search); // search就是?之后的全部内容,?_ijt=i8ctmkc87dvh03tdaf51rn5v1i(包括?)
    console.log(location.hash); // #后面的内容(包括#)
    Copy
    2.3 事件操作
    2.3.1 编写一个通用的事件监听函数
    function bindEvent(ele, type, selector, fn){

     if (fn == null) {
         fn = selector;
         selector = null;
     }
    
     // addEventListener 的最后一个参数默认是false, 表示的是事件冒泡,自下向上去捕获事件,true:表示事件捕获,表示事件自外向里的方式
     ele.addEventListener(type, function(e){
         if (selector) {
             // 使用的是代理的方式的话
             if (e.target.matches(selector)){            // 这里需要去判断当前点击的那个对象是不是我点击的那个对象
                 fn.call(e.target, e);
             }
         } else {
             // 不使用代理的话
             fn(e);
         }
     });
    

    }

// 这里表示对这个div1 内部的所有的a标签使用事件冒泡
bindEvent(document.getElementById('div4'), 'click', 'p', function (e) {
    console.log(this.innerHTML + 'hahaah')
})

版本2:
/**

 * 实现一个通用的事件绑定函数(代码简洁,减少了浏览器的占用)
 * @param element
 * @param type
 * @param selector
 * @param fn
 */
function bindEvent(element, type, selector, fn) {
    // if (fn === null || fn === undefined)        // 这里可以直接优化为fn == null
    if (fn == null){
        // 只有3个参数的话
        fn = selector;
        selector = null;
    }

    element.addEventListener(type, function (e) {
        var target;
        // 如果selector有的话,说明此事element就是一个代理
        if (selector) {
            target = e.target;
            // 如果当前的target满足这个选择器的话
            // 如果元素被指定的选择器字符串选择,Element.matches()  方法返回true; 否则返回false。
            // document.getElementById('div1').matches('div')    true
            // matches里面的参数实际上是一个HTML标签:a, p, div …………, 内容也是不区分大小写的,有点类似于nodeName 或者nodeType 这样的判断
            if (target.matches(selector)){
                // 修改this的指向
                fn.call(target, e);
            }
        }else {
            fn(e);
        }
    });
}

Copy
2.3.2 描述事件冒泡的流程
Note
"DOM2级事件”规定的事件流包含三个阶段:事件捕获阶段,处于目标阶段和事件冒泡阶段。首先发生的是事件捕获,然后是实际的目标接收到事件,最后阶段是冒泡阶段。
● 事件冒泡: 按照DOM树形结构向上冒泡(p --- >>> div --- >>> body --- >>> document),
● 事件捕获 (document—>—>—>的顺序进行传播的)
2.3.3 对于一个无线下拉图片的页面,如何给每一个图片绑定一个事件
// 代理(div3里面的所有a标签都需要进行事件的监听)
var div3 = document.getElementById('div3');
bindEvent(div3, 'click', function (e) {
e.preventDefault();
e.stopPropagation()
// 可以获取真实触发的那个元素
var target = e.target;
console.log(target.nodeName, target.nodeType); // 每一种页面标签实际上都有一个自己专属的nodeName
// 这里的目的主要是用于过滤,只处理a标签的事件处理
if ('A' === target.nodeName) {
// 如果当前点击的a标签就是自己
alert(target.innerHTML)
}
})
Copy
2.4 Ajax操作
2.4.1 手动编写一个ajax,不依赖第三方库
2.4.2 跨域的几种实现方式以及底层的实现原理

  1. 服务器端的使用:response.setHeader(Access-Control-Allow-Origin, "http://www.baidu.com, http://www.52tech.tech")允许跨域
  2. 使用JSONP
    2.4.3 JSONP的实现原理
    Note
    跨域:浏览器有同源策略,不允许ajax访问其他域接口
    ● 跨域条件:协议、域名、端口,有一个不同就是跨域
    可以跨域加载资源的3个标签:
    , ,
相关文章
|
9月前
|
JavaScript 前端开发 测试技术
Angular框架
本文深入解析Angular核心概念,涵盖ng-show与ng-if的性能差异、$rootScope与$scope的关系、表达式机制、Digest周期、定时器与监听器的取消方法。同时探讨Directive的restrict属性、作用域绑定方式及模块间通信策略。此外,介绍性能优化技巧、单元测试实践、Angular 2生命周期钩子、路由机制、事件发射器、AOT编译、安全防护与Shadow DOM等高级主题,全面提升开发技能。
|
9月前
|
缓存 监控 JavaScript
前端性能监控指标
前端性能指标包括白屏时间、首屏时间、DOM可操作时间和页面总加载时间。可通过注入代码或`window.performance` API进行量化统计,后者基于浏览器标准接口,提供精确的网络、解析与渲染各阶段耗时数据,助力性能优化。
|
9月前
|
域名解析 缓存 边缘计算
CDN加速
CDN(内容分发网络)通过在全球部署节点服务器,将源站内容缓存至边缘节点,用户访问时由最近节点提供服务。基于DNS重定向与智能调度,实现就近加速,降低延迟,提升访问速度与网站可用性,有效应对高并发、带宽不足等问题。
|
9月前
|
存储 JavaScript 前端开发
XSS攻击
XSS(跨站脚本攻击)是攻击者通过网站漏洞注入恶意脚本,用户访问时执行,窃取数据、Cookie或劫持会话。主要分反射型和存储型,危害大。防御措施包括输入转义、白名单过滤及CSP内容安全策略,有效防止脚本注入。
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
Chap01. 认识AI
本文介绍AI核心概念与大模型开发原理,涵盖人工智能发展历程及Transformer神经网络的关键作用。通过注意力机制,Transformer实现对文本、图像、音频的高效处理,成为GPT等大模型的基础。大语言模型(LLM)利用其持续生成能力,逐字预测输出,实现连贯对话。
|
9月前
|
Java API
用数组实现队列/栈
使用数组实现栈时,可将动态数组尾部作为栈顶,利用其O(1)增删特性。Java中可用ArrayList或自定义MyArrayList实现push、pop、peek等操作。若以头部为栈顶,则需环形数组(如CycleArray)支持O(1)首部操作。同理,结合CycleArray的addLast与removeFirst,亦可高效实现队列。
|
9月前
|
算法 索引
双指针技巧秒杀七道数组题目
本文介绍双指针技巧在数组和链表中的应用,涵盖快慢指针与左右指针。通过力扣多道经典题目,如删除重复项、两数之和等,详解如何用快慢指针实现原地修改,提升算法效率。内容覆盖数组与链表去重、链表环检测等常见问题,适合巩固基础算法思维。(239字)
|
9月前
|
NoSQL 关系型数据库 MongoDB
mongDB
本节带你快速入门MongoDB非关系型数据库,无需过多技术基础,45分钟掌握核心知识。涵盖概念、部署、命令、索引及实战演练,侧重动手实践,助力高效上手。欢迎纠错与转载,请注明出处。
|
9月前
|
存储 JavaScript 前端开发
javascript基础
本课程系统讲解JavaScript核心知识:变量类型、原型链、作用域、闭包、异步机制等,涵盖值类型与引用类型、this指向、call/apply/bind区别、事件循环及常见内置函数,助力前端进阶。
|
9月前
|
JavaScript 前端开发 算法
React框架
React 是一个用于构建用户界面的 JavaScript 库,核心优势包括:使用虚拟 DOM 提升性能、JSX 增强代码可读性、支持服务端渲染以优化 SEO 和首屏加载、易于测试,并且仅关注视图层,可与其他框架集成。它通过高效的 Diff 算法和调和过程实现最小化重渲染,支持组件化开发与高阶组件复用逻辑,结合 Redux 可实现状态集中管理,广泛应用于大型单页应用开发。

热门文章

最新文章