资讯专栏INFORMATION COLUMN

JavaScript高程第十章:DOM(上)

xcold / 2053人阅读

摘要:类型除了该死的其他所有浏览器都可以访问到类型而中所有节点类型都继承自类型因此所有节点类型都共享着相同的基本属性和方法每个节点都有一个属性可以表明节点的类型我们来看看有哪些类型吧和属性则完全取决于对于元素节点保存的始终为标签名而保存的值始终为

Node类型

除了IE(该死的IE),其他所有浏览器都可以访问到Node类型,而JS中所有节点类型都继承自Node类型,因此所有节点类型都共享着相同的基本属性和方法.
每个节点都有一个nodeType属性,可以表明节点的类型,我们来看看有哪些类型吧

Node.ELEMENT_NODE(1)

Node.ATTRIBUTE_NODE(2)

Node.TEXT_NODE(3)

Node.CDATA_SECTION_NODE(4)

Node.ENTITY_REFERENCE_NODE(5)

Node.ENTITY_NODE(6)

Node.PROCESSING_INSTRUCTION_NODE(7)

Node.COMMENT_NODE(8)

Node.DOCUMENT_NODE(9)

Node.DOCUMENT_TYPE_NODE(10)

Node.DOCUMENT_FRAGMENT_NODE(11)

Node.NOTATION_NODE(12)
nodeNamenodeValue属性则完全取决于nodeType,对于元素节点,nodeName保存的始终为标签名,而nodeValue保存的值始终为null

childNodes属性中保存着一个NodeList对象(类数组对象,并不是Array的实例),NodeList是动态的,是基于DOM结构动态执行查询的结果,我们能通过以下方式来访问子节点.

var firstChild = someNode.childNodes[0];
var secondChild = someNode.childNodes.item(1);
var count = someNode.childNodes.length;

对于NodeList对象,我们还可以转换为数组,如下

var arrayOfNodes = Array.prototype.slice.call(someNode.childNodes,0);

值得注意,该段代码在IE8及更早版本前是报错的,这是因为IE8及更早版本将NodeList实现为一个COM对象,而我们不能像使用JScript对象那样使用该对象,所以上述代码会导致错误.以下是对于兼容性的解决方法.

function convertToArray(nodes){
  var array = null;
  try{
    array = Array.prototype.slice.call(nodes,0);//非IE
  }catch(ex){
    array = new Array();
    for(var i = 0,len = nodes.length;i < len;i++){
      array.push(node[i]);
    }
  }
  return array;
}

每个节点还有parentNode属性,该属性指向文档树中的父节点.包含在childNodes列表中的所有节点都有相同的父节点,而childNodes列表中的每个节点之间为同胞节点,可以通过previousSiblingnextSibling属性访问.如果列表只有一个节点,则该节点上述两个属性为null.
父节点与其第一个和最后一个子节点之间也存在特殊关系.父节点存在属性firstChildlastChild分别指向它们.其中firstChildchildNodes[0]相等,而x.lastChildx.childNodes[x.childNodes.length-1]相等.

节点中hasChildNodes()方法也是一个有用的方法,在包含节点情况下返回true,否则返回false.

所有节点最后一个属性都为ownerDocument,它指向表示整个文档的文档节点,即#document,可以使我们直接到达顶层.

操作节点

注意:关系指针都是只读的,所以DOM提供了一些函数供我们操作节点.
以下介绍了四种操作方法,都需要先取得父节点,但是需要明白不是所有类型的节点都有/支持子节点.

插入节点
appendChild(node) //向childNodes列表末尾添加一个节点,并在添加后,关系指针会相应更新.

值得注意的是appendChild()添加的节点如果已经是文档的一部分,那么相当于转移节点.

insertBefore(node,null) //参数一为插入节点,第二个参数则为参照节点,设为null则效果与appendChild一样,存在参照节点则插入节点变成参照节点前一个同胞节点(previousSibling)
移除/替换节点
removeChild(oldNode) //移除并非替换节点,返回值为oldNode
replaceChild(newNode,oldNode) //oldNode替换为newNode,oldNode虽然技术上仍然存在,但是文档中没有了它的位置
其他方法

这里有两个方法是所有类型节点都有的,它们就是cloneNode(boolean)normalize(),我们重点介绍cloneNode()

cloneNode(boolean) //传入一个布尔值,该值决定执行深复制(节点及整个节点树)还是浅复制(仅复制本身)

注意点一:深复制IE9之前版本不会为空白符创建节点,所以深复制时childNodes长度会有所不同.
注意点二:cloneNode()方法只复制特性和子节点(指定情况下),不会复制JS属性如事件处理程序等等(除开IE,存在复制事件处理程序的bug),所以复制前最好先移除事件处理程序.

Element类型

除了Document类型,我们Web编程中最常用的类型就是Element类型啦.
Element 类型用于表现XML或HTML元素,提供了对元素标签名,子节点,特性的访问

