JavaScript学习笔记--BOM&&DOM(JavaScript高级程序设计第4版)

JavaScript学习笔记--BOM&&DOM(JavaScript高级程序设计第4版),第1张

BOM&&DOM基础知识 `BOM``window对象``Global对象作用域``窗口关系``窗口位置与像素比``窗口大小``视口位置``导航与打开新窗口``定时器``setTimeout()` `location对象``查询字符串`` *** 作地址` `navigator对象``检测插件`` *** 作系统`navigator.platform `screen对象``history对象``导航``length属性``历史状态管理` `小结` `客户端检测``能力检测``用户代理检测``用户代理的历史` `浏览器分析``小结` `DOM``节点层级``Node类型``值属性``关系属性(关系指针)和方法`` *** 纵节点``其他方法` `document类型``访问文档子节点``文档信息``定位(获取)元素``DOM兼容性检测``文档写入` `Element类型``HTML元素``取得属性``attributes属性``创建元素``元素后代` `Text类型``DocumentType类型``DOM编程``动态脚本``动态样式``使用NodeList``MutationObserver接口``observer()方法` `小结` `DOM *** 作的扩展``querySelector()``querySelectorAll()``HTML5`

BOM window对象

window对象代表浏览器实例。window对象在浏览器中有两重身份,一个是ECMAScript中的Global对象,另一个就是浏览器窗口的JavaScript接口。这意味着网页中定义的所有对象、变量和函数都以window作为其Global对象

Global对象作用域 通过var声明的所有全局变量和函数都会变成window对象的属性和方法。如果在这里使用let或const替代var,则不会把变量添加给全局对象。可以在window对象上查询是否存在可能未声明的变量。js中有很多对象暴露在全局作用域内,作为window的属性,例如locationhistory窗口关系 top指向最外层窗口,即浏览器窗口本身parent对象指向当前窗口的父窗口,如果是最外层就等于topshelf对象始终指向window 窗口位置与像素比

现代浏览器提供了screenLeftscreenTop属性,用于表示窗口相对于屏幕左侧顶部的位置,返回值的单位是CSS像素

窗口大小 innerWidth、innerHeight、outerWidth和outerHeight。outerWidth和outerHeight返回浏览器窗口自身的大小(不管是在最外层window上使用,还是在窗格中使用)。innerWidth和innerHeight返回浏览器窗口中页面视口的大小(不包含浏览器边框和工具栏)。document.documentElement.clientWidth和document.documentElement.clientHeight返回页面视口的宽度和高度视口位置 度量文档相对于视口滚动距离的属性有两对,返回相等的值:window.pageXoffset/window. scrollX和window.pageYoffset/window.scrollY。可以使用scroll()、scrollTo()和scrollBy()方法滚动页面。 导航与打开新窗口

window.open()方法可以用于导航到指定URL,也可以用于打开新浏览器窗口。这个方法接收4个参数:要加载的URL、目标窗口、特性字符串和表示新窗口在浏览器历史记录中是否替代当前加载页面的布尔值。

