XML轻松学习手册(3)XML的术语

作者:互联网

2009-07-07

XML教程
第三章 XML的术语


提纲:



导言

一.XML文档的有关术语

二.DTD的有关术语




导言




初学XML最令人头疼的就是有一大堆新的术语概念要理解。由于XML本身也是一个崭新的技术,正在不断发展和变化,各组织和各大网络公司(微软,IBM,SUN等)都在不断推出自己的见解和标准,因此新概念漫天飞就不足为奇了。而国内又缺乏权威的机构或组织来对这些术语正式定名,你所看见的有关XML的中文教材大部分是靠作者本身的理解翻译过来的,有些是正确的,有些是错误的,更加妨碍了我们对这些概念的理解和学习。




你下面将要看到的关于XML术语的解释,也是作者本身的理解和翻译。阿捷是以W3C组织发布的XML1.0标准规范和相关的正式说明文档为根据来讲述。可以确保这些理解是基本正确的,至少不是错误的。你如果想进一步阅读和了解,我在本文的最后部分列明了相关资源的出处和链接,你可以直接访问。好,我们转入正题:


一.XML文档的有关术语

什么是XML文档?知道HTML原代码文件吧,XML文档就是用XML标识写的XML原代码文件。XML文档也是ASCII的纯文本文件,你可以用Notepad创建和修改。XML文档的后缀名为.XML,例如myfile.xml。用IE5.0以上浏览器也可以直接打开.xml文件,但你看到的就是"XML原代码",而不会显示页面内容。你可以将下面代码存为myfile.xml试试:






XML轻松学习手册

ajie

ajie@aolhoo.com

20010115


XML文档包含三个部分:

1. 一个XML文档声明;

2. 一个关于文档类型的定义;

3. 用XML标识创建的内容。


举例说明:








QUICK START OF XML

ajie



......



其中第一行就是一个XML文档的声明,第二行说明这个文档是用filelist.dtd来定义文档类型的,第三行以下就是内容主体部分。
我们来了解XML文档中有关的术语:


1.Element(元素):

元素在HTML我们已经有所了解,它是组成HTML文档的最小单位,在XML中也一样。一个元素由一个标识来定义,包括开始和结束标识以及其中的内容,就象这样:ajie


唯一不同的就是:在HTML中,标识是固定的,而在XML中,标识需要你自己创建。


2.Tag(标识)

标识是用来定义元素的。在XML中,标识必须成对出现,将数据包围在中间。标识的名称和元素的名称是一样的。例如这样一个元素:

ajie

其中就是标识。


3.Attribute(属性):

什么是属性?看这段HTML代码:word。其中color就是font的属性之一。

属性是对标识进一步的描述和说明,一个标识可以有多个属性,例如font的属性还有size。XML中的属性与HTML中的属性是一样的,每个属性都有它自己的名字和数值,属性是标识的一部分。举例:

ajie

XML中属性也是自己定义的,我们建议你尽量不使用属性,而将属性改成子元素,例如上面的代码可以改成这样:

ajie

female



原因是属性不易扩充和被程序操作。


4.Declaration(声明)

在所有XML文档的第一行都有一个XML声明。这个声明表示这个文档是一个XML文档,它遵循的是哪个XML版本的规范。一个XML的声明语句就象这样:


5.DTD(文件类型定义)

DTD是用来定义XML文档中元素,属性以及元素之间关系的。

通过DTD文件可以检测XML文档的结构是否正确。但建立XML文档并不一定需要DTD文件。关于DTD文件的详细说明我们将在下面单独列项。


6.Well-formed XML(良好格式的XML)

一个遵守XML语法规则,并遵守XML规范的文档称之为"良好格式"。如果你所有的标识都严格遵守XML规范,那么你的XML文档就不一定需要DTD文件来定义它。

良好格式的文档必须以一个XML声明开始,例如:



其中你必须说明文档遵守的XML版本,目前是1.0;其次说明文档是"独立的",它不需要DTD文件来验证其中的标识是否有效;第三,要说明文档所使用的语言编码。默认的是UTF-8,如果使用中文,你需要设置为GB2312。

良好格式的XML文档必须有一个根元素,就是紧接着声明后面建立的第一个元素,其它元素都是这个根元素的子元素,属于根元素一组。