特征

nodeType值为1

nodeName为元素标签名

nodeValue为null

parentNode可能是Document或Element

子节点可能是Element,Text,Comment,ProcessingInstruction,CDATASection,EntityReference

其中nodeName和tagName属性返回相同的值,推荐使用tagName,则表义更清晰,值得注意的是返回值大小写的问题,由于HTML中为答谢,而XML/XHTML则会与源代码保持一致,所以比较时要统一大小写形式.

HTML元素

HTML元素都由HTMLElement类型表示,不直接通过该类型,也是通过它的子类型表示.HTMLElement类型继承自Element并且添加了一些属性如下:

id 元素在文档中的唯一标识符

title 元素的附加说明信息,一般为工具提示条显示

lang 元素内容的语言代码,很少使用

dir 语言方向,ltr为从左到右,rtl则相反

className 与元素class的特性对应,没有设置为class则是因为class为ECMAScript的保留字

注意以上属性的修改并不是所有都会在页面中直观的表现出来,id和lang修改对用户来说是不可见的(假设没有css样式),对title的修改则只会在鼠标移动到元素上时才会显示出来(工具提示条),dir的修改则会在属性重写的那一刻立刻影响页面中的文本,对className的修改则与是否关联了不同的CSS样式有关.

特性

HTML元素每个元素都有一个或多个特性,操作特性的DOM方法如下有三个:

getAttribute()

setAttribute()

removeAttribute()
这三个方法可以针对任何特性使用,包括自定义特性.

但是只有公认的特性才会添加到DOM元素属性上,自定义的特性通常是不存在的(undefined),当然这里又要注意我们的"好朋友"IE啦,它会为自定义特性创建属性.

特殊特性

主要针对getAttribute()方法讲述一下特殊情况.

有两类特殊特性,有对应的属性名,但值与getAttribute()返回的值并不相同

style,通过getAttribute()访问会返回CSS文本,而通过属性访问返回一个对象

onclick这样的事件处理程序,通过getAttribute()访问会返回相应代码的字符串.而属性访问时,则会返回一个JavaScript函数(未指定则为null)

故通常只有取得自定义特性值的情况下,才会使用getAttribute()方法.

注意!:我们的"老朋友"IE7及以前版本中,getAttribute()方法访问上述两个特殊特性时,返回的值与属性的值相同.即getAttribute("style")返回一个对象,getAttribute("onclick")返回一个函数.

设置特性

这里主要讲解下setAttribute()方法,这和getAttribute()相对应.这个方法接受两个参数,要设置的特性名和值,如果特性存在则将值进行替换;不存在则创建并设置相应的值.
值得注意的是,设置特性名会转换为小写.而且直接给DOM元素添加一个自定义的属性并不会让这个属性成为元素的特性.

div.mycolor="red";
div.getAttribute("mycolor"); //这里返回null(IE除外)
移除特性

removeAttribute()方法用于彻底删除元素特性,调用该方法会清除特性的值并完全删除特性.
注意!:IE6及以前版本不支持该方法.

attributes属性

Element类型是使用attributes属性的唯一一个DOM节点类型.在该属性中包含一个NamedNodeMap,与NodeList类似,也是"动态"集合.元素每一个特性都由一个Attr节点表示,每个节点都保存在NamedNodeMap对象中.相关方法如下:

getNamedItem(name)返回nodeName属性等于name的节点

removeNamedItem(name)从列表移除nodeName等于name的节点

setNamedItem(node)向列表添加节点,以节点的nodeName属性为索引

item(pos)返回处于数字pos位置处的节点

在该属性中有一系列的节点,每个节点的nodeName就是特性的名称,nodeValue就是特性的值.要取得元素的id特性,可以使用attributes.getNamedItem("id").nodeValue
等同于attributes["id"].nodeValue

调用removeNamedItem()与在元素上调用removeAttribute()效果相同.

setNamedItem()是一个很不常用的方法,该方法可以为元素添加一个新特性,此外需要为它传入一个特性节点.

注意!:IE7及更早版本会返回HTML元素中所有可能的特性,包括没指定的特性.
针对低版本改进:每个特性节点都有一个名为specified的属性,如果为true则意味着要么HTML中指定了相应特性,要么通过setAttribute()设置了该特性,在IE中未设置过的特性都为false,其他浏览器则不会为这类特性生成对应特性节点.

创建元素

document.createElement()方法就可创建新元素.
该方法接受一个参数,就是元素标签名,这个标签名在HTML下不区分大小写,XML中则会区分大小写.

在创建新元素的同时,新元素也设置了ownerDocument属性,此时,还可以操作元素特性,为它添加更多的子节点.
在设置完特性后,由于未添加到文档树,所以一切特性都不会影响浏览器的显示.我们可以通过之前讲到的appendChild(),insertBefore(),replaceChild()方法来进行相应的操作.
一旦添加到文档树,则浏览器会立刻呈现该元素.此后我们的修改都会反应到浏览器中.
注意!(常不考虑):在IE中我们可以通过另一种方式进行创建

