python:从入门到精通_HTML5精通:片段

python:从入门到精通

有几种类型的DOM节点。 有Document , Element , Text等等,它们也实现了广义Node 。 DocumentFragment节点是比较有趣的一种,但到现在为止还不那么常用。 基本上,它是用于节点的特殊容器。

在许多DOM算法中,对DocumentFragment节点进行了特殊处理。 在本文中,我们将看到一些旨在与DocumentFragment结合使用的API方法。 我们还将看到,节点容器的概念对于其他现代Web技术(例如<template>元素或整个影子DOM API)非常重要。 但是在开始之前,我们应该快速了解片段解析,它与DocumentFragment没有直接关系。

片段解析

HTML5解析器不仅仅可以用来解析完整的文档。 它也可以用于解析文档的一部分,称为片段。 设置诸如innerHTML或outerHTML属性将触发片段解析。 片段解析的工作方式与常规解析类似,但有一些例外。 最大的区别是需要上下文根。

被解析的片段可能被放置为某些元素的子元素,该元素可能具有也可能没有其他祖先。 该信息对于确定当前的解析模式至关重要,后者取决于当前树的层次结构。 此外,由于安全原因,片段分析将不会触发脚本执行。

因此,我们可能会使用以下代码,但不会看到其他输出。 脚本执行不会被触发。

var foo = document.querySelector('#foo');
foo.innerHTML = 'Hallo World! 

使用片段解析是减少DOM操作的一种简单方法。 除了专门创建,更改和附加节点(这些节点都涉及上下文切换以及DOM操作)之外,我们仅致力于构造一个字符串,然后由解析器对其进行评估和处理。 因此,我们只有一个或几个DOM操作。 这种方法的缺点是我们需要解析器和更多JavaScript工作。 关键问题是:什么更耗时? 各种DOM操作是否比所有必需JavaScript字符串操作都要昂贵,还是相反?

显然,这取决于情况。 对于特定的情况,Grgur Grisogono使用几种方法进行了性能比较。 它还高度依赖于浏览器,尤其是JavaScript引擎的速度。 较高的值意味着更多的操作,因此是期望的。

尽管现在浏览器速度更快,但相对行为仍然有效。 这应该激励我们寻找更好的解决方案,并更多地了解DocumentFragment 。

汇总DOM操作

