DOM总结

1.什么是DOM?
        专门操作网页内容的一套函数和对象

        DOM还是一个标准,由W3C制定

        广义JS=ECMAScipt+DOM+BOM

        核心语法 +操作网页内容+访问浏览器软件(与网页无关)

        要想操作网页内容,为页面添加交互效果,其实只能用DOM函数和对象

        包括:5件事 增删改查 事件绑定

2.DOM树

        在内存中,集中保存一个网页中所有内容的树形结构

        突出上下级包含关系

        如何:

                1.当浏览器读取带一个.html文件时,会先在内存中创建一个document,最为整个树的根 对象。

                2.扫描节点,加载到对应节点位置

        任何内容都会变成节点对象:<>元素节点 “”文本节点 id属性节点,轻易访问不到 document根节点

3.查找元素

        1.不需要查找,就可直接获得

        document.documentElement <html>

        document.head <head>

        document.body <body>

        2.树上的节点之间有各种各样的关系,可以互相访问到

        节点树:任何内容都会变成节点对象 包括空格等 根节点document

        父子关系:

        节点.parentNode 获得当前节点的父节点

        父节点.childNodes 获得当前父节点下的所有直接子节点的类数组对象。

        父节点.firstChild 获得当前父节点下的第一个直接子节点

        父节点.lastChild 获得当前父节点下最后一个直接子节点

        兄弟关系:

        节点.previousSibling 获得当前节点平级的前一个相邻的兄弟节点

        节点.nextSibling下一个兄弟节点

        元素树:

                 仅包含元素节点的树结构 根元素为html

                元素树不是一个新树,而是原来节点树中添加了仅指向元素节点的新属性而形成一棵子树结构。

        父子关系:

        元素.parentElement/parentNode(因为特殊的标签才能做父元素)获得当前元素的父元素

        父元素.children获得当前父元素下的所有直接子元素的类数组对象。

        父元素.firstElementChild 获得当前父元素下的第一个直接子元素

        父元素.lastElementChild 获得当前父元素下最后一个直接子元素

        兄弟关系:

       元素.previousElementSibling 获得当前元素平级的前一个相邻的兄弟元素

        元素.nextElementSibling下一个兄弟元素

        nodeName标签名

        类数组对象可以用length

        3.按HTML特征查找

                4种:

                         1.按id属性查找

                                var 元素=document.getElementById("id")

                                在整个页面中查找id为指定名称的一个元素

                                返回值:如果找到,返回一个元素对象

                                                如果没找到,返回null

                                强调:只能用document调用。不能在随意父元素上调用

                        2.按标签名查找

                                 var 类数组对象=父元素.getElementsByTagName("标签名")

                                 在指定父元素下查找所有标签名为指定标签名的后代(并不是直接子元素,而是所有后代元素)元素

                                返回值:如果找到,返回多个元素组成的类数组对象

                                               如果没找到,返回空的类数组对象 [].length=0

                                强调:可在任意父元素下查找,通常指定在某个父元素下查找后代,是为了减少查找范围,提高查找效率。

                       3.按class属性查找

                                var 类数组对象=父元素.getElementsByClassName("class名")

                                在指定父元素下查找class属性(包含)指定类名的所有元素(不是只包含直接子元素中的)

                                 返回值:如果找到,返回多个元素组成的类数组对象

                                               如果没找到,返回空的类数组对象 [].length=0

                                 强调:可在任意父元素下查找,通常指定在某个父元素下查找后代,是为了减少查找范围,提高查找效率。

                       4.按name属性查找

                                 var 类数组对象=document.getElementsByName("name名")

                                 返回值:如果找到,返回多个元素组成的类数组对象

                                               如果没找到,返回空的类数组对象 [].length=0

                                强调:只能用document调用

                                何时:在表单中查找表单元素时

                        5.当查找条件特别复杂时:用选择器当条件查找元素:2个函数:

                                1.查找一个符合条件的元素:

                                var 元素=父元素.querySelector("任意复杂的选择器")

                                        在指定父元素下查找符合选择器要求的一个元素

                                        返回值:如果找到,返回一个元素对象

                                                       如果没找到,返回-1

                                2.查找多个符合条件的元素:

                                  var 类数组对象=父元素.querySelectorAll("任意复杂的选择器")

                                  在指定父元素下查找符合选择器要求的多个元素组成的类数组对象

                                 返回值:如果找到,返回类数组对象

                                               如果没找到,返回空集合

                               强调:1.可以以任意父元素调用来限制查找的范围

                                        2.()的选择器参数,不用每次都写完整,只要以.前的父元素为起点开始写就行!

                                        3.不仅查找直接子元素,且在所有后代中查找符合条件的

                        6.DOM优化之一:

                                 如果只有一个条件就可以找到想要的元素时

                                尽量使用getElementsByXXX()函数查找---效率高

                                只有条件复杂时,才选择按选择器查找--效率低 要通过 绘图引擎  css解析器js再查找