良好格式的XML文档的内容书写时必须遵守XML语法。(有关XML语法我们将在下一章仔细讲解)


7.Valid XML(有效的XML)

一个遵守XML语法规则,并遵守相应DTD文件规范的XML文档称为有效的XML文档。注意我们比较"Well-formed XML"和"Valid
XML",它们最大的差别在于一个完全遵守XML规范,一个则有自己的"文件类型定义(DTD)"。

将XML文档和它的DTD文件进行比较分析,看是否符合DTD规则的过程叫validation(确认)。这样的过程通常我们是通过一个名为parser的软件来处理的。

有效的XML文档也必须以一个XML声明开始,例如:



和上面例子不同的,在standalone(独立)属性中,这里设置的是"no",因为它必须和相应的DTD一起使用,DTD文件的定义方法如下:



其中:

"!DOCTYPE"是指你要定义一个DOCTYPE;

"type-of-doc"是文档类型的名称,由你自己定义,通常于DTD文件名相同;

"SYSTEM/PUBLIC"这两个参数只用其一。SYSTEM是指文档使用的私有DTD文件的网址,而PUBLIC则指文档调用一个公用的DTD文件的网址。

"dtd-name" 就是DTD文件的网址和名称。所有DTD文件的后缀名为".dtd"。

我们还是用上面的例子,应该写成这样:



二.DTD的有关术语

什么是DTD,我们上面已经简略提到。DTD是一种保证XML文档格式正确的有效方法,可以比较XML文档和DTD文件来看文档是否符合规范,元素和标签使用是否正确。一个DTD文档包含:元素的定义规则,元素间关系的定义规则,元素可使用的属性,可使用的实体或符号规则。

DTD文件也是一个ASCII的文本文件,后缀名为.dtd。例如:myfile.dtd。

为什么要用DTD文件呢?我的理解是它满足了网络共享和数据交互,使用DTD最大的好处在于DTD文件的共享。(就是上文DTD说明语句中的PUBLIC属性)。比如,两个相同行业不同地区的人使用同一个DTD文件来作为文档创建规范,那么他们的数据就很容易交换和共享。网上有其他人想补充数据,也只需要根据公用的DTD规范来建立文档,就立刻可以加入。

目前,已经有数量众多的写好的DTD文件可以利用。针对不同的行业和应用,这些DTD文件已经建立了通用的元素和标签规则。你不需要自己重新创建,只要在他们的基础上加入你需要的新标识。

当然,如果愿意,你可以创建自己的DTD,它可能和你的文档配合的更加完美。建立自己的DTD也是很简单的一件事,一般只需要定义4-5个元素就可以了。

调用DTD文件的方法有两种:

1.直接包含在XML文档内的DTD

你只要在DOCTYPE声明中插入一些特别的说明就可以了,象这样:

我们有一个XML文档:





XML轻松学习手册

ajie



我们在第一行后面插入下面代码就可以:








]>


 

2.调用独立的DTD文件

将DTD文档存为.dtd的文件,然后在DOCTYPE声明行中调用,例如,将下面的代码存为myfile.dtd






 

然后在XML文档中调用,在第一行后插入:


 

我们可以看到DTD文档和HTML中js的调用是差不多的,关于DTD文档具体如何写,我们将在下一章和XML文档的语法一起介绍。


 

下面我们来了解DTD有关的术语:


 

1.Schema(规划)

schema是数据规则的描述。schema做两件事:

a.它定义元素数据类型和元素之间的关系;

b.它定义元素所能包含的内容类型。

DTD就是关于XML文档的一个schema。


 

2.Document Tree(文档树)

"文档树"在前面第二章我们已经提到过,它是文档元素分级结构的形象表示。一个文档结构树包含根元素,根元素是最顶级的元素,(就是紧接着XML声明语句后的第一个元素)。看例子:







...

...





上面的例子分三级结构排列成"树"状,其中的就是根元素。在XML和DTD文件中,第一个定义的都是根元素。


 

3.Parent Element(父元素)/Child Element(子元素)