DocumentFragment节点背后的想法很简单: Node对象的容器。 附加DocumentFragment ,将其扩展为仅附加容器的内容,而不附加容器本身。 当请求DocumentFragment的深层副本时,其内容也会被克隆。 容器本身将永远不会附加到另一个节点,即使它必须具有所有者(即创建该片段的document如此。

创建DocumentFragment工作方式如下:

var fragment = document.createDocumentFragment();

从这一点开始, fragment行为与其他任何DOM父节点完全一样。 我们可以附加节点,删除节点或访问现有节点。 提供了使用querySelector和querySelectorAll运行CSS查询的选项。 最重要的是,如前所述,我们可以使用cloneNode()克隆节点。

用HTML制作模板

如果文档片段太大,为什么不使用它们进行模板制作呢? 好的, DocumentFragment无法用纯HTML构造,因为该概念仅通过DOM API公开。 因此,只能在JavaScript中创建容器。 这大大降低了使用效益。 目前,最流行的方法仍然是面向文本的。 我们首先将模板放在伪<script>元素中。 该元素是伪的,因为type属性将设置为无效的mime-type。 这样,将不会执行任何操作,但是元素的文本内容将使用不同的解析规则。

上图显示了标记化状态。 script标签的解析规则是特殊的,因为解析将以特殊的标记化状态进行。 HTML知道五个标记化状态,但是第五个标记化状态Plaintext对我们而言并不重要。 Rawtext状态与Script非常相似,它为我们提供了三种状态来说明。

让我们考虑一个例子。 我们使用三个元素分别代表其余三个州。 和其他许多元素一样, <div>元素也位于解析字符( PCData )体制中。 <textarea>使用RCData ,例如<title>元素。 更像原始字符的是Rawtext状态,可以使用<style>元素表示该状态。 在原始文本和脚本状态之间进行转义有细微的差异。 但是,在下面的讨论中,我们将它们视为等同。

var example = '
me & you > them'; var types = ["div", "textarea", "script"]; types.forEach(function (type) { var foo = document.createElement(type); foo.innerHTML = example; console.log(foo.innerHTML); })

也许我们会期望输出是相同的,但即使知道存在差异:谁知道它们的外观?


me & you > them <br>me & you > them
me & you > them

只有最后一个与输入字符串完全匹配。 因此,我们有明显的赢家。 因此,这解释了为什么<script>元素如此流行以传输模板片段。 但是,这是有趣的部分开始的地方。 大多数模板引擎将根据字符串创建一个函数,该函数采用一个模型并为视图吐出生成的DOM节点列表。 有些可能已经绑定了值,具体取决于模型。 重要的部分是节点生成,至少在第一次迭代中,它主要是面向字符串的。

W3C意识到了这种情况,并通过引入<template>元素做出了React。 该元素可以理解为DocumentFragment载体。 由于DocumentFragment不直接参与DOM树,因此它通过属性附加到节点。 使用元素就像下面的示例一样简单:


   {alt}
  
    
{comment}

在DOM中,我们看不到该元素的任何子元素。 所有子项都已附加到所包含的DocumentFragment实例,可以通过content属性对其进行访问。

让我们得到这些孩子:

var fragment = document.querySelector('template').content;
var img = fragment.querySelector('img');
var comments = fragment.querySelectorAll('.comment');

文本已插入大括号中,以表明我们打算将其视为占位符。 没有自动填充它们的系统。

让我们创建一个函数为我们返回实例化的节点。 我们为上一个示例定制代码。

function createNodes (model) {
	var fragment = document.querySelector('template').content;
	var instance = fragment.clone(true);//deep cloning!
	var img = instance.querySelector('img');
	img.setAttribute('src', model.src);
	img.setAttribute('alt', model.alt);
	var div = instance.querySelector('div');
	div.textContent = model.comment;
	return instance;
}

通过遍历元素和子节点的所有属性,替换与属性和文本节点中的预定义结构匹配的文本,可以实现通用化。 最后,实例化的节点可以附加到以下位置:

var nodes = createNodes({ 
	src: 'image.png',
	alt: 'Image',
	comment: 'Great!'
});
document.querySelector('#comments').appendChild(nodes);

<template>元素具有三个重要方面:

  1. 它将触发不同的解析模式。 因此,它不仅仅是一些元素。
  2. 它的子级不会附加到DOM,而是附加到可通过content访问的DocumentFragment 。
  3. 在使用之前,我们必须对片段进行深拷贝。

最后,文档片段非常有用,甚至可以用来使网站的一小部分重用和更加灵活。

影子DOM

近年来,对Web组件的需求激增。 许多前端框架都试图模仿一种Web组件结构。 但是,即使确实可以使用polyfill,也需要具有真正的DOM支持。 Polymer项目是出色的Polyfill的一个很好的例子,展示了可以使用Web组件完成的工作。

影子DOM允许我们做的就是将DocumentFragment附加到任何Element 。 存在三个约束:

  1. DocumentFragment必须是特殊的—它必须是ShadowRoot 。
  2. 每个Element只能有一个ShadowRoot ,或者没有。
  3. ShadowRoot的内容与原始DOM分开。

这些约束会带来后果。

将ShadowRoot附加到元素的一个结果是不再渲染该元素—而是渲染了影子DOM中的内容。 但是,内容是有范围的,这意味着它可以遵循自己的样式规则。 整个事件处理过程也有所不同。

结果,引入了另一个新概念:插槽。 我们可以在影子DOM中定义插槽,该插槽中填充有来自元素的节点,该节点托管ShadowRoot 。 显然,创建带有阴影DOM的自定义元素是一个好主意。 整个自定义元素规范都是对此的回应。

那么我们如何使用影子DOM? 让我们做一些JavaScript来揭示API。 我们从以下HTML片段开始:


   
My header title
Some very important content

至此,一切正常。 这是需要我们JavaScript技能的地方:

var context = document.querySelector('#shadow-dialog');
var root = context.attachShadow({ mode: 'open' });
var headerSlot = document.createElement('slot');
headerSlot.name = 'header';
root.appendChild(headerSlot);
var contentSlot = document.createElement('slot');
contentSlot.name = 'content';
root.appendChild(contentSlot);

到目前为止,我们还没有收获太多。 我们从一些元素开始,然后又回来了。 有效地,组成的DOM树如下所示:


   
My header title
Some very important content

默认情况下,影子根的所有节点都分配给一个默认插槽(如果有)。 默认插槽没有name 。 那么我们获得了什么? 我们集成了一些透明的元素,恭喜! 但是更重要的是,我们的原始标记不必更改即可更改组成的DOM树的结构,属性或布局。 我们只需要更改将哪些元素附加到影子根即可,仅此而已。 我们实质上对前端进行了模块化。

现在有些人可能认为我们已经在服务器端使用了类似的技术。 当然,某些客户端框架也尝试聚合这样的代码。 但是,存在一些关键差异。 首先,我们拥有浏览器的全面支持(如果已实现)。 其次,沙箱简化了使用该模块的特定规则进行渲染的过程-与现有CSS规则没有冲突。 本质上可以保证该模块可以在每个页面上运行。 无需进行调试即可查看CSS规则在何处相互干扰。 最后,我们产生了更好的代码。 它易于生成且运输成本低廉,并且我们可以期待更高的性能。

结论

DocumentFragment是一个有用的帮助程序,它能够大幅减少DOM操作的数量。 它也是现代技术的重要基石,尤其是在Web组件领域。 它已经产生了两种非常出色的技术: <template>元素和ShadowRoot 。 前者大大简化了模板,为我们提供了不错的性能提速和一种传输预生成节点的优雅方式,而后者是Web组件的基础。

真的值得了解DocumentFragment吗? 可能还没有。 如果我们正在编写框架或库,那么绝对是必须的,但是大多数用户会很高兴在自己喜欢的前端库(例如jQuery,Angular等)中已经使用了它。 他们都在一个或多个位置使用DocumentFragment来克服潜在的性能问题。 虚拟DOM是否比真实DOM快? 是的,当然可以,但是如果不使用DocumentFragment聚合多个操作,它可能不会那么快。

翻译自: https://webdesign.tutsplus.com/tutorials/html5-mastery-fragments--cms-24842

python:从入门到精通

HTML5Lib库解析与应用实例教程 本文还有配套的精品资源,点击获取 简介:HTML5Lib是一个优秀的Python库,专注于解析HTML和XML文档,尤其是对不规范的HTML片段提供良好的解析和转换成标准DOM结构的能力。该库遵循HTML5的解析规则,能够处理包括数据分析、网页抓取以及提升浏览器兼容性等多方面任务。版本号为0.999999的"html5lib-0.999999.tar.gz"提供了稳定版本的... 阅读详情

相关推荐

TMS320F28388D 学习笔记2 高精度PWM (HRPWM)

HRPWM的学习记录。

whyorwhnt的专栏 9534

使用模板

Web框架把我们从WSGI中拯救出来了。现在,我们只需要不断地编写函数,带上URL,就可以继续Web App的开发了。 但是,Web App不仅仅是处理逻辑,展示给用户的页面也非常重要。在函数中返回一个包含HTML的字符串,简单的页面还可以,但是,想想新浪首页的6000多行的HTML,你确信能在Python的字符串中正确地写出来么?反正我是做不到。

cabbage2008的专栏 883

Dofbot机械臂从零部署笔记(1)——ROS之创建URDF模型、配置Moveit和MotionPlanning

Dofbot机械臂从零部署笔记(1)——ROS之创建URDF模型、配置Moveit和MotionPlanning

takedachia的博客 8697

Python爬虫时获取标签内全部文本内容的四种方式

    前文提到了Python爬虫框架之一的——Scrapy框架安装和相关命令的简单使用,熟悉了起码的实用流程。今天我们进行一些细节上的总结。如题,在我们要获取目标文本所在的标签时,通常有几种方法,下面我们挨个举例说明各种用法的使用:     以百度贴吧小说吧中的一篇小说为例,我们开始进行爬虫举例,该小说链接为:https://tieba.baidu.com/p/5702862812?pn=1 ...

qq_35866413的博客 9万+

从频谱入手搞定ESD:手把手教你用示波器和频谱仪分析静电干扰(以Type-C接口为例)

本文详细介绍了如何利用示波器和频谱仪分析Type-C接口的ESD干扰问题。通过频谱特性分析、耦合路径诊断和实战测试,提供了一套完整的ESD防护方案,包括三级防护设计和器件选型建议,帮助工程师有效解决静电放电导致的系统故障。

weixin_42662293的博客 346

vue2 - 最新详细实现高德地图绘制动态热力图详细教程,在某区域或城市地图上做“热力图层“展示人流量、旅游人口密度、热量图、全国地区地理热力图,利用颜色的深浅表示密度或强度等场景(详细示例代码教程)

vue2,nuxt2,高德地图,热力图,绘制热力图层,报错,卡顿,出不来怎么办,无法关闭,怎么解决这个问题,出错,城市名称,城市某个街道,城区,省份,市区,县城,乡镇,村,各省份的热力图,交通流量,人口流量,密度,旅游出行,人口数量,颜色介绍,深浅代表,人流量,vue2使用高德地图实现某个区域热力图,vue高德地图api加载热力图及关闭,接收热力图数据并渲染热力图,关掉热力图,Vue使用高德API制作热力图,热力图加载不出来,电子围栏围住热力图,vue2中使用高德地图渲染热力图组件,高德地图使用热力图详细教

✅ 精选推荐文章 4201

python的web开发

1、python

design321的专栏 842

23、关联挖掘到相关性分析及约束关联挖掘详解

本文详细解析了从关联挖掘到相关性分析的发展过程,以及基于约束的关联挖掘方法。文章介绍了传统支持-置信度框架的局限性,并引入Lift、χ2、All Confidence和Cosine等度量来评估规则的相关性。同时探讨了多种规则约束在数据挖掘中的应用机制及其优化效果,旨在提高挖掘效率和规则质量。最后结合实际案例说明如何综合运用相关性度量与规则约束以满足业务需求,并展望了数据挖掘技术的未来发展。

aa123的博客 103

Python爬虫从入门到精通——爬虫实战:爬取猫眼电影排行Top100

本文为实战篇,需提前学习[《Python爬虫从入门到精通》基本库requests的使用和正则表达式的内容。我们需要抓取的目标为猫眼电影-榜单-TOP100榜,其地址为:[https://maoyan.com/board/4](https://maoyan.com/board/4)。我们希望爬取各个电影的排名、名称、主演、上映时间、上映地区等信息。最后保存为一张Excel表格。

冯·诺依曼 4万+

华为OD机考2025C卷 - 高矮个子排队(Java & Python& JS & C++ & C)

华为OD机考2025C卷 - 高矮个子排队。提供在线OJ刷题。Java、C++、Python、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 1682

室内温度控制仿真(Simulink+PLC)

本篇博客将会带领大家解读Simulink自带的仿真模型(Thermal Model of a House),之后再讨论PLC控制系统控制环境温度的一些经验方法

RXXW_Dor的博客 3462

如何使用html5lib-python:Python中最强大的HTML解析库完整指南

想要在Python中高效地解析HTML文档吗?🤔 html5lib-python是一个完全符合标准的纯Python库,专门用于解析和序列化HTML文档及片段。这个强大的**HTML解析库**基于WHATWG HTML规范设计,与主流现代网络浏览器保持高度兼容。 ## 什么是html5lib-python? **html5lib-python**是一个开源的Python库,它提供了完整的HTM

gitblog_00086的博客 626

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

python selenium 播放视频_selenium+Python(处理html5的视频播放)

Webdriver支持在指定的浏览器测试HTML5,另外可以用JavaScript来测试这些功能,这样就可以在任何浏览器上测试HTML5多数浏览器使用控件来播放视频,但是不同浏览器需要使用不同的插件,HTML5定义了一个新元素video,指定了一个标准的方式来嵌入电影片段下面以http://videojs.com(外部网站,内地访问会比较慢)的视频播放为例:#coding=utf-8from se...

weixin_39626690的博客 1326

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

5分钟提升编码效率:VSCodium代码片段完全指南

VSCodium作为一款开源的代码编辑器,提供了强大的代码片段功能,可以帮助开发者减少重复输入,显著提升编码效率。本文将详细介绍如何在VSCodium中创建、管理和使用代码片段,让你在5分钟内掌握这一高效编码技巧。 ## VSCodium简介 VSCodium是Visual Studio Code的开源版本,它去除了微软的品牌标识、遥测和许可限制,同时保留了VS Code的核心功能和扩展性。其

gitblog_00528的博客 467

如何在Python中集成html5-parser?3分钟快速上手教程

html5-parser是一个基于C语言开发的快速HTML5解析库,专为Python设计。它提供了高效的HTML文档解析能力,比传统的纯Python解析器如html5lib快数倍,是处理大型HTML文档的理想选择。 ## 📦 一键安装步骤 安装html5-parser非常简单,只需使用pip命令即可完成: ```bash pip install html5-parser ``` 如果需要

gitblog_00874的博客 1048

极速HTML5解析引擎html5-parser:基于C语言的Python解析利器全面解析

html5-parser是一款基于C语言开发的HTML5解析引擎,专为Python打造,实现了W3C HTML5解析规范。它采用Google Gumbo解析器的变体,将解析后的Gumbo树转换为lxml树,解析速度可达html5lib的30倍,为Python开发者提供了极速高效的HTML解析体验。 ## 🌟 核心优势:为何选择html5-parser? ### ⚡ 惊人性能:30倍解析速度提

gitblog_00897的博客 452

快速HTML5解析指南:使用Python高性能HTML5-Parser库

在Web开发、数据抓取和内容分析中,HTML解析是每个Python开发者都会遇到的基础任务。传统的Python HTML解析库如html5lib虽然功能完善,但性能往往成为瓶颈。今天我要推荐的**HTML5-Parser**库,正是为了解决这一痛点而生!🚀 **HTML5-Parser**是一个基于C语言开发的高速HTML5解析库,专门为Python设计。它完全遵循HTML5标准,解析速度比纯

gitblog_00055的博客 642

2025全新指南:gumbo-parser入门到精通,构建高性能HTML解析器

你还在为HTML解析效率低、兼容性差而烦恼吗?gumbo-parser作为一款纯C99编写的HTML5解析库,以其高性能和高兼容性解决这些痛点。本文将带你从入门到精通,掌握gumbo-parser的使用,读完你将能够:理解gumbo-parser的核心优势、完成环境搭建、掌握基本API使用、实现实际案例以及了解高级应用技巧。 ## 一、gumbo-parser核心优势解析 gumbo-pars...

gitblog_00484的博客 825

html5lib-python 使用教程

`html5lib` 是一个纯 Python 编写的库,用于解析和序列化 HTML 文档和片段。它旨在符合 WHATWG HTML 规范,并被所有主流网页浏览器所实现。`html5lib` 的主要目标是提供一个标准化的 HTML 解析器,适用于各种需要处理 HTML 的场景。 ## 2. 项目快速启动 ### 安装 首先,使用 `pip` 安装 `html5lib`: ```bash pi...

gitblog_00016的博客 633

html5lib python_Python中的html5lib和lxml解析器

html5lib是用于解析HTML的纯Python库。它被设计为符合WHATWG HTML规范,所有主要的Web浏览器都实现了该规范。它可以解析HTML文档的几乎所有元素,将其分解为不同的标记和片段,可以针对各种用例将其过滤掉。它以与主要浏览器相同的方式解析文本。它还可以处理损坏的HTML标记并添加一些必要的标记以完成结构。它也是用纯python代码编写的。lxml也是一个类似的解析器,但是由XM...

weixin_29079743的博客 1164

HTML5从入门到精通:网页开发基础与语义化标签详解

超文本标记语言(HTML)是构建万维网内容的基础技术,它通过标签系统定义网页的结构与语义。其核心原理在于使用预定义的标签元素来描述内容类型,如标题、段落、图像和链接,从而为浏览器提供渲染页面的蓝图。这项技术的价值在于实现了内容与表现的分离,为搜索引擎优化和无障碍访问提供了结构化基础。在应用场景上,HTML是前端开发三驾马车(HTML、CSS、JavaScript)的基石,广泛应用于网站构建、博客平台、Web应用界面等所有网页内容展示领域。随着HTML5标准的普及,语义化标签如header、nav、artic

weixin_30797199的博客 308

使用gumbo-parser构建MOBI工具:HTML5解析的终极指南

想要构建专业的MOBI电子书工具吗?gumbo-parser正是你需要的HTML5解析库!这个纯C99编写的开源库能够完美处理HTML5文档,为你的电子书制作提供强大支持。 ## 什么是gumbo-parser? gumbo-parser是一个完全符合HTML5规范的纯C99解析库,无需任何外部依赖。它专门为构建工具和库而设计,比如**MOBI电子书生成器**、校验器、模板语言等。 ###

gitblog_00536的博客 732

剖析Ammonia核心实现原理:它如何用html5ever让HTML解析与浏览器完全一致

**Ammonia** 是一款 Rust 编写的 HTML 净化(Sanitization)库,核心功能是过滤不可信用户提交中的危险 HTML,防止 XSS 跨站脚本攻击、页面布局破坏和点击劫持。它的秘密武器是 **html5ever**——与浏览器内核同款解析算法,从根上让"解析结果与浏览器看到的完全一致"。 ## 🧱 Ammonia 是什么:白名单式 HTML 净化库 先建立一个直觉:所

gitblog_00416的博客 1016
上一篇: noob_Noob的Three.js指南
下一篇: wordpress下拉菜单_下拉导航:如何在WordPress上维护选定的选项
daique1908
博客等级 码龄10年 29粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值