4.控制台有个习惯,相邻的多个相同的输出结果,只显示一个,在左侧圆圈中标出重复的次数。

5.DOM操作的标准步骤

                查找触发事件的元素

                给元素绑定事件处理函数

                查找修改的元素

                        警告:凡是从页面上获得内容,都是字符串

                修改元素

                        警告:从页面上获得的值,都是按值传递下来的字符串副本,修改变量,元素中的内容不会自动变化,所以修改后,都要放回去。

                        如:span.innerHTML=n;

        什么是事件:浏览器自动触发的或用户手动触发的页面元素状态的改变

        事件处理:通过元素的事件属性和事件处理函数

        事件属性:每个元素上都有一批on开头的属性,比如:onclick onmouseover...但是,这些事件属性的默认值都为null,也就是说,即使发生什么事件,也什么都不做。

        事件处理函数:当事件发生时,希望自动执行的函数。

        将事件处理函数,提前赋值给元素的事件属性保存起来

        只要在事件处理函数中想获得当前正在单击的按钮,最可靠的办法就是this,一定不要用全局变量

        for(var btn of btns){

           btn.οnclick=function(){

           this.style.backgroundColor="red";

        }

6.修改

        3样:

        内容:

                1.获取或修改原始HTML片段:元素.innerHTML (原始html代码)

                2.获取或修改纯文本内容:元素.textCotent (解析后样子的html)

                        去掉了内嵌的标签

                        将特殊符号翻译成正文

                以上两个获得的都是双标记中,开始标记和结束标记之间的内容

                3.表单元素,没有结束标记 所以也就没有innerHTML,textCotent

                        获取或设置表单元素的内容:表单元素.value

        属性:

                3种

                1.HTML标准属性

                HTML标准中规定的那些字符串类型的属性,比如id,title,name,value

               获取或修改:2种方式

                        1.早期的核心DOM函数:4个

                        var 属性值=元素.getAttribute("属性名") 获取属性值

                        元素.setAttibute("属性名","新值")

                        var bool=hasAttribute("属性名")

                        元素.removeAttribute("属性名")

                        2.后来的HTML DOM函数

                        是在旧版基础上,对部分常用函数和常用对象提供的简化版函数

                        做的第一个简化:每个元素对象中都提前预置好了所有HTML标准属性,只不过,值暂时为“”。此后在操作只需要

                        元素.属性名

                        强调:只要修改标准属性,值必须是字符串,如果给的不是字符串,DOM会自动转为字符串。

                        判断是否包含指定属性:元素.属性名!=="",说明包含。因为默认值为""

                        移除属性:=""

                        特例:js中不能用.class,因为class是js的关键字,所以,凡是操作html中的class属性,一律更名为className。

                2.状态属性

                        比如:disabled checked selected mutiple

                        只能用.访问,比如:btn.diabled=true

                        css中有一组状态伪类::disabled :checked :selected :not(:checked)

                3.自定义扩展属性

                        程序员自发添加的属性

                        何时:在客户端临时缓存数据

                                   代替其他选择器,用来选择触发事件的元素,为元素绑定事件

                        自定义行业规范data-自定义属性名=“值”

                        不能用.访问

                        如:data-属性名

                        可以用 元素.dataset.属性名

        样式:

                修改内联:

                每个元素都有一个style属性,代表html中开始标签中的style属性元素

                元素的style属性又包含了所有css样式属性

                修改元素对象的style属性中的css样式属性,等效于直接修改html中开始标签的style="",要加单位。

                强调:所有带-的css属性,一律去横线,变驼峰命名

                计算后的样式:var style=getComputedStyle(元素) 获得指定元素计算后的完整样式

                                        style.fontsize只读的

7.添加

        3步:

        1.创建一个空元素

        var a = document.createElement("a");

        只能用document调用

        2.为空元素添加关键属性和内容

        a.href=""

        a.innerHTML=""

        3.将空元素挂载到DOM树

                3种

                1.挂在一个父元素下的所有子元素末尾追加

                        父元素.appendChild(新元素)

                2.插入到一个父元素下的某个子元素之前

                        父元素.insertBefore(新元素,现有元素)

                3.替换父元素下一个现有的旧元素

                        父元素.replaceChild(新元素,旧元素)

8.删除

        父元素.removeChild(子元素)     

9.DOM常用对象

        image对象

        Select/Option

                代表select元素

                属性:.selectedIndex

        Table/...

        From/表单元素             

<think>好的,用户想知道如何通过JavaScript获取B视频的真实播放URL。首先,我需要回忆一下B视频加载机制。B可能和西瓜视频类似,使用音视频分离或者动态加载资源。根据引用[1]中的例子,西瓜视频是通过JavaScript在控制台执行命令来获取视频和音频地址的,可能B也有类似的结构。 接下来,用户提到想用JavaScript,所以可能需要分析B页面加载后的数据对象。通常这类网会把视频信息存储在全局变量中,比如window对象下的某个属性。需要找到存储视频资源的路径。比如在引用[1]中,西瓜视频用的是window._SSR_HYDRATED_DATA,B可能也有类似的变量。 然后,考虑B视频播放器结构。B使用HTML5播放器的话,视频资源可能通过blob URL或者动态加载的m3u8、mpd文件。如果是blob,直接获取可能较难,但如果是动态加载的,可能在网络请求中找到视频地址。这时候可能需要用开发者工具查看XHR请求,找到视频的真实URL。不过用户希望用JavaScript直接获取,所以可能需要从页面内的对象中提取。 另外,引用[3]中的例子用了Image对象获取宽高,可能类似的方法可以应用到视频元素上。比如,查找页面中的video元素,然后获取其src属性。但B的video标签可能使用的是blob URL,这时候直接获取src可能不奏效,因为blob URL是临时的。 然后想到B的API结构。可能需要找到视频的初始化数据,比如通过页面中的script标签查找__INITIAL_STATE__这样的变量,里面可能包含视频的详细信息,包括不同清晰度的URL。例如,在页面源码中搜索__playinfo__或者__INITIAL_STATE__,这些对象里可能有视频和音频的地址。 另外,引用[4]中提到了通过API获取真实URL的方法,但用户这里可能需要绕过API直接通过前端JavaScript获取。可能需要分析B页面加载时的网络请求,找到获取视频地址的接口,然后模拟这个请求。但跨域问题可能存在,因此可能需要使用浏览器扩展或者后端代理。 综合这些,可能的步骤是:1. 打开B视频页面,打开开发者工具,查看网络请求,找到视频地址的来源。2. 在控制台中尝试访问全局变量,如window.__playinfo,看看是否有视频数据。3. 解析该对象,提取出视频和音频的URL。例如,可能像window.__playinfo__.data.dash.video[0].baseUrl这样的路径。4. 处理可能的加密参数,比如添加Referer头或者sign参数,以确保能直接访问URL。 需要注意的是,B可能会对视频地址进行防盗链处理,直接获取的URL可能需要携带特定的请求头才能访问。此外,B的接口可能会变化,所以这种方法可能需要定期更新。最后,用户可能需要使用浏览器控制台执行这些脚本,或者开发浏览器插件来实现自动化。</think>要获取B视频的真实播放地址,可以通过分析页面加载的全局对象或网络请求实现。以下是具体方法及注意事项: ### 一、通过全局对象获取 1. **打开开发者工具**:在B视频播放页面按F12打开控制台 2. **查找视频数据对象**:B视频信息通常存储在`window.__playinfo__`对象中 ```javascript // 获取视频数据对象 const playInfo = window.__playinfo__; // 提取最高清晰度视频地址 const videoUrl = playInfo.data.dash.video[0].baseUrl; // 提取音频地址 const audioUrl = playInfo.data.dash.audio[0].baseUrl; ``` ### 二、通过网络请求分析 1. **过滤m4s请求**:在开发者工具的Network标签中过滤`m4s`类型请求 2. **复制真实地址**:找到`video.m4s`和`audio.m4s`的请求URL,形如: ``` https://upos-sz-mirrorali.bilivideo.com/xxxxx/xxxxx/video.m4s?expires=xxx&sign=xxx ``` ### 、注意事项 1. **防盗链机制**:直接获取的URL需要携带`Referer: https://www.bilibili.com`请求头才能访问[^2] 2. **动态签名**:URL中的`sign`参数具有时效性(通常有效30分钟),过期后需重新获取[^4] 3. **分辨率选择**:`window.__playinfo__.data.dash.video`数组包含不同分辨率选项,索引0为最高清 ### 四、完整示例代码 ```javascript function getBiliVideoUrl() { if (!window.__playinfo__) { console.error('未找到视频数据对象'); return null; } const videos = window.__playinfo__.data.dash.video; const audios = window.__playinfo__.data.dash.audio; return { video: videos.sort((a,b) => b.bandwidth - a.bandwidth)[0].baseUrl, audio: audios.sort((a,b) => b.bandwidth - a.bandwidth)[0].baseUrl }; } // 使用示例 const urls = getBiliVideoUrl(); console.log('视频地址:', urls.video); console.log('音频地址:', urls.audio); ``` ### 五、扩展方法 对于需要持久化获取的场景,建议通过B开放API获取视频信息: ```javascript // 需自行申请API权限 fetch(`https://api.bilibili.com/x/player/playurl?cid=视频CID&bvid=视频BVID&qn=112`) .then(res => res.json()) .then(data => console.log(data.data.durl[0].url)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值