document.createElement("
");

这个方式可以避开IE7及更早版本中动态创建元素的某些问题.(不能设置动态创建的iframe元素的name特性;不能通过表单的reset()方法重设动态创建的input元素;动态创建的type特性值为"reset"的button元素重设不了表单;动态创建的一批name相同的单选按钮彼此毫无关系)

元素子节点
除了IE,其他浏览器解析代码时会解析空白符为文本节点.我们可以通过nodeType属性的检查来过滤掉它们.

Document 类型

在JavaScript中Document类型表示文档,我们常用的document对象是HTMLDocument(继承自Document类型)的一个实例,表示整个HTML页面;document对象还是window对象的一个属性,因此可以将其作为全局对象来访问.

特征

nodeType值为9

nodeName为"#document"

nodeValue为null

parentNode为null

ownerDocument为null

子节点可能是一个DocumentType(最多一个),Element(最多一个),ProcessingInstruction或Comment

Document类型可以表示HTML页面或者其他基于XML的文档,不过最常见的应用还是作为HTMLDocument实例的document对象.通过该对象,我们可以获取页面有关信息,操作页面的外观,以及其底层结构.

文档子节点

虽然DOM标准规定Document节点的子节点可以是DocumentType,Element,ProcessingInstruction或Comment,但是还有两个内置的访问其子节点的快捷方式.
一:documentElement属性-始终指向HTML页面中的元素
二:childNodes列表
并且如下代码所示

//html部分
//
// 
//

var html = document.documentElement;
console.log(html === document.childNodes[0]); //true
console.log(html === document.firstChild);    //true

可见documentElement,firstChild,childNodes[0]指向同一个元素

并且作为HTMLDocument的实例,还有一个body属性,直接指向元素.

所有浏览器都支持document.documentElementdocument.body属性

DocumentType节点(不重要)

节点可以通过document.doctype属性获取并访问它的信息.
以下是各浏览器支持差别:

IE8及之前:存在文档类型声明,会错误解释为一个注释并把它当作Comment节点;而document.doctype 值始终为null

IE9+及firefox:如果存在文档类型声明,则会将其作为文档第一个子节点;document.doctype是一个DocumentType节点,也可以通过document.firstChild或document.childNodes[0]访问.

Safari,Chrome和Opera:如果存在文档类型声明,则会将其解析,但不作为文档子节点,document.doctype是一个DocumentType节点,但该节点不存在于document.childNodes中.

Comment(不重要)


  
  

对于上述注释也在不同浏览器中存在不同.

IE8及之前,Safari3.1及更高,Opera和chrome:只为第一条注释创建节点,部位第二条注释创建节点.

IE9+:将第一条注释创建为document.childNodes中的一个注释节点,也将第二条注释创建为document.childNodes中的注释子节点

Safari3.1之前,firefox:完全忽略

以上的不一致性导致了无论是注释还是DocumentType节点对于我们来说用处十分有限.

文档信息

document对象有属性提供了document对象所表现的网页的一些信息.

title:包含在</b>元素中的文本(浏览器窗口的标题栏或标签页上),但是修改该值不会改变<b><title></b>元素.</p></p> <p><p>URL:包含页面完整的URL</p></p> <p><p>domain:包含页面的域名</p></p> <p><p>referrer:保存链接到当前页面的那个页面的URL,如无来源页面则为空字符串.<br>注意!:这些信息都存在于HTTP头部,只不过我们能通过该属性在JS中访问它们.而且我们只能在遵守规则(不能将这个属性设置为URL中不包含的域,不能将域缩紧如将wrox.com设置为p2p.wrox.com一样(IE8及之后))的情况下设置domain属性.</p></p> <p>其中domain属性还是越过跨域安全限制的好办法.</p> <b>查找元素</b> <p>主要用到document对象以下方法.</p> <pre>getElementById("id") //接受一个参数,如果找到相应元素则返回该元素,不存在则返回null //注意!:IE8及较低版本不区分ID大小写/如果存在多个ID则只返回第一次出现的/IE7及较低版本中name值与ID匹配的表单元素会被返回 getElementsByTagName("img") //接受一个参数,为要取得元素的标签名,返回一个NodeList(包含零或多个元素).在HTML文档中,这个方法返回一个HTMLCollection对象,该对象与NodeList非常类似 getElementsByName("name") //只有HTMLDocument类型才有的方法.和上述两个方法相似,也就不解释传入参数之类的啦 </pre> <b>HTMLCollection对象</b> <p>元素数量可以通过<b>length</b>获得,而且我们可以通过<b>.item()</b>和方括号语法<b>[0]/["name特性"]</b>来访问元素<b>.namedItem()</b>方法则可以通过name特性取得其中的元素.</p> <b>特殊集合</b> <p>除了属性和方法,document对象还有一些特殊集合.这些集合都是HTMLCollection对象,为访问文档常用部分提供了快捷方式,如下:</p> <p><p><b>document.anchors</b> 包含文档中所有带name特性的<b><a></b>元素</p></p> <p><p><b>document.applets</b> 包含文档中所有的<b><applet></b>元素(已不再推荐使用)</p></p> <p><p><b>document.forms</b> 包含文档中所有<b><form></b>元素</p></p> <p><p><b>document.images</b> 包含文档中所有<b><img></b>元素</p></p> <p><p><b>document.links</b> 包含文档中所有带<b>href</b>特性的<b><a></b>元素<br>该集合始终可以通过HTMLDocument对象访问到.而且是动态的随着当前文档内容的更新而更新.</p></p> <b>DOM一致性(分级)</b> <p><b>document.implementation</b>属性就是用在检测浏览器实现了DOM的哪些部分.<br><b>document.implementation.hasFeature()</b>方法接受两个参数,要检测的DOM功能名称和版本号,如果浏览器支持则返回true.但是这并不代表着实现与规范一致</p> <b>文档写入</b> <p>document对象有一个存在很久的功能,将输出流写入到网页中的能力.这关乎到下列4个方法.</p> <p><p>write()</p></p> <p><p>writeln()<br>上面两个方法都是接受一个字符串参数,writeln()额外在字符串写入后再写入一个换行符</p></p> <p>注意!:如果要用于写入<b><script></script></b>则要对<b></script></b>进行转义=><b></script></b>,防止script标签被提前闭合导致无法执行;如果在文档接在结束后再调用则会导致整个页面重写.</p> <p><p>open()</p></p> <p><p>close()<br>上述两个方法用于打开和关闭网页的输出流,如果在页面加载期间使用write()和writeln()则不需要用到这两个方法(严格型的XHTML文档不支持文档写入)</p></p> </div> <div class="mt-64 tags-seach" > <div class="tags-info"> <a style="width:120px;" title="私有云" href="https://www.ucloudstack.com/?ytag=seo">私有云</a> <a style="width:120px;" title="GPU服务器" href="https://www.ucloud.cn/site/active/gpu.html?ytag=seo">GPU服务器</a> <a style="width:120px;" title="第十章" href="https://www.ucloud.cn/yun/tag/dishizhang/">第十章</a> <a style="width:120px;" title="javascript dom" href="https://www.ucloud.cn/yun/tag/javascript dom/">javascript dom</a> <a style="width:120px;" title="javascript dom 编程艺术" href="https://www.ucloud.cn/yun/tag/javascript dom bianchengyishu/">javascript dom 编程艺术</a> <a style="width:120px;" title="javascript遍历dom" href="https://www.ucloud.cn/yun/tag/javascriptbianlidom/">javascript遍历dom</a> </div> </div> <div class="entry-copyright mb-30"> <p class="mb-15"> 文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。</p> <p>转载请注明本文地址:https://www.ucloud.cn/yun/91034.html</p> </div> <ul class="pre-next-page"> <li class="ellipsis"><a class="hpf" href="https://www.ucloud.cn/yun/91033.html">上一篇:js编程基础</a></li> <li class="ellipsis"><a class="hpf" href="https://www.ucloud.cn/yun/91035.html">下一篇:React Router 学习手册(基础篇)</a></li> </ul> </div> <div class="about_topicone-mid"> <h3 class="top-com-title mb-0"><span data-id="0">相关文章</span></h3> <ul class="com_white-left-mid atricle-list-box"> <li> <div class="atricle-list-right"> <h2 class="ellipsis2"><a class="hpf" href="https://www.ucloud.cn/yun/91031.html"><b><em>JavaScript</em><em>高程</em><em>第</em><em>十章</em>:<em>DOM</em>(中)</b></a></h2> <p class="ellipsis2 good">摘要:主要介绍不常用的类型这里介绍我们的其他类型包括以下几个类型类型类型类型类型类型类型类型文本节点由类型表示特征值为为为节点包含的文本是一个不支持没有子节点我们可以通过访问节点包含的文本方法将添加到节点末尾从指定位置开始删除个字符从指定 主要介绍不常用的DOM类型 这里介绍我们的其他类型,包括以下几个类型: Text类型 Comment类型 CDATASection类型 Document...</p> <div class="com_white-left-info"> <div class="com_white-left-infol"> <a href="https://www.ucloud.cn/yun/u-312.html"><img src="https://www.ucloud.cn/yun/data/avatar/000/00/03/small_000000312.jpg" alt=""><span class="layui-hide64">suosuopuo</span></a> <time datetime="">2019-08-22 10:40</time> <span><i class="fa fa-commenting"></i>评论0</span> <span><i class="fa fa-star"></i>收藏0</span> </div> </div> </div> </li> <li> <div class="atricle-list-right"> <h2 class="ellipsis2"><a class="hpf" href="https://www.ucloud.cn/yun/97362.html"><b><em>高程</em>3总结#<em>第</em>1章<em>JavaScript</em>简介</b></a></h2> <p class="ellipsis2 good">摘要:简介简史诞生于年,当时主要负责表单的输入验证。实现一个完整的由三部分组成核心文档对象模型浏览器对象模型就是对实现该标准规定的各个方面内容的语言的描述。把整个页面映射为一个多层节点结构。由万维网联盟规划。主要目标是映射文档的结构。 JavaScript简介 JavaScript简史 JavaScript诞生于1995年,当时主要负责表单的输入验证。 如果没有表单验证的功能,填入信息之...</p> <div class="com_white-left-info"> <div class="com_white-left-infol"> <a href="https://www.ucloud.cn/yun/u-1536.html"><img src="https://www.ucloud.cn/yun/data/avatar/000/00/15/small_000001536.jpg" alt=""><span class="layui-hide64">betacat</span></a> <time datetime="">2019-08-23 11:43</time> <span><i class="fa fa-commenting"></i>评论0</span> <span><i class="fa fa-star"></i>收藏0</span> </div> </div> </div> </li> <li> <div class="atricle-list-right"> <h2 class="ellipsis2"><a class="hpf" href="https://www.ucloud.cn/yun/97997.html"><b><em>高程</em>3总结#<em>第</em>18章<em>JavaScript</em>与XML</b></a></h2> <p class="ellipsis2 good">摘要:在基于使用命名空间的文档求值时,需要使用对象。第四个参数的取值类型是下列常量之一,返回与表达式匹配的数据类型。,返回字符串值。这是最常用的结果类型。集合中节点的次序与它们在文档中的次序一致。 JavaScript与XML 浏览器对XML DOM的支持 DOM2级核心 在通过JavaScript处理XML时,通常只使用参数root,因为这个参数指定的是XML DOM文档元素的标签名 v...</p> <div class="com_white-left-info"> <div class="com_white-left-infol"> <a href="https://www.ucloud.cn/yun/u-1653.html"><img src="https://www.ucloud.cn/yun/data/avatar/000/00/16/small_000001653.jpg" alt=""><span class="layui-hide64">gaosboy</span></a> <time datetime="">2019-08-23 12:09</time> <span><i class="fa fa-commenting"></i>评论0</span> <span><i class="fa fa-star"></i>收藏0</span> </div> </div> </div> </li> <li> <div class="atricle-list-right"> <h2 class="ellipsis2"><a class="hpf" href="https://www.ucloud.cn/yun/80621.html"><b>Event Handler 事件处理程序 1 ---《<em>高程</em>3》</b></a></h2> <p class="ellipsis2 good">摘要:为属性赋值匿名函数事件作用域使用级方法指定的事件处理程序被认为是元素的方法。最后这个布尔值参数如果是,表示在捕获阶段调用事件处理程序如果是,表示在冒泡阶段调用事件处理程序。 事件捕获和事件冒泡 DOM2级事件规定的事件流包括三个阶段:事件捕获、处于目标阶段和事件冒泡。首先发生的是事件捕获,从外部节点到内部节点依次遍历,为截获事件提供了机会。然后是实际的目标接收到事件。最后一个阶段是冒泡...</p> <div class="com_white-left-info"> <div class="com_white-left-infol"> <a href="https://www.ucloud.cn/yun/u-1107.html"><img src="https://www.ucloud.cn/yun/data/avatar/000/00/11/small_000001107.jpg" alt=""><span class="layui-hide64">WalkerXu</span></a> <time datetime="">2019-08-20 11:31</time> <span><i class="fa fa-commenting"></i>评论0</span> <span><i class="fa fa-star"></i>收藏0</span> </div> </div> </div> </li> <li> <div class="atricle-list-right"> <h2 class="ellipsis2"><a class="hpf" href="https://www.ucloud.cn/yun/50115.html"><b>Event Handler 事件处理程序 1 ---《<em>高程</em>3》</b></a></h2> <p class="ellipsis2 good">摘要:为属性赋值匿名函数事件作用域使用级方法指定的事件处理程序被认为是元素的方法。最后这个布尔值参数如果是,表示在捕获阶段调用事件处理程序如果是,表示在冒泡阶段调用事件处理程序。 事件捕获和事件冒泡 DOM2级事件规定的事件流包括三个阶段:事件捕获、处于目标阶段和事件冒泡。首先发生的是事件捕获,从外部节点到内部节点依次遍历,为截获事件提供了机会。然后是实际的目标接收到事件。最后一个阶段是冒泡...</p> <div class="com_white-left-info"> <div class="com_white-left-infol"> <a href="https://www.ucloud.cn/yun/u-1043.html"><img src="https://www.ucloud.cn/yun/data/avatar/000/00/10/small_000001043.jpg" alt=""><span class="layui-hide64">wujl596</span></a> <time datetime="">2019-08-01 15:47</time> <span><i class="fa fa-commenting"></i>评论0</span> <span><i class="fa fa-star"></i>收藏0</span> </div> </div> </div> </li> </ul> </div> <div class="topicone-box-wangeditor"> <h3 class="top-com-title mb-64"><span>发表评论</span></h3> <div class="xcp-publish-main flex_box_zd"> <div class="unlogin-pinglun-box"> <a href="javascript:login()" class="grad">登陆后可评论</a> </div> </div> </div> <div class="site-box-content"> <div class="site-content-title"> <h3 class="top-com-title mb-64"><span>0条评论</span></h3> </div> <div class="pages"></ul></div> </div> </div> <div class="layui-col-md4 layui-col-lg3 com_white-right site-wrap-right"> <div class=""> <div class="com_layuiright-box user-msgbox"> <a href="https://www.ucloud.cn/yun/u-657.html"><img src="https://www.ucloud.cn/yun/data/avatar/000/00/06/small_000000657.jpg" alt=""></a> <h3><a href="https://www.ucloud.cn/yun/u-657.html" rel="nofollow">xcold</a></h3> <h6>男<span>|</span>高级讲师</h6> <div class="flex_box_zd user-msgbox-atten"> <a href="javascript:attentto_user(657)" id="attenttouser_657" class="grad follow-btn notfollow attention">我要关注</a> <a href="javascript:login()" title="发私信" >我要私信</a> </div> <div class="user-msgbox-list flex_box_zd"> <h3 class="hpf">TA的文章</h3> <a href="https://www.ucloud.cn/yun/ut-657.html" class="box_hxjz">阅读更多</a> </div> <ul class="user-msgbox-ul"> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/123722.html">【LeetCode 二叉树专项】把二叉搜索树转换为累加树(538)</a></h3> <p>阅读 2987<span>·</span>2021-11-18 10:02</p></li> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/122249.html">UCloud金秋狂欢盛典-乌兰察布上新首促,快杰共享型低至3元/1个月或37元/年-老刘博客</a></h3> <p>阅读 1232<span>·</span>2021-10-12 10:08</p></li> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/122120.html">Docker安装InfluxDB_用户名密码和策略使用</a></h3> <p>阅读 860<span>·</span>2021-10-11 10:58</p></li> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/122098.html">安装鸿蒙开发工具-DevEco Studio</a></h3> <p>阅读 1038<span>·</span>2021-10-11 10:57</p></li> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/121761.html">golang实现仪表控制-visa32.dll方式</a></h3> <p>阅读 944<span>·</span>2021-10-08 10:04</p></li> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/121543.html">【C++从0到1】新手都能看懂的C++入门(上篇),建议收藏</a></h3> <p>阅读 1736<span>·</span>2021-09-29 09:35</p></li> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/120585.html">弹性云主机是什么原因-电信云主机是什么?</a></h3> <p>阅读 590<span>·</span>2021-09-22 15:44</p></li> <li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/119030.html">微软宣布将于 9 月 22 日举行 Surface 和 Windows 11 活动</a></h3> <p>阅读 1002<span>·</span>2021-09-03 10:30</p></li> </ul> </div> <!-- 文章详情右侧广告--> <div class="com_layuiright-box"> <h6 class="top-com-title"><span>最新活动</span></h6> <div class="com_adbox"> <div class="layui-carousel" id="right-item"> <div carousel-item> <div> <a href="https://www.ucloud.cn/site/active/kuaijiesale.html?ytag=seo" rel="nofollow"> <img src="https://www.ucloud.cn/yun/data/attach/240506/zYeoGo8M.png" alt="云服务器"> </a> </div> <div> <a href="https://www.ucloud.cn/site/active/gpu.html?ytag=seo" rel="nofollow"> <img src="https://www.ucloud.cn/yun/data/attach/240506/29R6rrOS.png" alt="GPU服务器"> </a> </div> <div> <a href="https://www.ucloud.cn/site/active/kuaijiesale.html?ytag=seo#global-uhost" rel="nofollow"> <img src="https://www.ucloud.cn/yun/data/attach/240506/FFBiRWaT.png" alt="海外云主机"> </a> </div> <div> <a href="https://www.ucloudstack.com/?ytag=seo" rel="nofollow"> <img src="https://www.ucloud.cn/yun/data/attach/240506/VEgKnwRX.png" alt="私有云"> </a> </div> <div> <a href="https://www.ucloud.cn/site/active/new/uhybrid.html?ytag=seo#datacenter" rel="nofollow"> <img src="https://www.ucloud.cn/yun/data/attach/240506/Z1o6CMPK.png" alt="服务器托管"> </a> </div> </div> </div> </div> <!-- banner结束 --> <div class="adhtml"> </div> <script> $(function(){ $.ajax({ type: "GET", url:"https://www.ucloud.cn/yun/ad/getad/1.html", cache: false, success: function(text){ $(".adhtml").html(text); } }); }) </script> </div> </div> </div> </div> </div> </section> <!-- wap拉出按钮 --> <div class="site-tree-mobile layui-hide"> <i class="layui-icon layui-icon-spread-left"></i> </div> <!-- wap遮罩层 --> <div class="site-mobile-shade"></div> <!--付费阅读 --> <div id="payread"> <div class="layui-form-item">阅读需要支付1元查看</div> <div class="layui-form-item"><button class="btn-right">支付并查看</button></div> </div> <script> var prei=0; $(".site-seo-depict pre").each(function(){ var html=$(this).html().replace("<code>","").replace("</code>","").replace('<code class="javascript hljs" codemark="1">',''); $(this).attr('data-clipboard-text',html).attr("id","pre"+prei); $(this).html("").append("<code>"+html+"</code>"); prei++; }) $(".site-seo-depict img").each(function(){ if($(this).attr("src").indexOf('data:image/svg+xml')!= -1){ $(this).remove(); } }) $("LINK[href*='style-49037e4d27.css']").remove(); $("LINK[href*='markdown_views-d7a94ec6ab.css']").remove(); layui.use(['jquery', 'layer','code'], function(){ $("pre").attr("class","layui-code"); $("pre").attr("lay-title",""); $("pre").attr("lay-skin",""); layui.code(); $(".layui-code-h3 a").attr("class","copycode").html("复制代码 ").attr("onclick","copycode(this)"); }); function copycode(target){ var id=$(target).parent().parent().attr("id"); var clipboard = new ClipboardJS("#"+id); clipboard.on('success', function(e) { e.clearSelection(); alert("复制成功") }); clipboard.on('error', function(e) { alert("复制失败") }); } //$(".site-seo-depict").html($(".site-seo-depict").html().slice(0, -5)); </script> <link rel="stylesheet" type="text/css" href="https://www.ucloud.cn/yun/static/js/neweditor/code/styles/tomorrow-night-eighties.css"> <script src="https://www.ucloud.cn/yun/static/js/neweditor/code/highlight.pack.js" type="text/javascript"></script> <script src="https://www.ucloud.cn/yun/static/js/clipboard.js"></script> <script>hljs.initHighlightingOnLoad();</script> <script> function setcode(){ var _html=''; document.querySelectorAll('pre code').forEach((block) => { var _tmptext=$.trim($(block).text()); if(_tmptext!=''){ _html=_html+_tmptext; console.log(_html); } }); } </script> <script> function payread(){ layer.open({ type: 1, title:"付费阅读", shadeClose: true, content: $('#payread') }); } // 举报 function jupao_tip(){ layer.open({ type: 1, title:false, shadeClose: true, content: $('#jubao') }); } $(".getcommentlist").click(function(){ var _id=$(this).attr("dataid"); var _tid=$(this).attr("datatid"); $("#articlecommentlist"+_id).toggleClass("hide"); var flag=$("#articlecommentlist"+_id).attr("dataflag"); if(flag==1){ flag=0; }else{ flag=1; //加载评论 loadarticlecommentlist(_id,_tid); } $("#articlecommentlist"+_id).attr("dataflag",flag); }) $(".add-comment-btn").click(function(){ var _id=$(this).attr("dataid"); $(".formcomment"+_id).toggleClass("hide"); }) $(".btn-sendartcomment").click(function(){ var _aid=$(this).attr("dataid"); var _tid=$(this).attr("datatid"); var _content=$.trim($(".commenttext"+_aid).val()); if(_content==''){ alert("评论内容不能为空"); return false; } var touid=$("#btnsendcomment"+_aid).attr("touid"); if(touid==null){ touid=0; } addarticlecomment(_tid,_aid,_content,touid); }) $(".button_agree").click(function(){ var supportobj = $(this); var tid = $(this).attr("id"); $.ajax({ type: "GET", url:"https://www.ucloud.cn/yun/index.php?topic/ajaxhassupport/" + tid, cache: false, success: function(hassupport){ if (hassupport != '1'){ $.ajax({ type: "GET", cache:false, url: "https://www.ucloud.cn/yun/index.php?topic/ajaxaddsupport/" + tid, success: function(comments) { supportobj.find("span").html(comments+"人赞"); } }); }else{ alert("您已经赞过"); } } }); }); function attenquestion(_tid,_rs){ $.ajax({ //提交数据的类型 POST GET type:"POST", //提交的网址 url:"https://www.ucloud.cn/yun/favorite/topicadd.html", //提交的数据 data:{tid:_tid,rs:_rs}, //返回数据的格式 datatype: "json",//"xml", "html", "script", "json", "jsonp", "text". //在请求之前调用的函数 beforeSend:function(){}, //成功返回之后调用的函数 success:function(data){ var data=eval("("+data+")"); console.log(data) if(data.code==2000){ layer.msg(data.msg,function(){ if(data.rs==1){ //取消收藏 $(".layui-layer-tips").attr("data-tips","收藏文章"); $(".layui-layer-tips").html('<i class="fa fa-heart-o"></i>'); } if(data.rs==0){ //收藏成功 $(".layui-layer-tips").attr("data-tips","已收藏文章"); $(".layui-layer-tips").html('<i class="fa fa-heart"></i>') } }) }else{ layer.msg(data.msg) } } , //调用执行后调用的函数 complete: function(XMLHttpRequest, textStatus){ postadopt=true; }, //调用出错执行的函数 error: function(){ //请求出错处理 postadopt=false; } }); } </script> <footer> <div class="layui-container"> <div class="flex_box_zd"> <div class="left-footer"> <h6><a href="https://www.ucloud.cn/"><img src="https://www.ucloud.cn/yun/static/theme/ukd//images/logo.png" alt="UCloud (优刻得科技股份有限公司)"></a></h6> <p>UCloud (优刻得科技股份有限公司)是中立、安全的云计算服务平台,坚持中立,不涉足客户业务领域。公司自主研发IaaS、PaaS、大数据流通平台、AI服务平台等一系列云计算产品,并深入了解互联网、传统企业在不同场景下的业务需求,提供公有云、混合云、私有云、专有云在内的综合性行业解决方案。</p> </div> <div class="right-footer layui-hidemd"> <ul class="flex_box_zd"> <li> <h6>UCloud与云服务</h6> <p><a href="https://www.ucloud.cn/site/about/intro/">公司介绍</a></p> <p><a href="https://zhaopin.ucloud.cn/" >加入我们</a></p> <p><a href="https://www.ucloud.cn/site/ucan/onlineclass/">UCan线上公开课</a></p> <p><a href="https://www.ucloud.cn/site/solutions.html" >行业解决方案</a></p> <p><a href="https://www.ucloud.cn/site/pro-notice/">产品动态</a></p> </li> <li> <h6>友情链接</h6> <p><a href="https://www.compshare.cn/?ytag=seo">GPU算力平台</a></p> <p><a href="https://www.ucloudstack.com/?ytag=seo">UCloud私有云</a></p> <p><a href="https://www.surfercloud.com/">SurferCloud</a></p> <p><a href="https://www.uwin-link.com/">工厂仿真软件</a></p> <p><a href="https://pinex.it/">Pinex</a></p> <p><a href="https://www.picpik.ai/zh">AI绘画</a></p> </li> <li> <h6>社区栏目</h6> <p><a href="https://www.ucloud.cn/yun/column/index.html">专栏文章</a></p> <p><a href="https://www.ucloud.cn/yun/udata/">专题地图</a></p> </li> <li> <h6>常见问题</h6> <p><a href="https://www.ucloud.cn/site/ucsafe/notice.html" >安全中心</a></p> <p><a href="https://www.ucloud.cn/site/about/news/recent/" >新闻动态</a></p> <p><a href="https://www.ucloud.cn/site/about/news/report/">媒体动态</a></p> <p><a href="https://www.ucloud.cn/site/cases.html">客户案例</a></p> <p><a href="https://www.ucloud.cn/site/notice/">公告</a></p> </li> <li> <span><img src="https://static.ucloud.cn/7a4b6983f4b94bcb97380adc5d073865.png" alt="优刻得"></span> <p>扫扫了解更多</p></div> </div> <div class="copyright">Copyright © 2012-2023 UCloud 优刻得科技股份有限公司<i>|</i><a rel="nofollow" href="http://beian.miit.gov.cn/">沪公网安备 31011002000058号</a><i>|</i><a rel="nofollow" href="http://beian.miit.gov.cn/"></a> 沪ICP备12020087号-3</a><i>|</i> <script type="text/javascript" src="https://gyfk12.kuaishang.cn/bs/ks.j?cI=197688&fI=125915" charset="utf-8"></script> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?290c2650b305fc9fff0dbdcafe48b59d"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> <!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=G-DZSMXQ3P9N"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-DZSMXQ3P9N'); </script> <script> (function(){ var el = document.createElement("script"); el.src = "https://lf1-cdn-tos.bytegoofy.com/goofy/ttzz/push.js?99f50ea166557aed914eb4a66a7a70a4709cbb98a54ecb576877d99556fb4bfc3d72cd14f8a76432df3935ab77ec54f830517b3cb210f7fd334f50ccb772134a"; el.id = "ttzz"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(el, s); })(window) </script></div> </div> </footer> </body> <script src="https://www.ucloud.cn/yun/static/theme/ukd/js/common.js"></script> <<script type="text/javascript"> $(".site-seo-depict *,.site-content-answer-body *,.site-body-depict *").css("max-width","100%"); </script> </html>