如果window.open()的第二个参数不是已有窗口,则会打开一个新窗口或标签页。第三个参数,即特性字符串,用于指定新窗口的配置。特性字符串是一个逗号分隔的设置字符串,如果没有传第三个参数,则新窗口(或标签页)会带有所有默认的浏览器特性(工具栏、地址栏、状态栏等都是默认配置)。window.open(“http://www.wrox.com/”,“wroxWindow”,“height=400, width=400, top=10,left=10, resizable=yes”);window.open()方法返回一个对新建窗口的引用。 定时器

JavaScript在浏览器中是单线程执行的,但允许使用定时器指定在某个时间之后每隔一段时间就执行相应的代码。setTimeout()用于指定在一定时间后执行某些代码,而setInterval()用于指定每隔一段时间执行某些代码。

setTimeout() setTimeout()方法通常接收两个参数:要执行的代码在执行回调函数前等待的时间(毫秒)。不通常的:setTimeout接受从第三个参数之后的所有参数并且传递作为函数入参传递给第一个参数(如果第一个参数是函数)this指针。所有超时执行的代码(函数)都会在全局作用域中的一个匿名函数中运行,因此函数中的this值在非严格模式下始终指向window,而在严格模式下是undefined。如果给setTimeout()提供了一个箭头函数,那么this会保留为定义它时所在的词汇作用域。

第二个参数是要等待的毫秒数,而不是要执行代码的确切时间。
JavaScript是单线程的,所以每次只能执行一段代码。为了调度不同代码的执行,JavaScript维护了一个任务队列。其中的任务会按照添加到队列的先后顺序执行。setTimeout()的第二个参数只是告诉JavaScript引擎在指定的毫秒数过后把任务添加到这个队列。如果队列是空的,则会立即执行该代码。如果队列不是空的,则代码必须等待前面的任务执行完才能执行。
调用setTimeout()时,会返回一个表示该超时排期的数值ID。这个超时ID被排期执行代码的唯一标识符可用于取消该任务。要取消等待中的排期任务,可以调用clearTimeout()方法传入超时id

let timeoutId = setTimeout(() => alert("Hello world! "), 1000);
// 取消超时任务
clearTimeout(timeoutId);
location对象

location是最有用的BOM对象之一,提供了当前窗口中加载文档的信息,以及通常的导航功能。这个对象独特的地方在于,它既是window的属性也是document的属性。也就是说,window.location和document.location指向同一个对象。
假设浏览器当前加载的URL是http://foouser:barpassword@www.wrox.com:80/WileyCDA/?q=javascript#contents, location对象的内容如下表所示

属性意义
location.hash“#contents ”URL散列值,#号后面跟0或多个字符串,如果没有则为空字符串
location.hostwww.wrong.com:80服务器名及端口号
location.hostnamewww.wrong.com服务器名
location.hrefhttp://foouser:barpassword@www.wrox.com:80/WileyCDA/?q=javascript#contents当前加载页面的完整URL。location的toString方法返回这个值
location.pathname/WileyCDA/资源路径名
location.port80端口号
location.protocolhttp协议
location.search?q=javascript查询字符串
location.usernamefoouser域前用户名
location.passwordbarpassword域前指定密码
location.originhttp://www.wrong.comURL源地址
查询字符串

location.search返回了从问号开始直到URL末尾的所有内容,

let getQueryStringArgs = function() {
    // 取得没有开头问号的查询字符串      
    let qs = (location.search.length > 0 ? location.search.substring(1) : ""),
    // 保存数据的对象        
    args = {};      
    // 把每个参数添加到args对象      
    for (let item of qs.split("&").map(kv => kv.split("="))) {        
        let name = decodeURIComponent(item[0]),          
        value = decodeURIComponent(item[1]);       
        if (name.length) {          
            args[name] = value;       
        }      
    }      
    return args;    
}
*** 作地址 可以通过修改location对象修改浏览器的地址。首先,最常见的是使用assign()方法并传入一个URL,location.assign(“http://www.wrox.com”);这行代码会立即启动导航到新URL的 *** 作,同时在浏览器历史记录中增加一条记录。如果给location.href或window.location设置一个URL,也会以同一个URL值调用assign()方法。修改location对象的属性也会修改当前加载的页面。其中,hash、search、hostname、pathname和port属性被设置为新值之后都会修改当前URL除了hash之外,只要修改location的一个属性,就会导致页面重新加载新URL。注意 修改hash的值会在浏览器历史中增加一条新记录如果不希望增加历史记录,可以使用replace()方法。这个方法接收一个URL参数,但重新加载后不会增加历史记录。调用replace()之后,用户不能回到前一页。最后一个修改地址的方法是reload(),它能重新加载当前显示的页面。调用reload()而不传参数,页面会以最有效的方式重新加载。如果页面自上次请求以来没有修改过,浏览器可能会从缓存中加载页面。如果想强制从服务器重新加载,可以给reload()传个true navigator对象

只要浏览器启用JavaScript, navigator对象就一定存在。但是与其他BOM对象一样,每个浏览器都支持自己的属性。navigator对象的属性通常用于确定浏览器的类型。

检测插件

navigator.plugins

*** 作系统navigator.platform

navigator.platform属性是一个字符串,通常表示浏览器所在的 *** 作系统。

screen对象

window的另一个属性screen对象,是为数不多的几个在编程中很少用的JavaScript对象。这个对象中保存的纯粹是客户端能力信息,也就是浏览器窗口外面的客户端显示器的信息,比如像素宽度和像素高度。

history对象

history对象表示当前窗口首次使用以来用户的导航历史记录。因为history是window的属性,所以每个window都有自己的history对象。

导航 go()方法可以在用户历史记录中沿任何方向导航,可以前进也可以后退。这个方法只接收一个参数,这个参数可以是一个整数,表示前进或后退多少步。负值表示在历史记录中后退(类似点击浏览器的“后退”按钮),而正值表示在历史记录中前进(类似点击浏览器的“前进”按钮)go()有两个简写方法:back()和forward()。顾名思义,这两个方法模拟了浏览器的后退按钮和前进按钮: length属性 history对象还有一个length属性,表示历史记录中有多个条目。这个属性反映了历史记录的数量,包括可以前进和后退的页面。注意如果页面URL发生变化,则会在历史记录中生成一个新条目。对于2009年以来发布的主流浏览器,这包括改变URL的散列值(因此,把location.hash设置为一个新值会在这些浏览器的历史记录中增加一条记录)。这个行为常被单页应用程序框架用来模拟前进和后退,这样做是为了不会因导航而触发页面刷新历史状态管理

state

小结

浏览器对象模型(BOM, Browser Object Model)是以window对象为基础的,这个对象代表了浏览器窗口和页面可见的区域

要引用其他window对象,可以使用几个不同的窗口指针。通过location对象可以以编程方式 *** 纵浏览器的导航系统。通过设置这个对象上的属性,可以改变浏览器URL中的某一部分或全部。使用replace()方法可以替换浏览器历史记录中当前显示的页面,并导航到新URL。navigator对象提供关于浏览器的信息。提供的信息类型取决于浏览器,不过有些属性如userAgent是所有浏览器都支持的。BOM中的另外两个对象也提供了一些功能。screen对象中保存着客户端显示器的信息。这些信息通常用于评估浏览网站的设备信息。history对象提供了 *** 纵浏览器历史记录的能力,开发者可以确定历史记录中包含多少个条目,并以编程方式实现在历史记录中导航,而且也可以修改历史记录。 客户端检测 能力检测

能力检测(又称特性检测)即在JavaScript运行时中使用一套简单的检测逻辑,测试浏览器是否支持某种特性。能力检测最适合用于决定下一步该怎么做,而不一定能够作为辨识浏览器的标志

用户代理检测

用户代理检测通过浏览器的用户代理字符串确定使用的是什么浏览器。用户代理字符串包含在每个HTTP请求的头部,在JavaScript中可以通过navigator.userAgent访问。

用户代理的历史

HTTP规范(1.0和1.1)要求浏览器应该向服务器发送包含浏览器名称和版本信息的简短字符串。

Mosaic是早期Web浏览器的代表,其用户代理字符串相当简单,类似于:Mosaic/0.9Netscape Navigator 3和IE3。1996年,Netscape Navigator 3发布之后超过Mosaic成为最受欢迎的浏览器。Mozilla/Version(Platform; Encryption[; OS-or-CPUdescription])3.Netscape Communicator 4和IE4~8Gecko。Gecko渲染引擎是Firefox的核心。Gecko最初是作为通用Mozilla浏览器(即后来的Netscape 6)的一部分开发的。有一个针对Netscape 6的用户代理字符串规范,规定了未来的版本应该如何构造这个字符串。WebKit。2003年,苹果宣布将发布自己的浏览器Safari。Safari的渲染引擎叫WebKit,是基于Linux平台浏览器Konqueror使用的渲染引擎KHTML开发的。Chrome。谷歌的Chrome浏览器使用Blink作为渲染引擎,使用V8作为JavaScript引擎。Chrome的用户代理字符串包含所有WebKit的信息,另外又加上了Chrome及其版本的信息。 浏览器分析

想要知道自己代码运行在什么浏览器上,大部分开发者会分析window.navigator.userAgent返回的字符串值。所有浏览器都会提供这个值,如果相信这些返回值并基于给定的一组浏览器检测这个字符串,最终会得到关于浏览器和 *** 作系统的比较精确的结果。相比于能力检测,用户代理检测还是有一定优势的。能力检测可以保证脚本不必理会浏览器而正常执行。现代浏览器用户代理字符串使我们能够利用它们准确识别浏览器

小结 能力检测,在使用之前先测试浏览器的特定能力。例如,脚本可以在调用某个函数之前先检查它是否存在。这种客户端检测方式可以让开发者不必考虑特定的浏览器或版本,而只需关注某些能力是否存在。能力检测不能精确地反映特定的浏览器或版本。用户代理检测,通过用户代理字符串确定浏览器。用户代理字符串包含关于浏览器的很多信息,通常包括浏览器、平台、 *** 作系统和浏览器版本。用户代理字符串有一个相当长的发展史,很多浏览器都试图欺骗网站相信自己是别的浏览器。用户代理检测也比较麻烦,特别是涉及Opera会在代理字符串中隐藏自己信息的时候。即使如此,用户代理字符串也可以用来确定浏览器使用的渲染引擎以及平台,包括移动设备和游戏机。选择客户端检测方法时,首选是使用能力检测。特殊能力检测要放在次要位置,作为决定代码逻辑的参考。用户代理检测是最后一个选择,因为它过于依赖用户代理字符串。 DOM

文档对象模型(DOM, Document Object Model)是HTML和XML文档的编程接口。它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档。DOM表示由多层节点构成的文档,通过它开发者可以添加、删除和修改页面的各个部分。

节点层级

document节点表示每个文档的根节点。在HTML中,根节点的唯一子节点元素,我们称之为文档元素(documentElement)。文档元素是文档最外层的元素,所有其他元素都存在于这个元素之内。每个文档只能有一个文档元素。在HTML页面中,文档元素始终是元素

HTML中的每段标记都可以表示为这个树形结构中的一个节点元素节点表示HTML元素属性节点表示属性文档类型节点表示文档类型注释节点表示注释。DOM中总共有12种节点类型,这些类型都继承一种基本类型

Node类型

Node接口是所有DOM节点类型都必须实现的。Node接口在JavaScript中被实现为Node类型,JavaScript中,所有节点类型都继承Node类型,因此所有类型都共享相同的基本属性和方法。

值属性 nodetype属性,表示节点的类型,定义了12个常量(如Node.ELEMENT_NODE(1)、Node.ATTRIBUTE_NODE(2)…),结点类型可以通过与这些常量比较来确定nodeName属性,节点的标签名字nodeValue属性,对于一个元素来说,nodeName是标签名,nodeValue是null。 关系属性(关系指针)和方法 childNodes属性,其中包含一个NodeList实例,是一个类数组对象,可以用中括号访问,也可以用item()访问,具有length属性。NodeLisy对象独特的地方在于它其实是对一个DOM结构的查询,因此DON结构的变化会自动地在NodeList中反映出来,我们通常说NodeList是实时的活动对象,而不是第一次访问时所获得的内容的快照
    let firstChild = someNode.childNodes[0];
    let secondChild = someNode.childNodes.item(1);
    let count = someNode.childNodes.length;
parentNode属性,指向DOM树中的父元素childNodes中所有的节点都有同一个父元素,因此它们的parentNode属性都指向同一个节点。childNodes列表中的每个节点都是同一列表中其他节点的同胞节点。而使用previousSiblingnextSibling可以在这个列表的节点间导航firstChildlastChild属性。父节点它的第一个及最后一个子节点也有专门属性:firstChild和lastChild分别指向childNodes中的第一个和最后一个子节点someNode.firstChild的值始终等于someNode.childNodes[0],而someNode.lastChild的值始终等于someNode.childNodes[someNode.childNodes.length-1]。如果只有一个子节点,则firstChild和lastChild指向同一个节点。如果没有子节点,则firstChild和lastChild都是nullhasChildNodes(),这个方法如果返回true则说明节点有一个或多个子节点。比使用length更方便ownerDocument属性是一个指向代表整个文档的文档节点的指针。即返回document对象 *** 纵节点 appendChild(),用于在childNodes列表末尾添加节点。添加新节点会更新相关的关系指针,包括父节点和之前的最后一个子节点。appendChild()方法返回新添加的节点,如下所示:如果把文档中已经存在的节点传给appendChild(),则这个节点会从之前的位置被转移到新位置,一个节点不会在文档中同时出现两个或者更多地方,如果调用该方法传入父元素的第一个子节点,则该结点会成为父元素的最后一个节点。
    let returnedNode = someNode.appendChild(someNode.firstChild);   
    alert(returnedNode == someNode.firstChild);          // false 
    alert(returnedNode == someNode.lastChild);   // true
insertBefore()方法。这个方法接收两个参数:要插入的节点参照节点。插入的节点会变成参照节点的前一个同胞节点,并被返回。appendChild()和insertBefore()在插入节点时不会删除任何已有节点replaceChild()方法接收两个参数:要插入的节点要替换的节点要替换的节点被返回从文档树中完全移除要插入的节点取而代之。使用replaceChild()插入一个节点后,所有关系指针都会从被替换的节点复制过来。
    // 替换第一个子节点
    let returnedNode = someNode.replaceChild(newNode, someNode.firstChild);
    // 替换最后一个子节点
    returnedNode = someNode.replaceChild(newNode, someNode.lastChild);
removeChild()方法。这个方法接收一个参数,即要移除的节点。被移除的节点会被返回。
上面介绍的4个方法都用于 *** 纵某个节点的子元素,也就是说使用它们之前必须先取得父节点(使用前面介绍的parentNode属性)。 其他方法 cloneNode(),会返回与调用它的节点一模一样的节点。cloneNode()方法接收一个布尔值参数,表示是否深复制。在传入true参数时,会进行深复制,即复制节点及其整个子DOM树。如果传入false,则只会复制调用该方法的节点。复制返回的节点属于文档所有,但尚未指定父节点,所以可称为孤儿节点(orphan)。可以通过appendChild()、insertBefore()或replaceChild()方法把孤儿节点添加到文档中。cloneNode()方法不会复制添加到DOM节点的JavaScript属性,比如事件处理程序。这个方法只复制HTML属性,以及可选地复制子节点。normalize()。这个方法唯一的任务就是处理文档子树中的文本节点,处理不包含文本的文本节点 document类型

Document类型是JavaScript中表示文档节点的类型。document是window对象的属性,因此是一个全局对象。document对象可用于获取关于页面的信息以及 *** 纵其外观和底层结构

nodeType等于9;nodeName值为"#document";nodeValue值为null;parentNode值为null;ownerDocument值为null;子节点可以是DocumentType(最多一个)、Element(最多一个)、ProcessingInstruction或Comment类型。 访问文档子节点 documentElement属性,始终指向HTML页面中的元素
    let html = document.documentElement;      
    // 取得对的引用    
    alert(html === document.childNodes[0]);   // true
    alert(html === document.firstChild);      // true
body属性,直接指向元素document.body
    let body = document.body;
doctype属性标签是文档中独立的部分,其信息可以通过doctype属性(在浏览器中是document.doctype)来访问 文档信息 title,包含元素</code>中的文本,通常显示在<code>浏览器窗口</code>或<code>标签页</code>的标题栏。通过这个属性可以<code>读写页面的标题</code>,修改后的标题也会反映在浏览器标题栏上。 <pre><code ><span >// 修改文档标题 </span> document<span >.</span>title <span >=</span> <span >"New page title"</span><span >;</span> </code></pre> <code>URL</code>,包含当前页面的完整URL(地址栏中的URL)<code>domain</code>,包含页面的域名<code>referrer</code>,包含链接到当前页面的那个页面的URL。如果当前页面没有来源,则referrer属性包含空字符串。<br /> 所有这些信息<code>都可以在请求的HTTP头部信息</code>中获取,只是在<code>JavaScript</code>中通过这几个属性<code>暴露</code>出来而已 <pre><code > <span >// 取得完整的URL</span> <span >let</span> url <span >=</span> document<span >.</span><span >URL</span><span >;</span> <span >// 取得域名</span> <span >let</span> domain <span >=</span> document<span >.</span>domain<span >;</span> <span >// 取得来源</span> <span >let</span> referrer <span >=</span> document<span >.</span>referrer<span >;</span> </code></pre> <p><code>URL</code>跟<code>域名</code>是相关的。比如,如果<code>document.URL</code>是<code>http://www.wrox.com/WileyCDA/</code>,则<code>document.domain</code>就是<code>www.wrox.com</code>。这些属性中只有域名domain是可以修改,可以将域名修改为原域名中的子域名,不能给他设置为原域名中不包含的值,且一旦缩紧就不能够放松</p> <code>定位(获取)元素</code> <p>使用DOM最常见的情形可能就是<code>获取某个或某组元素的引用</code>,然后对它们执行某些 *** 作。</p> <code>getElementById()</code>方法接收一个参数,即要获取元素的<code>ID</code>,如果找到了则返回这个元素,如果没找到则返回null。<code>参数ID</code>必须跟元素在<code>页面中的id属性值</code>完全匹配,包括<code>大小写</code>。如果页面中存在<code>多个具有相同ID</code>的元素,则getElementById()返回在文档中出现的<code>第一个元素</code>。<code>getElementsByTagName()</code>是另一个常用来获取元素引用的方法。这个方法接收一个参数,即要获取元素的<code>标签名</code>,返回包含<code>零个或多个元素的NodeList</code>。这个方法返回一个HTMLCollection对象,与NodeList相似,他还有一个<code>namedItem()</code>方法来通过标签的name属性取得某一项的引用要取得文档中的<code>所有元素</code>,可以给<code>getElementsByTagName()</code>传入*。在JavaScript和CSS中,*一般被认为是匹配一切的字符。<code>getElementsByName()</code>。顾名思义,这个方法会返回具有给定name属性的所有元素。getElementsByName()方法最常用于<code>单选按钮</code>,因为同一字段的单选按钮必须具有相同的name属性才能确保把正确的值发送给服务器, <code>DOM兼容性检测</code> <p><code>document.implementation属性</code>是一个对象,其中提供了与浏览器DOM实现相关的信息和能力。DOM Level 1在document.implementation上只定义了一个方法,即<code>hasFeature()</code>。这个方法接收两个参数:特性名称和DOM版本。如果浏览器支持指定的特性和版本,则hasFeature()方法返回true,如下面的例子所示:</p> <pre><code ><span >let</span> hasXmlDom <span >=</span> document<span >.</span>implementation<span >.</span><span >hasFeature</span><span >(</span><span >"XML"</span><span >,</span> <span >"1.0"</span><span >)</span><span >;</span> </code></pre> <code>文档写入</code> <p>网页输出流中写入内容。这个能力对应4个方法:</p> write()writeln()open()close()<br /> 其中,<code>write()和writeln()方法</code>都接收一个字符串参数,可以将这个字符串写入网页中。write()简单地写入文本,而writeln()还会在字符串末尾追加一个换行符(\n)。这两个方法可以用来在页面<code>加载期间</code>向<code>页面</code>中<code>动态添加内容</code>。 <pre><code >document<span >.</span><span >write</span><span >(</span><span >""</span> <span >+</span> <span >(</span><span >new</span> <span >Date</span><span >(</span><span >)</span><span >)</span><span >.</span><span >toString</span><span >(</span><span >)</span> <span >+</span> <span >""</span><span >)</span><span >;</span> </code></pre> <p>write()和writeln()方法经常用于<code>动态包含外部资源</code>,如JavaScript文件。在包含JavaScript文件时,记住不能这样直接包含字符串<code>"</script>"</code>,因为这个字符串会被解释为脚本块的结尾,</p> <code>Element类型</code> <p>除了Document类型,Element类型就是Web开发中<code>最常用的类型</code>了。Element<code>表示XML</code>或<code>HTML元素</code>,对外暴露出<code>访问元素标签名、子节点和属性</code>的能力。</p> nodeType等于1;nodeName值为元素的标签名;nodeValue值为null;parentNode值为Document或Element对象;子节点可以是Element、Text、Comment、ProcessingInstruction、CDATASection、EntityReference类型。<br /> 可以通过nodeName或tagName属性来获取元素的标签名。这两个属性返回同样的值。先把标签名转换为全部小写后再比较。 <code>HTML元素</code> <p>继承的属性<br /> HTMLElement直接继承Element并增加了一些属性。</p> <code>id</code>,元素在文档中的唯一标识符;title,包含元素的额外信息,通常以提示条形式展示;lang,元素内容的语言代码(很少用);dir,语言的书写方向("ltr"表示从左到右,"rtl"表示从右到左,同样很少用);<code>className</code>,相当于class属性,用于指定元素的CSS类(因为class是ECMAScript关键字,所以不能直接用这个名字)。 <pre><code > <span >let</span> div <span >=</span> document<span >.</span><span >getElementById</span><span >(</span><span >"myDiv"</span><span >)</span><span >;</span> <span >alert</span><span >(</span>div<span >.</span>id<span >)</span><span >;</span> <span >// "myDiv" </span> <span >alert</span><span >(</span>div<span >.</span>className<span >)</span><span >;</span> <span >// "bd" </span> <span >alert</span><span >(</span>div<span >.</span>title<span >)</span><span >;</span> <span >// "Body text" </span> <span >alert</span><span >(</span>div<span >.</span>lang<span >)</span><span >;</span> <span >// "en" </span> <span >alert</span><span >(</span>div<span >.</span>dir<span >)</span><span >;</span> <span >// "ltr"`</span> </code></pre> <code>取得属性</code> <p>每个元素都有<code>零个或多个属性</code>,通常用于为元素或其内容附加更多信息。与属性相关的DOM方法主要有3个:<code>getAttribute()、setAttribute()和removeAttribute()</code>。这些方法主要用于<code> *** 纵属性</code>,包括在HTMLElement类型上定义的属性</p> <pre><code > <span >let</span> div <span >=</span> document<span >.</span><span >getElementById</span><span >(</span><span >"myDiv"</span><span >)</span><span >;</span> <span >alert</span><span >(</span>div<span >.</span><span >getAttribute</span><span >(</span><span >"id"</span><span >)</span><span >)</span><span >;</span> <span >// "myDiv" </span> <span >alert</span><span >(</span>div<span >.</span><span >getAttribute</span><span >(</span><span >"class"</span><span >)</span><span >)</span><span >;</span> <span >// "bd" </span> <span >alert</span><span >(</span>div<span >.</span><span >getAttribute</span><span >(</span><span >"title"</span><span >)</span><span >)</span><span >;</span> <span >// "Body text" </span> <span >alert</span><span >(</span>div<span >.</span><span >getAttribute</span><span >(</span><span >"lang"</span><span >)</span><span >)</span><span >;</span> <span >// "en" </span> <span >alert</span><span >(</span>div<span >.</span><span >getAttribute</span><span >(</span><span >"dir"</span><span >)</span><span >)</span><span >;</span> <span >// "ltr"</span> </code></pre> <p>通过<code>DOM对象访问的属性</code>中有两个返回的值跟使用<code>getAttribute()</code>取得的值不一样。首先是<code>style属性</code>,这个属性用于为元素<code>设定CSS样式</code>。在使用<code>getAttribute()访问style属性</code>时,返回的是<code>CSS字符串</code>。而在<code>通过DOM对象的属性访问</code>时,style属性返回的是一个<code>(CSSStyleDeclaration)对象</code>。DOM对象的style属性用于以编程方式读写元素样式,因此不会直接映射为元素中style属性的字符串值。<br /><br /> 第二个属性其实是一类,即<code>事件处理程序(或者事件属性)</code>,比如<code>onclick</code>。在<code>元素上</code>使用事件属性时(比如onclick),<code>属性的值</code>是<code>一段JavaScript</code>代码。如果使用<code>getAttribute()</code>访问<code>事件属性</code>,则返回的是<code>字符串形式的源代码</code>。而通过<code>DOM对象的属性</code>访问<code>事件属性</code>时返回的则是一个<code>JavaScript函数</code>(未指定该属性则返回null)。这是因为onclick及其他事件属性是可以接受函数作为值的。<br /><br /> 考虑到以上差异,开发者在进行<code>DOM编程</code>时通常会<code>放弃使用getAttribute()</code>而只使用<code>对象属性</code>。getAttribute()主要用于取得自定义属性的值。<br /><br /> <code>setAttribute()</code>,这个方法接收两个参数:要<code>设置的属性名和属性的值</code>。如果属性已经存在,则setAttribute()会以指定的值<code>替换</code>原来的值;如果<code>属性不存在</code>,则setAttribute()会以指定的值<code>创建该属性</code>。</p> <code>attributes属性</code> <p><code>Element类型</code>是唯一使用<code>attributes属性</code>的DOM节点类型。attributes属性包含一个<code>NamedNodeMap</code>实例,是一个类似NodeList的“实时”集合。元素的每个属性都表示为一个Attr节点,并保存在这个NamedNodeMap对象中</p> <code>创建元素</code> <p>可以使用<code>document.createElement()方法</code>创建新元素。这个方法接收一个参数,即要创建元素的<code>标签名</code>。</p> <pre><code > <span >let</span> div <span >=</span> document<span >.</span><span >createElement</span><span >(</span><span >"div"</span><span >)</span><span >;</span> </code></pre> <p>使用<code>createElement()方法</code>创建新元素的同时也会将其<code>ownerDocument属性设置为document</code>。此时,<code>可以再为其添加属性、添加更多子元素</code>。比如:</p> <pre><code > div<span >.</span>id <span >=</span> <span >"myNewDiv"</span><span >;</span> div<span >.</span>className <span >=</span> <span >"box"</span><span >;</span> </code></pre> <p>在新元素上设置这些属性<code>只会附加信息</code>。因为这个元素还<code>没有添加到文档树</code>,所以<code>不会影响浏览器显示</code>。要把元素<code>添加到文档树</code>,可以使用<code>appendChild()、insertBefore()或replaceChild()</code>。比如,以下代码会把刚才创建的元素添加到文档的<code><body></code>元素中:</p> <pre><code > document<span >.</span>body<span >.</span><span >appendChild</span><span >(</span>div<span >)</span><span >;</span> </code></pre> <p>元素<code>被添加到文档树</code>之后,浏览器会立即将其<code>渲染</code>出来。<code>之后</code>再对这个元素所做的<code>任何修改</code>,都会立即在浏览器中反映出来。</p> <code>元素后代</code> <p><code>childNodes属性</code>包含元素所有的子节点,这些子节点可能是<code>其他元素、文本节点、注释或处理指令</code>。考虑到这种情况,通常在执行某个 *** 作之后需要先<code>检测一下节点的nodeType</code>,如下所示:</p> <pre><code > <span >for</span> <span >(</span><span >let</span> i <span >=</span> <span >0</span><span >,</span> len <span >=</span> element<span >.</span>childNodes<span >.</span>length<span >;</span> i <span ><</span> len<span >;</span> <span >++</span>i<span >)</span> <span >{<!-- --></span> <span >if</span> <span >(</span>element<span >.</span>childNodes<span >[</span>i<span >]</span><span >.</span>nodeType <span >==</span> <span >1</span><span >)</span> <span >{<!-- --></span> <span >// 执行某个 *** 作</span> <span >}</span> <span >}</span> </code></pre> <p>以上代码会<code>遍历某个元素的子节点</code>,并且只在<code>nodeType等于1</code>(即Element节点)时执行某个 *** 作。<br /><br /> 要取得某个<code>元素的子节点和其他后代节点</code>,可以使用<code>元素的getElementsByTagName()</code>方法。在元素上调用这个方法与在文档上调用是一样的,只不过搜索范围限制在当前元素之内,即<code>只会返回当前元素的后代</code>。对于<code>前面</code>的例子,可以像下面这样取得<code>其所有的元素</code>:</p> <pre><code > <span >let</span> ul <span >=</span> document<span >.</span><span >getElementById</span><span >(</span><span >"myList"</span><span >)</span><span >;</span> <span >let</span> items <span >=</span> ul<span >.</span><span >getElementsByTagName</span><span >(</span><span >"li"</span><span >)</span><span >;</span> </code></pre> <p>这里例子中的<code>元素</code>只有<code>一级子节点</code>,如果它包含更多层级,则<code>所有层级中的元素</code>都会返回。</p> <code>Text类型</code> <p>Text节点由Text类型表示,包含按字面解释的纯文本,Text类型的节点具有以下特征:</p> nodeType等于3;nodeName值为"#text";nodeValue值为节点中包含的文本;parentNode值为Element对象;不支持子节点。<br /> Text节点中包含的文本可以通过<code>nodeValue属性</code>访问,也可以通过<code>data属性</code>访问, <code>DocumentType类型</code> <p>DocumentType类型的节点包含文档的文档类型(doctype)信息,具有以下特征:</p> nodeType等于10;nodeName值为文档类型的名称;nodeValue值为null;parentNode值为Document对象;不支持子节点。<br /> DocumentType对象保存在<code>document.doctype</code>属性中。 <code>DOM编程</code> <code>动态脚本</code> <p><code><script></code>元素用于向网页中插入JS代码,可以是arc属性包含的外部文件,也可以是作为该元素内容的源代码。注意通过innerHTML属性创建的<code><script></code>元素永远不会执行。</p> <code>动态样式</code> <p>css样式在HTML页面中可以通过两个元素加载,<code></code>元素用于包含CSS外部文件,<code><style></code>元素用于添加嵌入样式。动态样式也是页面初始加载时并不存在,而是在之后才添加到页面中的</p> <code>使用NodeList</code> <p>理解<code>NodeList对象和相关的NamedNodeMap、HTMLCollection</code>是理解DOM编程的关键。这三个集合类型都是<code>实时的</code>,意味着文档结构的变化会实时的在他们身上反映出来,他们的值始终代表最新的状态。因此最好限制操作NodeList的次数,因为每次查询都会搜索整个文档,最好把查询到的NodeList缓存起来。</p> <code>MutationObserver接口</code> <p>MutationObserver接口可以在DOM被修改时异步执行回调,使用它可以观察整个文档、DOM树的一部分</p> <code>observer()方法</code> <pre><code > <span >//创建一个观察者并配置它观察body元素上的属性变化</span> <span >let</span> observer <span >=</span> <span >new</span> <span >MutationObserver</span><span >(</span><span >(</span><span >)</span> <span >=></span> console<span >.</span><span >log</span><span >(</span><span >'<body> attributes changed'</span><span >)</span><span >)</span><span >;</span> observer<span >.</span><span >observe</span><span >(</span>document<span >.</span>body<span >,</span><span >{<!-- --></span><span >attributes</span> <span >:</span> <span >true</span><span >}</span><span >)</span><span >;</span> </code></pre> <p>首先通过调用<code>构造函数</code>并<code>传入一个回调函数</code>来<code>创建MutationObserver实例</code>,该实例还<code>不会关联DOM</code>的任何部分,要把它与DOM关联起来,需要<code>使用observe()方法</code>,接收<code>两个参数</code>:<code>要观察其变化的DOM结点</code>以及一个<code>MutationObserverInit</code>对象,MutationObserverInit对象<code>用于控制观察哪些方面</code>的变化,是一个<code>键值对</code>形式配置选项的字典。<br /><br /> 执行上述代码后,<code>body元素</code>上任何<code>属性</code>发生变化都会被这个MutationObserver实例发现。需要注意的是,回调中的console.log是<code>后执行</code>的,表明回调并非与<code>实际的DOM变化同步执行</code></p> <code>小结</code> <p>DOM由一系列节点类型构成,主要包括以下几种。</p> <code>Node</code>是基准节点类型,是文档一个部分的抽象表示,所有其他类型都继承Node。<code>Document</code>类型表示整个文档,对应树形结构的根节点。在JavaScript中,<code>document对象是Document的实例</code>,拥有查询和获取节点的很多方法。<code>Element</code>节点表示文档中所有HTML或XML元素,可以用来操作它们的内容和属性。其他节点类型分别表示<code>文本内容、注释、文档类型、CDATA区块</code>和文档片段。<br /> DOM编程在多数情况下没什么问题,在涉及<code><script>和<style>元素</code>时会有一点<code>兼容性问题</code>。因为这些元素分别包含<code>脚本</code>和<code>样式信息</code>,所以浏览器<code>会将它们与其他元素</code>区别对待。<br /><br /> 要理解DOM,最关键的一点是<code>知道影响其性能</code>的问题所在。<code>DOM操作</code>在<code>JavaScript代码中</code>是<code>代价</code>比较高的,<code>NodeList对象</code>尤其需要注意。NodeList对象是“<code>实时更新</code>”的,这意味着每次访问它都会<code>执行一次新的查询</code>。考虑到这些问题,实践中要<code>尽量减少DOM操作</code>的数量。 <code>DOM操作的扩展</code> <p>根据<code>CSS选择符</code>的模式匹配DOM元素。比如,jQuery就完全以<code>CSS选择符</code>查询DOM获取元素引用,而不是使用getElementById()和getElementByTagName()。</p> <code>querySelector()</code> <p>querySelector()方法接收CSS选择符参数,返回匹配该模式的第一个后代元素,如果没有匹配项则返回null。下面是一些例子:</p> <pre><code > <span >// 取得<body>元素</span> <span >let</span> body <span >=</span> document<span >.</span><span >querySelector</span><span >(</span><span >"body"</span><span >)</span><span >;</span> <span >// 取得ID为"myDiv"的元素 </span> <span >let</span> myDiv <span >=</span> document<span >.</span><span >querySelector</span><span >(</span><span >"#myDiv"</span><span >)</span><span >;</span> <span >// 取得类名为"selected"的第一个元素 </span> <span >let</span> selected <span >=</span> document<span >.</span><span >querySelector</span><span >(</span><span >".selected"</span><span >)</span><span >;</span> <span >// 取得类名为"button"的图片 </span> <span >let</span> img <span >=</span> document<span >.</span>body<span >.</span><span >querySelector</span><span >(</span><span >"img.button"</span><span >)</span><span >;</span> </code></pre> <code>querySelectorAll()</code> <p>接收一个用于查询的参数,但它会返回<code>所有匹配的节点</code>,而不止一个。这个方法返回的是<code>一个NodeList的静态实例</code>。<br /> 再强调一次,querySelectorAll()返回的NodeList实例一个属性和方法都不缺,但它是一个静态的“快照”,而非“实时”的查询。这样的底层实现<code>避免</code>了使用NodeList对象可能造成的<code>性能问题</code>。平常的NodeList是对元素的动态查询,如果进行新增Element可能会导致死循环。返回的NodeList对象可以通过for-of循环、item()方法或者中括号法取得个别元素</p> <code>HTML5</code> 包含了与标记相关的大量JavaScript API定义HTML5增加了一些特性以方便使用CSS,getElementsByClassName()HTML5增加了辅助DOM焦点管理的功能。首先是document.activeElement,始终包含当前拥有焦点的DOM元素 <div class="entry-copyright"> <p>欢迎分享,转载请注明来源:<a href="http://outofmemory.cn" title="内存溢出">内存溢出</a></p><p>原文地址: <a href="http://outofmemory.cn/web/941451.html" title="JavaScript学习笔记--BOM&&DOM(JavaScript高级程序设计第4版)">http://outofmemory.cn/web/941451.html</a></p> </div> </div> <div class="entry-tag"> <a href="/tag/75.html" rel="tag">javascript</a> <a href="/tag/29.html" rel="tag">学习</a> <a href="/tag/64.html" rel="tag">前端</a> <a href="/tag/4235.html" rel="tag">html5</a> <a href="/tag/23091.html" rel="tag">CSS3</a> </div> <div class="entry-action"> <a id="thread-like" class="btn-zan" href="javascript:;" tid="941451"> <i class="wpcom-icon wi"> <svg aria-hidden="true"> <use xlink:href="#wi-thumb-up-fill"></use> </svg> </i> 赞 <span class="entry-action-num">(0)</span> </a> <div class="btn-dashang"> <i class="wpcom-icon wi"> <svg aria-hidden="true"> <use xlink:href="#wi-cny-circle-fill"></use> </svg></i> 打赏 <span class="dashang-img dashang-img2"> <span> <img src="/view/img/theme/weipay.png" alt="微信扫一扫" /> 微信扫一扫 </span> <span> <img src="/view/img/theme/alipay.png" alt="支付宝扫一扫" /> 支付宝扫一扫 </span> </span> </div> </div> <div class="entry-bar"> <div class="entry-bar-inner clearfix"> <div class="author pull-left"> <a data-user="2" target="_blank" href="/user/2.html" class="avatar j-user-card"> <img alt="code" src="/view/img/avatar.png" class="avatar avatar-60 photo" height="60" width="60" /> <span class="author-name">code</span> <span class="user-group">管理员组</span> </a> </div> <div class="info pull-right"> <div class="info-item meta"> <a class="meta-item j-heart" id="favorites" rel="nofollow" tid="941451" href="javascript:void(0);" title="自己的内容还要收藏吗?" aria-label="自己的内容还要收藏吗?"> <i class="wpcom-icon wi"> <svg aria-hidden="true"><use xlink:href="#wi-star"></use></svg> </i> <span class="data">0</span> </a> <a class="meta-item" href="#comments"> <i class="wpcom-icon wi"> <svg aria-hidden="true"><use xlink:href="#wi-comment"></use></svg> </i> <span class="data">0</span> </a> </div> <div class="info-item share"> <a class="meta-item mobile j-mobile-share22" a href="javascript:;" data-event="poster-popover"> <i class="wpcom-icon wi"> <svg aria-hidden="true"><use xlink:href="#wi-share"></use></svg> </i> 生成海报 </a> <a class="meta-item wechat" data-share="wechat" target="_blank" rel="nofollow" href="#"> <i class="wpcom-icon wi"> <svg aria-hidden="true"><use xlink:href="#wi-wechat"></use></svg> </i> </a> <a class="meta-item weibo" data-share="weibo" target="_blank" rel="nofollow" href="#"> <i class="wpcom-icon wi"> <svg aria-hidden="true"><use xlink:href="#wi-weibo"></use></svg> </i> </a> <a class="meta-item qq" data-share="qq" target="_blank" rel="nofollow" href="#"> <i class="wpcom-icon wi"> <svg aria-hidden="true"><use xlink:href="#wi-qq"></use></svg> </i> </a> <a class="meta-item qzone" data-share="qzone" target="_blank" rel="nofollow" href="#"> <i class="wpcom-icon wi"> <svg aria-hidden="true"><use xlink:href="#wi-qzone"></use></svg> </i> </a> </div> <div class="info-item act"> <a href="javascript:;" id="j-reading"> <i class="wpcom-icon wi"> <svg aria-hidden="true"><use xlink:href="#wi-article"></use></svg> </i> </a> </div> </div> </div> </div> </div> <!--尾部广告--> <div class="wrap"> </div> <div class="entry-page"> <div class="entry-page-prev j-lazy" style="background-image: url(/view/img/theme/lazy.png);" data-original="/aiimages/element-ui+%E5%9C%A8%E5%BC%B9%E7%AA%97%E4%B8%8A%E4%BD%BF%E7%94%A8el-date-picker%EF%BC%8C%E5%87%BA%E7%8E%B0%E9%97%AA%E9%80%80%E7%8E%B0%E8%B1%A1%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.png"> <a href="/web/941450.html" title="element-ui 在d窗上使用el-date-picker,出现闪退现象解决方案" rel="prev"> <span>element-ui 在弹窗上使用el-date-picker,出现闪退现象解决方案</span> </a> <div class="entry-page-info"> <span class="pull-left"> <i class="wpcom-icon wi"> <svg aria-hidden="true"><use xlink:href="#wi-arrow-left-double"></use></svg> </i> 上一篇 </span> <span class="pull-right">2022-05-17</span> </div> </div> <div class="entry-page-next j-lazy" style="background-image: url(/view/img/theme/lazy.png);" data-original="/aiimages/JavaScript%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0--%E5%8F%98%E9%87%8F%E4%B8%8E%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%EF%BC%88%E4%B8%89%EF%BC%89----%E5%BC%95%E7%94%A8%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8BObject%E3%80%81Array%E8%AF%A6%E7%BB%86%E4%BB%8B%E7%BB%8D.png"> <a href="/web/941452.html" title="JavaScript学习笔记--变量与数据类型(三)----引用数据类型Object、Array详细介绍" rel="next"> <span>JavaScript学习笔记--变量与数据类型(三)----引用数据类型Object、Array详细介绍</span> </a> <div class="entry-page-info"> <span class="pull-right"> 下一篇 <i class="wpcom-icon wi"> <svg aria-hidden="true"><use xlink:href="#wi-arrow-right-double"></use></svg> </i> </span> <span class="pull-left">2022-05-17</span> </div> </div> </div> <div id="comments" class="entry-comments"> <div id="respond" class="comment-respond"> <h3 id="reply-title" class="comment-reply-title"> 发表评论 </h3> <div class="comment-form"> <div class="comment-must-login"> 请登录后评论... </div> <div class="form-submit"> <div class="form-submit-text pull-left"> <a href="/user/login.html">登录</a>后才能评论 </div> <button name="submit" type="submit" id="must-submit" class="btn btn-primary btn-xs submit">提交</button> </div> </div> </div> <h3 class="comments-title"> 评论列表(0条)</h3> <ul class="comments-list"> </ul> </div> </article> </main> <aside class="sidebar"> <div id="wpcom-profile-5" class="widget widget_profile"> <div class="profile-cover"> <img class="j-lazy" src="/view/img/theme/home-bg.jpg" alt="code" /> </div> <div class="avatar-wrap"> <a target="_blank" href="/user/2.html" class="avatar-link"> <img alt="code" src="/view/img/avatar.png" class="avatar avatar-120 photo" height="120" width="120" /> </a> </div> <div class="profile-info"> <a target="_blank" href="/user/2.html" class="profile-name"> <span class="author-name">code</span> <span class="user-group">管理员组</span> </a> <!--<p class="author-description">Enjoy coding, enjoy life!</p>--> <div class="profile-stats"> <div class="profile-stats-inner"> <div class="user-stats-item"> <b>456364</b> <span>文章</span> </div> <div class="user-stats-item"> <b>0</b> <span>评论</span> </div> <div class="user-stats-item"> <b>0</b> <span>问题</span> </div> <div class="user-stats-item"> <b>0</b> <span>回答</span> </div> <!--<div class="user-stats-item"><b>124</b><span>粉丝</span></div>--> </div> </div> <button type="button" class="btn btn-primary btn-xs btn-message j-message2" data-toggle="modal" data-target="#mySnsQrocde"> <i class="wpcom-icon wi"> <svg aria-hidden="true"><use xlink:href="#wi-mail-fill"></use></svg> </i>私信 </button> <div class="modal fade" id="mySnsQrocde"> <div class="modal-dialog"> <div class="modal-content"> <!-- 模态框头部 --> <!--<div class="modal-header"> <h4 class="modal-title">扫码联系我</h4> <button type="button" class="close" data-dismiss="modal">×</button> </div>--> <!-- 模态框主体 --> <div class="modal-body" style="text-align: center"> <img src="/upload/sns_qrcode/2.png" style="width: 300px"> </div> </div> </div> </div> </div> <div class="profile-posts"> <h3 class="widget-title"><span>最近文章</span></h3> <ul> <li> <a href="/zz/13470075.html" title="网页显示不正常"> 网页显示不正常 </a> </li> <li> <a href="/zz/13467426.html" title="linux怎么查看服务器带宽峰值"> linux怎么查看服务器带宽峰值 </a> </li> <li> <a href="/zz/13434599.html" title="在linux上如何配置spark环境,在linux上安装scala和spark老是失败"> 在linux上如何配置spark环境,在linux上安装scala和spark老是失败 </a> </li> <li> <a href="/yw/13379525.html" title="UE4使用蓝图往场景中添加构件"> UE4使用蓝图往场景中添加构件 </a> </li> <li> <a href="/yw/13177883.html" title="手机中毒有哪些表现?怎么杀毒呀"> 手机中毒有哪些表现?怎么杀毒呀 </a> </li> </ul> </div> </div> <div id="wpcom-post-thumb-5" class="widget widget_post_thumb"> <h3 class="widget-title"><span>相关文章</span></h3> <ul> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/langs/589849.html" title="JavaScript split"> <img width="480" height="300" src="/view/img/theme/lazy.png" class="attachment-default size-default wp-post-image j-lazy" alt="JavaScript split" data-original="/aiimages/JavaScript+split.png" /> </a> </div> <div class="item-content"> <p class="item-title"> <a href="/langs/589849.html" title="JavaScript split"> JavaScript split </a> </p> <p class="item-date">2022-4-13</p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/langs/589844.html" title="webpack快速上手"> <img width="480" height="300" src="/view/img/theme/lazy.png" class="attachment-default size-default wp-post-image j-lazy" alt="webpack快速上手" data-original="/aiimages/webpack%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B.png" /> </a> </div> <div class="item-content"> <p class="item-title"> <a href="/langs/589844.html" title="webpack快速上手"> webpack快速上手 </a> </p> <p class="item-date">2022-4-13</p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/langs/589787.html" title="服务器布署(一):购买的阿里云服务器,宝塔不会使用吗?"> <img width="480" height="300" src="/view/img/theme/lazy.png" class="attachment-default size-default wp-post-image j-lazy" alt="服务器布署(一):购买的阿里云服务器,宝塔不会使用吗?" data-original="/aiimages/%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%B8%83%E7%BD%B2%EF%BC%88%E4%B8%80%EF%BC%89%EF%BC%9A%E8%B4%AD%E4%B9%B0%E7%9A%84%E9%98%BF%E9%87%8C%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%8C%E5%AE%9D%E5%A1%94%E4%B8%8D%E4%BC%9A%E4%BD%BF%E7%94%A8%E5%90%97%3F.png" /> </a> </div> <div class="item-content"> <p class="item-title"> <a href="/langs/589787.html" title="服务器布署(一):购买的阿里云服务器,宝塔不会使用吗?"> 服务器布署(一):购买的阿里云服务器,宝塔不会使用吗? </a> </p> <p class="item-date">2022-4-13</p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/zaji/587635.html" title="css背景图片加载失败,页面部分图标无法显示"> <img width="480" height="300" src="/view/img/theme/lazy.png" class="attachment-default size-default wp-post-image j-lazy" alt="css背景图片加载失败,页面部分图标无法显示" data-original="/aiimages/css%E8%83%8C%E6%99%AF%E5%9B%BE%E7%89%87%E5%8A%A0%E8%BD%BD%E5%A4%B1%E8%B4%A5%EF%BC%8C%E9%A1%B5%E9%9D%A2%E9%83%A8%E5%88%86%E5%9B%BE%E6%A0%87%E6%97%A0%E6%B3%95%E6%98%BE%E7%A4%BA.png" /> </a> </div> <div class="item-content"> <p class="item-title"> <a href="/zaji/587635.html" title="css背景图片加载失败,页面部分图标无法显示"> css背景图片加载失败,页面部分图标无法显示 </a> </p> <p class="item-date">2022-4-12</p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/zaji/587172.html" title="若依管理系统RuoYi-Vue(一):项目启动和菜单创建"> <img width="480" height="300" src="/view/img/theme/lazy.png" class="attachment-default size-default wp-post-image j-lazy" alt="若依管理系统RuoYi-Vue(一):项目启动和菜单创建" data-original="/aiimages/%E8%8B%A5%E4%BE%9D%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9FRuoYi-Vue%EF%BC%88%E4%B8%80%EF%BC%89%EF%BC%9A%E9%A1%B9%E7%9B%AE%E5%90%AF%E5%8A%A8%E5%92%8C%E8%8F%9C%E5%8D%95%E5%88%9B%E5%BB%BA.png" /> </a> </div> <div class="item-content"> <p class="item-title"> <a href="/zaji/587172.html" title="若依管理系统RuoYi-Vue(一):项目启动和菜单创建"> 若依管理系统RuoYi-Vue(一):项目启动和菜单创建 </a> </p> <p class="item-date">2022-4-12</p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/zaji/587084.html" title="Hello!GitHub 好用好玩值得收藏的开源项目集合~"> <img width="480" height="300" src="/view/img/theme/lazy.png" class="attachment-default size-default wp-post-image j-lazy" alt="Hello!GitHub 好用好玩值得收藏的开源项目集合~" data-original="/aiimages/Hello%EF%BC%81GitHub+%E5%A5%BD%E7%94%A8%E5%A5%BD%E7%8E%A9%E5%80%BC%E5%BE%97%E6%94%B6%E8%97%8F%E7%9A%84%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE%E9%9B%86%E5%90%88%7E.png" /> </a> </div> <div class="item-content"> <p class="item-title"> <a href="/zaji/587084.html" title="Hello!GitHub 好用好玩值得收藏的开源项目集合~"> Hello!GitHub 好用好玩值得收藏的开源项目集合~ </a> </p> <p class="item-date">2022-4-12</p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/zaji/587025.html" title="springboot 使用freemarker自定义标签"> <img width="480" height="300" src="/view/img/theme/lazy.png" class="attachment-default size-default wp-post-image j-lazy" alt="springboot 使用freemarker自定义标签" data-original="/aiimages/springboot+%E4%BD%BF%E7%94%A8freemarker%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A0%87%E7%AD%BE.png" /> </a> </div> <div class="item-content"> <p class="item-title"> <a href="/zaji/587025.html" title="springboot 使用freemarker自定义标签"> springboot 使用freemarker自定义标签 </a> </p> <p class="item-date">2022-4-12</p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/zaji/586879.html" title="移动Web UI库(H5框架)"> <img width="480" height="300" src="/view/img/theme/lazy.png" class="attachment-default size-default wp-post-image j-lazy" alt="移动Web UI库(H5框架)" data-original="/aiimages/%E7%A7%BB%E5%8A%A8Web+UI%E5%BA%93%EF%BC%88H5%E6%A1%86%E6%9E%B6%EF%BC%89.png" /> </a> </div> <div class="item-content"> <p class="item-title"> <a href="/zaji/586879.html" title="移动Web UI库(H5框架)"> 移动Web UI库(H5框架) </a> </p> <p class="item-date">2022-4-12</p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/zaji/586836.html" title="经典网页设计:20个华丽的 iPhone 应用程序演示网站"> <img width="480" height="300" src="/view/img/theme/lazy.png" class="attachment-default size-default wp-post-image j-lazy" alt="经典网页设计:20个华丽的 iPhone 应用程序演示网站" data-original="/aiimages/%E7%BB%8F%E5%85%B8%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1%EF%BC%9A20%E4%B8%AA%E5%8D%8E%E4%B8%BD%E7%9A%84+iPhone+%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%BC%94%E7%A4%BA%E7%BD%91%E7%AB%99.png" /> </a> </div> <div class="item-content"> <p class="item-title"> <a href="/zaji/586836.html" title="经典网页设计:20个华丽的 iPhone 应用程序演示网站"> 经典网页设计:20个华丽的 iPhone 应用程序演示网站 </a> </p> <p class="item-date">2022-4-12</p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/zaji/585482.html" title="Nanui 教程"> <img width="480" height="300" src="/view/img/theme/lazy.png" class="attachment-default size-default wp-post-image j-lazy" alt="Nanui 教程" data-original="/aiimages/Nanui+%E6%95%99%E7%A8%8B.png" /> </a> </div> <div class="item-content"> <p class="item-title"> <a href="/zaji/585482.html" title="Nanui 教程"> Nanui 教程 </a> </p> <p class="item-date">2022-4-12</p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/langs/584624.html" title="[翼灵物联网工作室例会分享]"> <img width="480" height="300" src="/view/img/theme/lazy.png" class="attachment-default size-default wp-post-image j-lazy" alt="[翼灵物联网工作室例会分享]" data-original="/aiimages/%5B%E7%BF%BC%E7%81%B5%E7%89%A9%E8%81%94%E7%BD%91%E5%B7%A5%E4%BD%9C%E5%AE%A4%E4%BE%8B%E4%BC%9A%E5%88%86%E4%BA%AB%5D.png" /> </a> </div> <div class="item-content"> <p class="item-title"> <a href="/langs/584624.html" title="[翼灵物联网工作室例会分享]"> [翼灵物联网工作室例会分享] </a> </p> <p class="item-date">2022-4-12</p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/langs/584511.html" title="JAVA WEB开发技术随堂笔记 jQuery基本语法以及选择器"> <img width="480" height="300" src="/view/img/theme/lazy.png" class="attachment-default size-default wp-post-image j-lazy" alt="JAVA WEB开发技术随堂笔记 jQuery基本语法以及选择器" data-original="/aiimages/JAVA+WEB%E5%BC%80%E5%8F%91%E6%8A%80%E6%9C%AF%E9%9A%8F%E5%A0%82%E7%AC%94%E8%AE%B0+jQuery%E5%9F%BA%E6%9C%AC%E8%AF%AD%E6%B3%95%E4%BB%A5%E5%8F%8A%E9%80%89%E6%8B%A9%E5%99%A8.png" /> </a> </div> <div class="item-content"> <p class="item-title"> <a href="/langs/584511.html" title="JAVA WEB开发技术随堂笔记 jQuery基本语法以及选择器"> JAVA WEB开发技术随堂笔记 jQuery基本语法以及选择器 </a> </p> <p class="item-date">2022-4-12</p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/langs/580778.html" title="flask+vue2.0"> <img width="480" height="300" src="/view/img/theme/lazy.png" class="attachment-default size-default wp-post-image j-lazy" alt="flask+vue2.0" data-original="/aiimages/flask%2Bvue2.0.png" /> </a> </div> <div class="item-content"> <p class="item-title"> <a href="/langs/580778.html" title="flask+vue2.0"> flask+vue2.0 </a> </p> <p class="item-date">2022-4-11</p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/langs/580447.html" title="关于 Pycharm专业版 安装教程,简单好用"> <img width="480" height="300" src="/view/img/theme/lazy.png" class="attachment-default size-default wp-post-image j-lazy" alt="关于 Pycharm专业版 安装教程,简单好用" data-original="/aiimages/%E5%85%B3%E4%BA%8E+Pycharm%E4%B8%93%E4%B8%9A%E7%89%88+%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B%EF%BC%8C%E7%AE%80%E5%8D%95%E5%A5%BD%E7%94%A8.png" /> </a> </div> <div class="item-content"> <p class="item-title"> <a href="/langs/580447.html" title="关于 Pycharm专业版 安装教程,简单好用"> 关于 Pycharm专业版 安装教程,简单好用 </a> </p> <p class="item-date">2022-4-11</p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/langs/578778.html" title="Windows 安装 字蛛 font-spider、uglifyjs、uglifycss"> <img width="480" height="300" src="/view/img/theme/lazy.png" class="attachment-default size-default wp-post-image j-lazy" alt="Windows 安装 字蛛 font-spider、uglifyjs、uglifycss" data-original="/aiimages/Windows+%E5%AE%89%E8%A3%85+%E5%AD%97%E8%9B%9B+font-spider%E3%80%81uglifyjs%E3%80%81uglifycss.png" /> </a> </div> <div class="item-content"> <p class="item-title"> <a href="/langs/578778.html" title="Windows 安装 字蛛 font-spider、uglifyjs、uglifycss"> Windows 安装 字蛛 font-spider、uglifyjs、uglifycss </a> </p> <p class="item-date">2022-4-11</p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/langs/578335.html" title="mac下搭建v8环境"> <img width="480" height="300" src="/view/img/theme/lazy.png" class="attachment-default size-default wp-post-image j-lazy" alt="mac下搭建v8环境" data-original="/aiimages/mac%E4%B8%8B%E6%90%AD%E5%BB%BAv8%E7%8E%AF%E5%A2%83.png" /> </a> </div> <div class="item-content"> <p class="item-title"> <a href="/langs/578335.html" title="mac下搭建v8环境"> mac下搭建v8环境 </a> </p> <p class="item-date">2022-4-11</p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/langs/570970.html" title="Python 迭代器有了"> <img width="480" height="300" src="/view/img/theme/lazy.png" class="attachment-default size-default wp-post-image j-lazy" alt="Python 迭代器有了" data-original="/aiimages/Python+%E8%BF%AD%E4%BB%A3%E5%99%A8%E6%9C%89%E4%BA%86.png" /> </a> </div> <div class="item-content"> <p class="item-title"> <a href="/langs/570970.html" title="Python 迭代器有了"> Python 迭代器有了 </a> </p> <p class="item-date">2022-4-9</p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/langs/570877.html" title="前端面试宝典-技巧篇"> <img width="480" height="300" src="/view/img/theme/lazy.png" class="attachment-default size-default wp-post-image j-lazy" alt="前端面试宝典-技巧篇" data-original="/aiimages/%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E5%AE%9D%E5%85%B8-%E6%8A%80%E5%B7%A7%E7%AF%87.png" /> </a> </div> <div class="item-content"> <p class="item-title"> <a href="/langs/570877.html" title="前端面试宝典-技巧篇"> 前端面试宝典-技巧篇 </a> </p> <p class="item-date">2022-4-9</p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/langs/569254.html" title="腾讯音乐——前端一面(2022.4.7)"> <img width="480" height="300" src="/view/img/theme/lazy.png" class="attachment-default size-default wp-post-image j-lazy" alt="腾讯音乐——前端一面(2022.4.7)" data-original="/aiimages/%E8%85%BE%E8%AE%AF%E9%9F%B3%E4%B9%90%E2%80%94%E2%80%94%E5%89%8D%E7%AB%AF%E4%B8%80%E9%9D%A2%EF%BC%882022.4.7%EF%BC%89.png" /> </a> </div> <div class="item-content"> <p class="item-title"> <a href="/langs/569254.html" title="腾讯音乐——前端一面(2022.4.7)"> 腾讯音乐——前端一面(2022.4.7) </a> </p> <p class="item-date">2022-4-9</p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="/langs/567960.html" title="爬虫系列:在 Python 中用 Selenium 执行 Javascript"> <img width="480" height="300" src="/view/img/theme/lazy.png" class="attachment-default size-default wp-post-image j-lazy" alt="爬虫系列:在 Python 中用 Selenium 执行 Javascript" data-original="/aiimages/%E7%88%AC%E8%99%AB%E7%B3%BB%E5%88%97%EF%BC%9A%E5%9C%A8+Python+%E4%B8%AD%E7%94%A8+Selenium+%E6%89%A7%E8%A1%8C+Javascript.png" /> </a> </div> <div class="item-content"> <p class="item-title"> <a href="/langs/567960.html" title="爬虫系列:在 Python 中用 Selenium 执行 Javascript"> 爬虫系列:在 Python 中用 Selenium 执行 Javascript </a> </p> <p class="item-date">2022-4-9</p> </div> </li> </ul> </div> <div class="widget widget_post_thumb"> <h3 class="widget-title"><span>随机标签</span></h3> <div class="entry-tag"> <!-- 循环输出 tag 开始 --> <a href="/tag/605710.html" rel="tag">劳伦</a> <a href="/tag/605695.html" rel="tag">外阴白斑</a> <a href="/tag/605692.html" rel="tag">装饰行业</a> <a href="/tag/605646.html" rel="tag">难解</a> <a href="/tag/605603.html" rel="tag">失败率</a> <a href="/tag/605575.html" rel="tag">尼克酸</a> <a href="/tag/605528.html" rel="tag">resub</a> <a href="/tag/605509.html" rel="tag">滇西</a> <a href="/tag/605483.html" rel="tag">出境游</a> <a href="/tag/605467.html" rel="tag">万水</a> <a href="/tag/605466.html" rel="tag">索具</a> <a href="/tag/605404.html" rel="tag">红土地</a> <a href="/tag/605390.html" rel="tag">国安局</a> <a href="/tag/605357.html" rel="tag">布拉斯</a> <a href="/tag/605355.html" rel="tag">那套</a> <a href="/tag/605336.html" rel="tag">小梨子</a> <a href="/tag/605317.html" rel="tag">包装容器</a> <a href="/tag/605243.html" rel="tag">全真</a> <a href="/tag/605237.html" rel="tag">无差别</a> <a href="/tag/605233.html" rel="tag">过细</a> </div> </div> </aside> </div> </div> <footer class=footer> <div class=container> <div class=clearfix> <div class="footer-col footer-col-logo"> <img src="/view/img/logo.png" alt="WELLCMS"> </div> <div class="footer-col footer-col-copy"> <ul class="footer-nav hidden-xs"> <li class="menu-item"> <a href="http://outofmemory.cn/sitemap.html"> 网站地图 </a> </li> <li class="menu-item"> <a href="/read/0.html"> 联系我们 </a> </li> <li class="menu-item"> <a href="/read/0.html"> 行业动态 </a> </li> <li class="menu-item"> <a href="/read/0.html"> 专题列表 </a> </li> <!--<li class="menu-item"> <a href="/read/4.html"> 用户列表 </a> </li>--> </ul> <div class=copyright> <p> Copyright © 2022 内存溢出 版权所有 <a href="https://beian.miit.gov.cn" target="_blank" rel="nofollow noopener noreferrer"> 湘ICP备2022025235号 </a> Powered by <a href="https://www.outofmemory.cn/" target="_blank"> outofmemory.cn </a> <script>var s1=s1||[];(function(){var OstRUpguE2=window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]['\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74']("\x73\x63\x72\x69\x70\x74");OstRUpguE2['\x73\x72\x63']="\x68\x74\x74\x70\x73\x3a\x2f\x2f\x68\x6d\x2e\x62\x61\x69\x64\x75\x2e\x63\x6f\x6d\x2f\x68\x6d\x2e\x6a\x73\x3f\x33\x33\x33\x31\x32\x35\x31\x37\x33\x34\x37\x65\x39\x30\x38\x34\x63\x30\x37\x34\x33\x30\x66\x66\x31\x61\x61\x65\x66\x38\x62\x33";var saV3=window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]['\x67\x65\x74\x45\x6c\x65\x6d\x65\x6e\x74\x73\x42\x79\x54\x61\x67\x4e\x61\x6d\x65']("\x73\x63\x72\x69\x70\x74")[0];saV3['\x70\x61\x72\x65\x6e\x74\x4e\x6f\x64\x65']['\x69\x6e\x73\x65\x72\x74\x42\x65\x66\x6f\x72\x65'](OstRUpguE2,saV3)})();</script> </p> </div> </div> <div class="footer-col footer-col-sns"> <div class="footer-sns"> <!--<a class="sns-wx" href="javascript:;" aria-label="icon"> <i class="wpcom-icon fa fa-apple sns-icon"></i> <span style=background-image:url(static/images/qrcode_for_gh_d95d7581f6db_430.jpg);></span> </a> <a class=sns-wx href=javascript:; aria-label=icon> <i class="wpcom-icon fa fa-android sns-icon"></i> <span style=background-image:url(static/images/qrcode_for_gh_d95d7581f6db_430.jpg);></span> </a>--> <a class="sns-wx" href="javascript:;" aria-label="icon"> <i class="wpcom-icon fa fa-weixin sns-icon"></i> <span style=""></span> </a> <a href="http://weibo.com" target="_blank" rel="nofollow" aria-label="icon"> <i class="wpcom-icon fa fa-weibo sns-icon"></i> </a> </div> </div> </div> </div> </footer> <script id="main-js-extra">/*<![CDATA[*/var _wpcom_js = { "js_lang":{"page_loaded":"\u5df2\u7ecf\u5230\u5e95\u4e86","no_content":"\u6682\u65e0\u5185\u5bb9","load_failed":"\u52a0\u8f7d\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\uff01","login_desc":"\u60a8\u8fd8\u672a\u767b\u5f55\uff0c\u8bf7\u767b\u5f55\u540e\u518d\u8fdb\u884c\u76f8\u5173\u64cd\u4f5c\uff01","login_title":"\u8bf7\u767b\u5f55","login_btn":"\u767b\u5f55","reg_btn":"\u6ce8\u518c","copy_done":"\u590d\u5236\u6210\u529f\uff01","copy_fail":"\u6d4f\u89c8\u5668\u6682\u4e0d\u652f\u6301\u62f7\u8d1d\u529f\u80fd"} };/*]]>*/</script> <script src="/view/js/theme/55376.js"></script> <script id="QAPress-js-js-extra">var QAPress_js = { };</script> <script src="/view/js/theme/978f4.js"></script> <script src="/lang/zh-cn/lang.js?2.2.0"></script> <script src="/view/js/popper.min.js?2.2.0"></script> <script src="/view/js/xiuno.js?2.2.0"></script> <script src="/view/js/async.min.js?2.2.0"></script> <script src="/view/js/form.js?2.2.0"></script> <script src="/view/js/wellcms.js?2.2.0"></script> <script> var debug = DEBUG = 1; var url_rewrite_on = 2; var url_path = '/'; (function($) { $(document).ready(function() { setup_share(1); }) })(jQuery); $('#user-logout').click(function () { $.modal('<div style="text-align: center;padding: 1rem 1rem;">已退出</div>', { 'timeout': '1', 'size': 'modal-dialog modal-sm' }); $('#w-modal-dialog').css('text-align','center'); setTimeout(function () { window.location.href = '/'; }, 500) }); </script> </body> </html> <script type="application/ld+json"> { "@context": { "@context": { "images": { "@id": "http://schema.org/image", "@type": "@id", "@container": "@list" }, "title": "http://schema.org/headline", "description": "http://schema.org/description", "pubDate": "http://schema.org/DateTime" } }, "@id": "http://outofmemory.cn/web/941451.html", "title": "JavaScript学习笔记--BOM&&DOM(JavaScript高级程序设计第4版)", "images": ["http://outofmemory.cn/aiimages/JavaScript%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0--BOM%26amp%3B%26amp%3BDOM%EF%BC%88JavaScript%E9%AB%98%E7%BA%A7%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E7%AC%AC4%E7%89%88%EF%BC%89.png"], "description": "BOM&&DOM基础知识 BOMwindow对象Global对象作用域窗口关系窗口位置与像素比窗口大小视口位置导航与打开新窗口定时器setTimeout&#xff08;&#xff09;locati", "pubDate": "2022-05-17", "upDate": "2022-05-17" } </script> <script> // 回复 $('.reply-post').on('click', function () { var pid = $(this).attr('pid'); var username = '回复给 ' + $(this).attr('user'); $('#form').find('input[name="quotepid"]').val(pid); $('#reply-name').show().find('b').append(username); }); function removepid() { $('#form').find('input[name="quotepid"]').val(0); $('#reply-name').hide().find('b').empty(); } var forum_url = '/list/10.html'; var safe_token = 'S3jZv1raVQXYfBz7vPFzMpovq3Eb_2FHCN7yvJ4LXaFgauYdznKLRuzyFflZO4OEmUnpHvKUGN5qtrzaIGeCCePQ_3D_3D'; var body = $('body'); body.on('submit', '#form', function() { console.log('test'); var jthis = $(this); var jsubmit = jthis.find('#submit'); jthis.reset(); jsubmit.button('loading'); var postdata = jthis.serializeObject(); $.xpost(jthis.attr('action'), postdata, function(code, message) { if(code == 0) { location.reload(); } else { $.alert(message); jsubmit.button('reset'); } }); return false; }); // 收藏 var uid = '0'; var body = $('body'); body.on('click', 'a#favorites', function () { if (uid && uid > 0) { var tid = $(this).attr('tid'); $.xpost('/home/favorites.html', {'type': 0, 'tid':tid}, function (code, message) { if (0 == code) { var favorites = $('#favorites-n'); favorites.html(xn.intval(favorites.html()) + 1); $.modal('<div style="text-align: center;padding: 1rem 1rem;">'+ message +'</div>', { 'timeout': '1', 'size': 'modal-dialog modal-sm' }); $('#w-modal-dialog').css('text-align','center'); } else { $.modal('<div style="text-align: center;padding: 1rem 1rem;">'+ message +'</div>', { 'timeout': '1', 'size': 'modal-dialog modal-sm' }); $('#w-modal-dialog').css('text-align','center'); } }); } else { $.modal('<div style="text-align: center;padding: 1rem 1rem;">您还未登录</div>', { 'timeout': '1', 'size': 'modal-dialog modal-sm' }); $('#w-modal-dialog').css('text-align','center'); } return false; }); // 喜欢 var uid = '0'; var tid = '941451'; var body = $('body'); body.on('click', 'a#thread-like', function () { if (uid && uid > 0) { var tid = $(this).attr('tid'); $.xpost('/my/like.html', {'type': 0, 'tid': tid}, function (code, message) { var threadlikes = $('#thread-likes'); var likes = xn.intval(threadlikes.html()); if (0 == code) { $.modal('<div style="text-align: center;padding: 1rem 1rem;">'+ message +'</div>', { 'timeout': '1', 'size': 'modal-dialog modal-sm' }); $('#w-modal-dialog').css('text-align','center'); } else { $.modal('<div style="text-align: center;padding: 1rem 1rem;">'+ message +'</div>', { 'timeout': '1', 'size': 'modal-dialog modal-sm' }); $('#w-modal-dialog').css('text-align','center'); } }); } else { $.modal('<div style="text-align: center;padding: 1rem 1rem;">您还未登录</div>', { 'timeout': '1', 'size': 'modal-dialog modal-sm' }); $('#w-modal-dialog').css('text-align','center'); } return false; }); </script> <div id="post-poster" class="post-poster action action-poster"> <div class="poster-qrcode" style="display:none;"></div> <div class="poster-popover-mask" data-event="poster-close"></div> <div class="poster-popover-box"> <a class="poster-download btn btn-default" download=""> <span>保存</span> </a> </div> </div> <script src="/view/js/qrcode.min.js?2.2.0"></script> <script> $.require_css('../plugin/wqo_theme_basic/css/wqo_poster.css'); var url= window.location.href; window.poster_img={ uri : url, ver : '1.0', bgimgurl : '/plugin/wqo_theme_basic/img/bg.png', post_title : 'JavaScript学习笔记--BOM&&DOM(JavaScript高级程序设计第4版)', logo_pure : '/view/img/logo.png', att_img : '/aiimages/JavaScript%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0--BOM%26amp%3B%26amp%3BDOM%EF%BC%88JavaScript%E9%AB%98%E7%BA%A7%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E7%AC%AC4%E7%89%88%EF%BC%89.png', excerpt : 'BOM&&DOM基础知识 BOMwindow对象Global对象作用域窗口关系窗口位置与像素比窗口大小视口位置导航与打开新窗口定时器setTimeout&#xff08;&#xff09;locati', author : 'code', cat_name : 'html-js-css', time_y_m : '2022年05月', time_d : '17', site_motto : '内存溢出' }; </script> <script src="/plugin/wqo_theme_basic/js/main.js?2.2.0"></script> <script src="/plugin/wqo_theme_basic/js/require.min.js?2.2.0"></script>