父元素是指包含有其它元素的元素,被包含的元素称为它的子元素。看上面的"结构树",其中是父元素,,<author>是它的子元素,而<myfile>又是<filelist>的子元素。象<title>这样没有包含任何子元素的最后一级元素我们也称之为"页元素"。</P> <P><BR> </P> <P>4.Parser(解析软件) <BR><BR>Parser是一种检查XML文档是否遵循DTD规范的工具软件。<BR><BR>XML的parser发展为两类:一种是"非确认类paeser",只检测文档是否遵守XML语法规则,是否用元素标识建立了文档树。另一种是"确认类paeser",它不但检测文档语法,结构树,而且比较解析你使用的元素标识是否遵守了相应DTD文件的规范。<BR><BR>Parser能独立使用,也可以成为编辑软件或浏览器的一部分。在后面的相关资源列表里,我列出了当前比较流行的一些parsers。</P> <P><BR> </P> <P>  好了,通过第三章的学习,我们已经了解了一些XML和DTD的基本术语,但是我们还不知道怎样来写这些文件,需要遵循什么样的语法,在下一章,将重点介绍有关撰写XML和DTD文档的语法。请继续浏览,谢谢!</P></span> </div> <div class="artmoretabs flexRow"> <p>相关标签:</p> <div class="mtbs flexRow"> <span class="mtbsa flexRow check" title="XML">XML</span> </div> </div> <div class="lastanext flexRow"> <a class="lastart flexRow" href="/wz/7045.html" ><span>上一篇:</span><span>XML轻松学习手册(4)XML语法</span></a> <a class="nextart flexRow" href="/wz/7047.html" ><span>下一篇:</span><span>XML轻松学习手册(2)XML概念</span></a> </div> </div> <div class="dtl-xgtj"> <div class="jb-titles flexRow"> <div class="jbtle-left flexRow"><b></b><p>相关推荐</p></div> </div> <div class="tjlist flexRow"> <div class="tj-item "> <div class="tjitemd"> <div class="tjimd-top flexRow"> <a class="imdta flexRow" href="/wz/365631.html" > <img src="https://images.jiaoben.net/uploads/20260417/logo_69e1ebbf94fdb1.jpeg" > </a> <div class="imdt-right flexColumn"> <a class="imdtra flexRow overflowclass" href="/wz/365631.html" >MyBatis、MyBatis-Plus、JPA、MyBatisGX 写法比较:同一个需求,四种解法</a> <a class="imdtrap flexRow overflowclass" href="/wz/365631.html" > MyBatis、MyBatis-Plus、JPA、MyBatisGX 写法比较:同一个需求,四种解法 场景 1:一个"普通"的用户管理需求 产品经理说,用户模块需要支持: 新增用户 查询用户详情(带出 </a> </div> </div> <div class="tjimd-down flexRow"> <div class="imdd-tab flexRow"> <p class="imddt-time flexRow"><b></b><span>2026-04-17</span></p> </div> <a href="/wz/365631.html" class="imdd-more flexRow flexcenter" >立即查看</a> </div> </div> </div> <div class="tj-item "> <div class="tjitemd"> <div class="tjimd-top flexRow"> <a class="imdta flexRow" href="/wz/365623.html" > <img src="https://images.jiaoben.net/uploads/20260417/logo_69e1eb3a2def91.jpeg" > </a> <div class="imdt-right flexColumn"> <a class="imdtra flexRow overflowclass" href="/wz/365623.html" >【从0到1构建一个ClaudeAgent】并发-后台任务</a> <a class="imdtrap flexRow overflowclass" href="/wz/365623.html" > 有些操作很慢,Agent 不能干等着。例如**长时间编译/构建**:`make`, `mvn c </a> </div> </div> <div class="tjimd-down flexRow"> <div class="imdd-tab flexRow"> <p class="imddt-time flexRow"><b></b><span>2026-04-17</span></p> </div> <a href="/wz/365623.html" class="imdd-more flexRow flexcenter" >立即查看</a> </div> </div> </div> <div class="tj-item "> <div class="tjitemd"> <div class="tjimd-top flexRow"> <a class="imdta flexRow" href="/wz/365565.html" > <img src="https://images.jiaoben.net/uploads/20260417/logo_69e1dc6c2e9ec1.jpeg" > </a> <div class="imdt-right flexColumn"> <a class="imdtra flexRow overflowclass" href="/wz/365565.html" >java2AI系列:SpringAI 通过 Function Calling 接入外部系统</a> <a class="imdtrap flexRow overflowclass" href="/wz/365565.html" > 在做企业级的RAG时,需要投喂外部系统的数据给模型,以生成更符合需要的回答。我们都知道模型的知识是有限的,在训练完成后,它的参数就固定了。大多数的模型,目前还无法自主更新知识库,即不知道训练数据以外的 </a> </div> </div> <div class="tjimd-down flexRow"> <div class="imdd-tab flexRow"> <p class="imddt-time flexRow"><b></b><span>2026-04-17</span></p> </div> <a href="/wz/365565.html" class="imdd-more flexRow flexcenter" >立即查看</a> </div> </div> </div> <div class="tj-item "> <div class="tjitemd"> <div class="tjimd-top flexRow"> <a class="imdta flexRow" href="/wz/365521.html" > <img src="https://images.jiaoben.net/uploads/20260417/logo_69e1cf9d697db1.jpeg" > </a> <div class="imdt-right flexColumn"> <a class="imdtra flexRow overflowclass" href="/wz/365521.html" >深度剖析:Java 并发三大量难题 —— 死锁、活锁、饥饿全解</a> <a class="imdtrap flexRow overflowclass" href="/wz/365521.html" > 本文深入剖析Java并发中三大顽疾:死锁(线程永久阻塞)、活锁(线程忙等无效运行)、饥饿(低优先级线程长期得不到资源)。厘清其本质区别、触发条件、实战案例及jstack/Arthas等排查方案。 </a> </div> </div> <div class="tjimd-down flexRow"> <div class="imdd-tab flexRow"> <p class="imddt-time flexRow"><b></b><span>2026-04-17</span></p> </div> <a href="/wz/365521.html" class="imdd-more flexRow flexcenter" >立即查看</a> </div> </div> </div> </div> </div> </div> <div class="cd-right dtlcd-right"> <div class="dtl-ht"> <div class="jb-titles flexRow"> <div class="jbtle-left flexRow"><b></b><p>专题</p></div> </div> <div class="dtlht-list "> <div class="htl-item flexRow"> <div class="htmitem-left"> <div class="htiteml-top flexRow"> <a href="/wz/zt-69351.html" >#数据可视化</a> <span></span> </div> <a class="htiteml-down flexRow" href="/wz/zt-69351.html" >数据可视化(Data Visu</a> </div> <p class="htmitem-right flexRow flexcenter gz" data-id="69351" >+ 收藏</p> </div> <div class="htl-item flexRow"> <div class="htmitem-left"> <div class="htiteml-top flexRow"> <a href="/wz/zt-69342.html" >#自然语言处理</a> <span></span> </div> <a class="htiteml-down flexRow" href="/wz/zt-69342.html" >自然语言处理(Natural</a> </div> <p class="htmitem-right flexRow flexcenter gz" data-id="69342" >+ 收藏</p> </div> <div class="htl-item flexRow"> <div class="htmitem-left"> <div class="htiteml-top flexRow"> <a href="/wz/zt-68363.html" >#Excel公式</a> <span></span> </div> <a class="htiteml-down flexRow" href="/wz/zt-68363.html" >Excel公式就是:用函数 +</a> </div> <p class="htmitem-right flexRow flexcenter gz" data-id="68363" >+ 收藏</p> </div> <div class="htl-item flexRow"> <div class="htmitem-left"> <div class="htiteml-top flexRow"> <a href="/wz/zt-68355.html" >#Excel技巧</a> <span></span> </div> <a class="htiteml-down flexRow" href="/wz/zt-68355.html" >Excel是日常生活中必不可</a> </div> <p class="htmitem-right flexRow flexcenter gz" data-id="68355" >+ 收藏</p> </div> <div class="htl-item flexRow"> <div class="htmitem-left"> <div class="htiteml-top flexRow"> <a href="/wz/zt-68081.html" >#蛋仔派对</a> <span></span> </div> <a class="htiteml-down flexRow" href="/wz/zt-68081.html" >蛋仔派对最新官方活动、关卡速</a> </div> <p class="htmitem-right flexRow flexcenter gz" data-id="68081" >+ 收藏</p> </div> <div class="htl-item flexRow"> <div class="htmitem-left"> <div class="htiteml-top flexRow"> <a href="/wz/zt-68000.html" >#人工智能</a> <span></span> </div> <a class="htiteml-down flexRow" href="/wz/zt-68000.html" >人工智能(AI),简单说,就</a> </div> <p class="htmitem-right flexRow flexcenter gz" data-id="68000" >+ 收藏</p> </div> </div> </div> <div class=" dtl-zt"> <div class="jb-titles flexRow"> <div class="jbtle-left flexRow"><b></b><p>最新数据</p></div> </div> <div class="wkch-downs"> <div class="weekch-top flexRow"> <a class="wktpa flexRow" href="/wz/7049.html" > <img src="/jiaoben/image/noimg.png" > </a> <div class="wktpa-right flexColumn"> <a class="wktpara flexRow overflowclass" href="/wz/7049.html" >从XML中读取数据到内存的实例</a> <a class="wktparp flexRow overflowclass" href="/wz/7049.html" > public clsSimuR </a> </div> </div> <div class="weekch-list"> <div class="weekch-con flexRow"> <div class="weekch-icon flexRow"><b></b></div> <a href="/wz/7048.html" class="weekcha flexRow flexcenter overflowclass" >XML轻松学习手册(1)XML快速入门</a> </div> <div class="weekch-con flexRow"> <div class="weekch-icon flexRow"><b></b></div> <a href="/wz/7044.html" class="weekcha flexRow flexcenter overflowclass" >XML轻松学习手册(5)XML实例解析</a> </div> <div class="weekch-con flexRow"> <div class="weekch-icon flexRow"><b></b></div> <a href="/wz/7043.html" class="weekcha flexRow flexcenter overflowclass" >了解WEB页面工具语言XML(一)产生背景</a> </div> <div class="weekch-con flexRow"> <div class="weekch-icon flexRow"><b></b></div> <a href="/wz/7042.html" class="weekcha flexRow flexcenter overflowclass" >了解WEB页面工具语言XML(二)定义</a> </div> <div class="weekch-con flexRow"> <div class="weekch-icon flexRow"><b></b></div> <a href="/wz/7041.html" class="weekcha flexRow flexcenter overflowclass" >了解WEB页面工具语言XML(三)支持工具</a> </div> <div class="weekch-con flexRow"> <div class="weekch-icon flexRow"><b></b></div> <a href="/wz/7040.html" class="weekcha flexRow flexcenter overflowclass" >了解WEB页面工具语言XML(四)应用分类</a> </div> <div class="weekch-con flexRow"> <div class="weekch-icon flexRow"><b></b></div> <a href="/wz/7039.html" class="weekcha flexRow flexcenter overflowclass" >了解WEB页面工具语言XML(五)好处</a> </div> <div class="weekch-con flexRow"> <div class="weekch-icon flexRow"><b></b></div> <a href="/wz/7038.html" class="weekcha flexRow flexcenter overflowclass" >了解WEB页面工具语言XML(六)展望</a> </div> <div class="weekch-con flexRow"> <div class="weekch-icon flexRow"><b></b></div> <a href="/wz/7037.html" class="weekcha flexRow flexcenter overflowclass" >学习使用XML引擎XQEngine</a> </div> </div> </div> </div> <div class=" dtl-wz"> <div class="jb-titles flexRow"> <div class="jbtle-left flexRow"><b></b><p>相关文章</p></div> </div> <div class="blog-list"> <a href="/wz/256605.html" class="bloga flexRow over"><p class="overflowclass">用xslt+css让RSS显示的跟网页一样漂亮</p><div class="blogtime"><span>08/</span>26</div></a> <a href="/wz/256612.html" class="bloga flexRow over"><p class="overflowclass">XML入门问答</p><div class="blogtime"><span>08/</span>26</div></a> <a href="/wz/256618.html" class="bloga flexRow over"><p class="overflowclass">跟我学XSL(二)第1/4页</p><div class="blogtime"><span>08/</span>26</div></a> <a href="/wz/256625.html" class="bloga flexRow over"><p class="overflowclass">跟我学XSL(一)第1/5页</p><div class="blogtime"><span>08/</span>26</div></a> <a href="/wz/256630.html" class="bloga flexRow over"><p class="overflowclass">SXNA RSS Blog 聚合器程序</p><div class="blogtime"><span>08/</span>26</div></a> <a href="/wz/256662.html" class="bloga flexRow over"><p class="overflowclass">虚机服务中常见Asp.Net低级错误一览</p><div class="blogtime"><span>08/</span>25</div></a> <a href="/wz/256668.html" class="bloga flexRow over"><p class="overflowclass">ASP.NET 2.0页面框架的几处变化</p><div class="blogtime"><span>08/</span>25</div></a> <a href="/wz/256674.html" class="bloga flexRow over"><p class="overflowclass">asp.net生成HTML</p><div class="blogtime"><span>08/</span>25</div></a> <a href="/wz/256680.html" class="bloga flexRow over"><p class="overflowclass">UDDI FAQs</p><div class="blogtime"><span>08/</span>25</div></a> <a href="/wz/256733.html" class="bloga flexRow over"><p class="overflowclass">XHTML 1.0:标记新的开端</p><div class="blogtime"><span>08/</span>25</div></a> </div> </div> <div class="cdr-ai"> <div class="jb-titles flexRow"> <div class="jbtle-left flexRow"><b></b><p>AI精选 </p></div> <a class="jbtitle-more flexRow" href="/category/list_344_1.html" title=""><span>更多</span><b></b></a> </div> <div class="ai-list"> <div class="ail-top flexRow"> <a href="/wz/367955.html" title="" class="ailta "> <img src="https://images.jiaoben.net/uploads/20260418/logo_69e2f7d519fb31.jpg" > <p ><span>Image Editing P</span></p></a> <a href="/wz/367954.html" title="" class="ailta "> <img src="https://images.jiaoben.net/uploads/20260418/logo_69e2f7c50dfa51.jpg" > <p ><span>游艇甲板上的比基尼丰腴女子</span></p></a> </div> <div class="ail-down"> <a class="ali-con flexRow" href="/wz/367947.html" title=""> <div class="alicon-left flexRow"><span>精选</span></div> <p class="aliconp overflowclass">Vogue 风格美妆肖像(迪丽热巴·迪力木拉提)</p> </a> <a class="ali-con flexRow" href="/wz/367946.html" title=""> <div class="alicon-left flexRow"><span>精选</span></div> <p class="aliconp overflowclass">蜘蛛侠紧身衣在豪华卧室中对着镜子自拍</p> </a> <a class="ali-con flexRow" href="/wz/367929.html" title=""> <div class="alicon-left flexRow"><span>精选</span></div> <p class="aliconp overflowclass">超逼真情人节专题,带身份锁定功能</p> </a> <a class="ali-con flexRow" href="/wz/367880.html" title=""> <div class="alicon-left flexRow"><span>精选</span></div> <p class="aliconp overflowclass">抓拍夜生活派对的真实瞬间提示词</p> </a> <a class="ali-con flexRow" href="/wz/367867.html" title=""> <div class="alicon-left flexRow"><span>精选</span></div> <p class="aliconp overflowclass">赵露思 — 空灵美人鱼女神画报</p> </a> <a class="ali-con flexRow" href="/wz/367866.html" title=""> <div class="alicon-left flexRow"><span>精选</span></div> <p class="aliconp overflowclass">前卫路易威登滑雪镜编辑提示</p> </a> <a class="ali-con flexRow" href="/wz/367855.html" title=""> <div class="alicon-left flexRow"><span>精选</span></div> <p class="aliconp overflowclass">超逼真油炸零食爆炸美食摄影提示(重复)</p> </a> <a class="ali-con flexRow" href="/wz/367854.html" title=""> <div class="alicon-left flexRow"><span>精选</span></div> <p class="aliconp overflowclass">超逼真高级时装活动摄影提示</p> </a> </div> </div> </div> <div class="cdr-blog"> <div class="jb-titles flexRow"> <div class="jbtle-left flexRow"><b></b><p>脚本推荐</p></div> </div> <div class="blog-list"> <a href="/wz/zt-49225.html" title="" class="bloga flexRow over"><p class="overflowclass">SeeDance 2.0 Video Creator专区</p></a> <a href="/wz/zt-49224.html" title="" class="bloga flexRow over"><p class="overflowclass">OpenClaw AI专区</p></a> <a href="/wz/zt-49223.html" title="" class="bloga flexRow over"><p class="overflowclass">cowork专区</p></a> <a href="/wz/zt-49222.html" title="" class="bloga flexRow over"><p class="overflowclass">claude code skills专区</p></a> </div> </div> </div> </div> </div> </div> </main> <script> $(function() { // “+ 收藏”按钮点击事件 $(document).on('click', '.htmitem-right, .ztop-right', function(e) { // 仅针对包含 “+ 收藏” 文字的按钮 if ($(this).text().indexOf('+ 收藏') === -1) return; e.preventDefault(); const id = $(this).data('id'); if (!id) { layer.msg('该项暂无有效ID,无法收藏'); return; } // 构造收藏 URL: 当前域名 + /wz/zt- + id + / const bookmarkUrl = window.location.origin + '/wz/zt-' + id + '.html'; // 获取收藏标题 (优先从同级元素获取话题名称,否则使用页面标题) let bookmarkTitle = $(this).closest('.htl-item, .zttopd').find('a:first, span.overflowclass').text().trim() || document.title; if (bookmarkTitle.startsWith('#')) bookmarkTitle = bookmarkTitle.substring(1); // 浏览器收藏逻辑 (带 Fallback) try { if (window.sidebar && window.sidebar.addPanel) { // Firefox < 23 window.sidebar.addPanel(bookmarkTitle, bookmarkUrl, ""); } else if (window.external && ('AddFavorite' in window.external)) { // IE window.external.AddFavorite(bookmarkUrl, bookmarkTitle); } else { // Chrome, Safari, Firefox 23+, etc. const isMac = /Mac/i.test(navigator.userAgent); const keyStr = isMac ? 'Command + D' : 'Ctrl + D'; layer.confirm('由于浏览器安全限制,请使用 <b>' + keyStr + '</b> 手动添加收藏。<br><br>收藏地址:<br><small>' + bookmarkUrl + '</small>', { title: '收藏提示', btn: ['复制链接', '知道了'], yes: function(index) { copyToClipboard(bookmarkUrl).then(() => { layer.msg('链接已复制,请手动添加到收藏夹'); }).catch(() => { layer.msg('复制失败,请手动选择复制'); }); layer.close(index); } }); } } catch (err) { layer.msg('收藏失败,请手动添加'); } }); // 兼容非 HTTPS 的复制函数 function copyToClipboard(text) { if (navigator.clipboard && window.isSecureContext) { return navigator.clipboard.writeText(text); } else { let textArea = document.createElement("textarea"); textArea.value = text; textArea.style.position = "fixed"; textArea.style.left = "-999999px"; textArea.style.top = "-999999px"; document.body.appendChild(textArea); textArea.focus(); textArea.select(); return new Promise((res, rej) => { document.execCommand('copy') ? res() : rej(); textArea.remove(); }); } } }); </script> <footer> <div class="foot "> <div class="foot-top flexRow"> <div class="foot-left"> <div class="ftl-top flexRow"><span class="flexRow flexcenter">脚本</span>在线</div> <p class="ftl-down"> 智能赋能梦想,脚本构筑现实。我们致力于链接AI智能指令 与传统自动化,为您提供一站式、高效率的脚 本资产与生成 服务。 </p> </div> <div class="foot-right flexRow"> <div class="ftr-list flexColumn"> <p>核心板块</p> <span>AI脚本库</span> <span>自动化仓库</span> <span>脚本实验室</span> </div> <div class="ftr-list flexColumn"> <p>关于我们</p> <a href="/category/list_229_1.html" >最新游戏</a> <span>商务合作</span> <span>隐私政策</span> </div> <div class="ftr-list flexColumn"> <p>社区支持</p> <span >API文档</span> <a href="/category/list_334_1.html" >攻略资讯</a> <span>违规举报</span> </div> </div> </div> <div class="foot-down flexColumn"> <p>© 2026 jiaoben.net | 脚本在线 | 联系:jiaobennet2026@163.com</p> <p>备案:<a style="color: #7F7F7F;" href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">湘ICP备18025217号-11</a> </p> </div> </div> </footer> <div style="display:none;"> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?5d3cfe1f36b1988029fe82a0d475b20d"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> </div> </body> </html>