从这篇笔记开始整理 JavaScript 的第三部分:文档对象模型 DOM ( Document Object Model )。 DOM 是针对 HTML 和 XML 文档的一个 API ,脱胎于 DHTML ,由 W3C 负责制定相关标准,现在已经成为表现和操作页面标记的真正的跨平台、语言中立的一种标准,除了 JavaScript 外,其它一些语言比如 SVG 、 MathML 等也不同程度的实现了各自的 DOM 。
1、DOM组成和级别
DOM分为三个组成部分和三个级别:
组成部分
说明
核心DOM
用于任何结构化文档的标准模型
XML DOM
用于XML文档的标准模型,定义了所有XML元素的对象和属性,以及访问它们的方法(接口),换句话说,XML DOM是用于获取、更改、添加或删除XML元素的标准
HMTL DOM
用于HTML文档的标准模型,定义了所有HTML元素的对象和属性,以及访问它们的方法(接口)
DOM级别
浏览器支持情况
功能模块
说明
0级
IE4、Netscape4
在 W3C 标准中,是没有 0 级的,通常所谓 DOM 0 级指的就是在 DOM 1 级规范之前的在 IE4 和 Netscape Navigator4 中支持的 DHTML
1级
几乎所有现代浏览器
DOM核心(DOM Core)
规定的是如何映射基于 XML 的文档结构,以便简化对文档中任意部分的访问和操作
DOM HTML
在 DOM 核心基础上加以扩展,添加了针对 HTML 的对象和方法
2级
IE 9+ Opera 7-9.9 (部分支持), OPera 10+ Safari 2+ (部分支持) Chrome 1+(部分支持) Firefox 1+(几乎全部)
DOM视图(DOM Views)
定义了跟踪不同文档(例如,应用 CSS 前后的文档)视图的接口
DOM事件(DOM Events)
定义了事件和事件处理的接口
DOM样式(DOM Style)
定义了基于 CSS 为元素应用样式的接口
DOM遍历和范围(DOM Traversal and Range)
定义了遍历和操作文档树的接口
DOM核心和HTML扩展
开始支持 XML 命名空间等
3级
IE9+ Opera9+ (部分支持) Firefox1+(部分支持)
DOM 加载和保存( DOM Load and Save )
引入了以统一方式加载和保存文档的方法
DOM 验证( DOM Validation )
验证文档的方法
DOM 核心和 HTML 扩展
开始支持 XML1.0 规范,涉及 XML Infoset 、 XPath 和 XMLBase 等
2、文档映射
DOM 将 HTML 和 XML 文档映射成一个由不同节点组成的树型机构,每种节点都对应于文档中的信息或标记,节点有自己的属性和方法,并和其他节点存在某种关系,节点之间的关系构成了节点层次,例如:
< html >
< head >
< title > 标题title >
head >
< body >
< p > 测试p >
body >
html >
( 1 )文档节点 Document 是每个文档的根节点 。 ( 2 )文档元素:如右图,文档节点只有一个子节点,即 元素,称之为文档元素。文档元素是文档的最外层元素,其他所有元素都包含在文档元素中,每个文档只能有一个文档元素。在 HTML 中,文档元素永远是 元素,但是在 XML 中,没有预定义元素,因此任何元素都可能成为文档元素。 ( 3 )文档中每一段标记都通过树中的一个节点来表示,比如 HTML 元素通过元素节点表示,特性( attribute )通过特性节点表示,文档类型通过文档类型节点表示,而注释则通过注释节点表示。在 DOM1 中,总共有 12 种节点类型,他们都继承自一个基类型。
3、Node接口
类别
属性 / 方法
值 / 类型 / 返回类型
说明
属性
nodeName
String
节点名字,根据节点类型定义。对于元素节点,就是原始的标签名
nodeValue
String
节点值,根据节点类型定义。对于元素节点为 null
nodeType
Number
节点类型,返回12种节点类型值之一
ownerDocument
Document
指向这个节点所属的文档,可以利用它直接访问文档节点,而不用层层回溯
parentNode
Node
文档树中的父节点
childNodes
NodeList
所有直接子节点组成的列表,不同浏览器对空白字符和 外的注释有不同处理,会导致 childNodes 不一致
firstChild
Node
第一个直接子节点,没有子节点返回 null
lastChild
Node
最后一个直接子节点,没有子节点返回 null
previousSibiling
Node
前一个兄弟节点,没有则返回 null
nextSibiling
Node
后一个兄弟节点,没有则返回 null
方法
hasChildNodes()
Boolean
有子节点时返回 true ,否则返回 false
appendChild(node)
Node
在末尾添加子节点,返回新添加的节点。如果传入参数已经是文档中一部分,结果将是将该节点从原来的位置移向新位置(任何 DOM 节点不能同时出现在多个位置上)
removeChild(node)
Node
移除节点并返回这个节点。删除后,节点仍然属于原来的文档,只是没有了位置
replaceChild(node,node)
Node
传入新添加的节点和被替换的节点,返回被替换的节点。被替换的节点仍然属于原来的文档,只是没有了位置
insertBefore(node,node)
Node
传入新添加的节点和参照节点,新添加节点会成为参照节点的前一个兄弟节点,如果参照节点为 null ,则插入到最后,相当于 appendChild() 。返回新添加的节点
cloneNode(boolean)
Node
复制节点,参数为 true 时,复制节点及其所有子节点树,为 false 时,只复制节点本身。返回的节点属于文档所有,但没有指定父节点
normalize()
处理文档树中的文本节点,删除空文档节点或合并两个相邻的文本节点等
说明:
(1)关于节点类型 nodeType ,在 DOM1 中定义了 12 种常量,是作为 Node 类型构造函数的属性定义的(静态属性),它们对应于各自的节点类型:
节点
节点类型( nodeType , Node 的静态属性)
节点名称( nodeName )
节点值( nodeValue )
父节点( parentNode )
子节点( childNodes )
说明
Document
Node.DOCUMENT_NODE(9)
#document
null
null
DocumentType(最多一个)|Element(最多一个) |Comment|ProcessingInstruction
下有进一步叙述
Element
Node.ELEMENT_NODE(1)
元素的标签名
null
Document|Element
Element|Text|Comment| ProcessingInstruction| CDATASection|EntityReference
Text
Node.TEXT_NODE(3)
#text
节点所包含的文本
Element
(不支持)没有子节点
Comment
Node.COMMENT_NODE(8)
#comment
注释的内容
Document|Element
(不支持)没有子节点
和Text继承自相同基类,拥有除splitText()外所有字符串方法,可通过nodeValue或data属性获取注释内容
CDATASection
Node.CDATA_SECTION_NODE(4)
#cdata-section
CDATA 区域的内容
Document|Element
(不支持)没有子节点
继承自Text类型,拥有除splitText()外所有字符串方法
DocumentType
Node.DOCUMENT_TYPE_NODE(10)
doctype 的名称
null
Document
(不支持)没有子节点
在DOM1中不能动态创建,DocumentType对象的3个属性: name表示文档类型名称 entities表示描述文档类型实体的NamedNodeMap notations表示文档类型描述的符号的NamedNodeMap
DocumentFragment
Node.DOCUMENT_FRAGMENT_NODE(11)
#document-fragment
null
null
同Element类型
下有进一步叙述
Attr
Node.ATTRIBUTE_NODE(2)
特性名称
特性值
null
HTML 中不支持, XML 中可以是 Text 或 EntityReference
有3个自己的属性: name等于nodeName value等于nodeValue specified表示是否为默认设置
EntityReference
Node.ENTITY_REFERENCE_NODE(5)
引用的实体名称
null
实体引用节点
Entity
Node.ENTITY_NODE(6)
entity name
null
实体节点
ProcessingInstruction
Node.PROCESSING_INSTRUCTION_NODE(7)
与 ProcessingInstruction.target
相同
与 ProcessingInstruction.data
相同
处理指令
Notation
Node.NOTATION_NODE(12)
notation name
null
DTD中定义的符号
这些节点类型都实现了Node接口,因此都可以访问Node类型的属性和方法(不支持子节点的节点类型上调用appendChild()、insertBefore()、replaceChild()、removeChild()等方法时会抛出异常)。经过测试在IE9中已经可以直接访问Node类型中定义的常量值,并且IE9中这些值不能改变,而在Firefox15的版本中仍然可以修改,这应该是Firefox实现的一个Bug(原书说IE中不可访问Node的论述似有不妥)。
Node.DOCUMENT_NODE = 2;
console.info(Node.DOCUMENT_NODE); // IE9输出9,而Firefox15输出的是2
( 2 )关于 NodeList 类型,它也是一个类数组类型,有 length 属性,也可以通过方括号语法访问,还可以通过 item() 方法访问,但并不是 Array 的实例,如果要对其使用数组方法,必须像转换 arguments 对象一样来转换 NodeList 对象:
var node = document;// 任意一个节点,这里使用文档根节点测试
console.info(node.childNodes.length);// 2,直接子节点
console.info(node.childNodes[0].nodeName);// 通过方括号语法访问第1个元素,索引从0开始
console.info(node.childNodes.item(1).nodeName);// 通过item()方法访问第2个元素,索引从0开始
var arr = Array.prototype.slice.call(node.childNodes,0);// 转换为真正的数组
console.info(arr.join(','));// 可以使用数组方法了
需要特别注意的是, NodeList 对象类型是一个有生命、有呼吸的对象,它的属性和元素是跟随文档变化而变化的:
var node = document;
var nodeList = node.childNodes;
var src = nodeList.length;
node.removeChild(nodeList[ 0]);// 修改文档,会同时修改NodeList对象的属性和元素,即便是已经将其保存为另外一个变量
console.info(nodeList.length == src - 1);// true
类似 NodeList 这种动态变化的对象对象还有 HTMLCollection 、 NamedNodeMap 等,其中 HTMLCollection 还有一个 namedItem() 方法,可以通过元素的 name 获取集合中的项。
4、Document类型
在 JavaScript 中,通过 Document 类型表示文档,而我们通常使用的 document 对象则是 HTMLDocument (继承自 Document 类型)的一个实例,表示整个 HTML 页面。同时, docuemnt 对象也是 window 对象的一个属性,可以作为全局对象来访问。 document 对象的主要属性和方法有:
说明:
(1)一般情况下,不用在 document 对象上调用 appendChild() 、 insertBefore() 、 removeChild() 、 replaceChild() 等方法,因为文档类型(如果存在的话)是只读的,而且它只能有一个元素子节点。
(2)document对象的创建方法,是实现动态加载脚本或样式的基础,从而可以进一步对代码模块化,实现按需加载,提升性能,这在Ext4库中已经很好地应用了。动态加载的一般方法:
function loadScript(url){// 动态加载外部js文件,也可以类似的加载js代码
var script = document.createElement("script");
script.type = "text/javascript";
script.src = url;
document.body.appendChild(script);
}
function loadStyle(url){// 动态加载外部css文件,也可以类似的通过style元素加载css代码
var link = document.createElement("link");
link.rel = "stylesheet";
link.type = "text/css";
link.href = url;
var head = document.getElementsByTagName("head")[0];
head.appendChild(link);
}
5、Element类型
Element 类型用于表现 XML 或 HTML 元素,提供了对元素标签名、子节点以及特性的访问。在 HTML 中,元素由 HTMLElement 类型(或其子类型)表示, HTMLElement 继承了 Element 类型,并添加了对应每个 HTML 元素都存在的标准特性的属性。 HTMLElement 类型常用属性和方法总结如下:
类别
属性 / 特性
说明
Element 类型属性
tagName
这个属性是所有 Element 都有的,值和 nodeName 相同,表示元素标签名,在 HTML 中,返回的标签名始终大写,在 XML 中,和源代码一致
HTML 元素标准特性
id
id
元素在文档中的唯一标识符
title
title
有关元素的附件说明信息,一般通过工具条显示出来
lang
lang
元素内容的语言代码,很少使用
dir
dir
语言的方向, ltr :从左至右, rtl :从右至左,也很少使用
className
class
元素的 CSS 类,因为 class 是保留字,所以属性命名为 className
特性属性
attributes
这个是属性只有 Element 类型使用,是一个 NamedNodeMap 值,属于一个 “ 动态 ” 集合
特性方法
getAttribute()
参数:特性名。参数必须与实际的特性名相同,因此是 class 而不是 className ,给定特性不存在时,返回 null ,这个方法也可以获取自定义特性,特性名不区分大小写
setAttribute()
参数:特性名和特性值。如果已存在该特性,替换现有的值,如果不存在,就创建并赋值。通过这个方法设置特性时,会把特性名转换为小写形式
removeAttribute()
参数:特性名。彻底删除元素的特性,不仅会清除特性的值,也会从元素对象中删除特性
特性节点方法
getAttributeNode()
返回对应特性的 Attr 节点, element.getAttributeNode('align') 相当于 element.attributes['align']
setAttributeNode()
设置元素的 Attr 节点
其它方法
getElementsByTagName()
在当前元素的后代节点中搜索,其它用法和 Document 类型的同名方法一样
说明:
(1)特殊特性:
A、class特性,其对应DOM对象的属性为className,在特性方法操作中参数需要传入class,而对象属性操作需要设置className属性。
B、style特性,在通过getAttribute()访问时,返回的是style特性值中包含的CSS文本,而通过属性来访问它则会返回一个对象。
C、事件处理特性,比如onclick,当在元素上使用时,onclick特性中包含的是JavaScript代码,如果通过getAttribute()访问,返回相应代码的字符串,而在访问onclick属性时,会返回一个JavaScript函数(没有相应特性时返回null)。
(2)关于自定义特性和属性,在HTML5规范中,需加上“data-”前缀。
A、给节点设置特性值时,会同步修改相应DOM对象的属性值,但是设置自定义特性的值时,一般浏览器是不会为相应的DOM对象添加属性的,然而IE也会为自定义特性创建属性。
B、直接给DOM对象设置属性值时,会同步修改相应节点元素的特性值,但是一般浏览器中自定义属性不会成为元素的特性,使用getArrtibute()时会返回null,然而IE会为自定义属性创建特性。
(3)HTMLElement类型是HTML中元素的基类型,对应不同的标签,还有很多更加具体的子类型,这些子类型也有与之相关的特性和方法,比如对应
标签有HTMLBodyElement类型、对应
标签有HTMLTableElement类型等。
(4)元素的子节点,可以有任意数目的子节点和后代节点,childNodes属性则包括了所有直接子节点,但是由于不同浏览器在处理注释、文本等节点的不同,会使得childNodes也不同,因此,如果需要遍历元素子节点的话,需要添加节点类型判断:
for (var i=0,l=element.childNodes.length; i < l; i++){
if (element.childNodes[i].nodeType === 1)// 过滤元素子节点
{
// 对元素子节点做操作
}
}
(5)元素的每一个特性都由一个Attr节点表示,每个节点都保存在一个NamedNodeMap对象中,这个对象和NodeList与HTMLCollection类似,是一个“动态”的,随文档变化而变化,它有下面的一些方法:
方法
说明
getNamesItem(name)
返回 nodeName 等于 name 的节点
removeNamedItem(name)
从列表中移除 nodeName 等于那么的节点,调用 removeNamedItem() 与在元素上调用 removeAttribute() 效果相同,只是前者返回被移除的 Attr 节点
setNamedItem(node)
向列表中添加节点,以节点的 nodeName 属性为索引
item(pos)
返回位于数字 pos 位置处的节点
元素的attributes属性返回的就是一个NamedNodeMap对象,其中包含一系列Attr节点,每个节点的nodeName就是特性名称,nodeValue就是特性值,可以使用attributes属性来遍历元素的特性(原书第268页):
function outputAttributes(element){
var pairs = new Array(),
attr;
for (var i=0, len=element.attributes.length; i < len; i++){
attr = element.attributes[i];
if (attr.specified){// specified属性表示特性值是设置还是默认的,为true表示设置的
pairs.push(attr.nodeName + "=\"" +attr.nodeValue + "\"");
}
}
return pairs.join(" ");// 以空格连接各个特性并返回
}
6、Text类型
文本节点由Text类型表示,包含的是可以按字面解释的纯文本内容,可以包含转义后的HTML字符,但不能包含HTML代码,Text类型的主要属性和方法有:
类别
属性/方法
说明
属性
length
文本字符数
data
文本字符,和nodeValue值相同
方法
appendData(text)
将text添加到文本节点末尾
deleteData(offset,count)
从offset指定的位置开始删除count个字符
insertData(offset,text)
从offset指定的位置插入text
replaceData(offset,count,text)
用text替换从offset指定的位置开始到offset+count为止处的文本
splitText(offset)
从offset指定的位置将当前文本节点分成两个文本节点
substringData(offset,count)
提取从offset指定的位置开始到offset+count为止处的字符串
说明:
(1)在Node类型中定义了一个normalize()方法,用于将相邻的两个或多个文本子节点合并,需要注意的是这个方法需要在文本节点的父节点上调用;与之相反的是,Text类型提供了splitText()方法,它会将原文本节点分成两个文本节点,原文本节点将包含从开始到指定位置之前的内容,新文本节点包含剩下的内容,最终返回新文本节点。
(2)默认情况下,每个可以包含内容的元素最多只能有一个文本子节点,而且文本不能为空。通过DOM脚本操作时,可能存在有多个文件子节点的情况。
(3)设置文本节点时需要注意,字符串会经过HTML或XML编码。
7、DocumentFragment类型
在所有节点类型中,只有DocumentFragment是没有对应的标记的,DOM规定DocumentFragment是一种“轻量级”的文档,可以包含和控制节点,但不会像完整的文档那样占用额外的资源。DocumentFragment类型可以作为一个容器来使用,可以把后面要对文档进行的添加、修改、移除等操作先对DocumentFragment进行,然后再将DocumentFragment添加至文档中,从而避免DOM视图的多次渲染。例如:
function addItems(){
var fragment = document.createDocumentFragment();// 创建一个文档片段作为容器
var ul = document.getElementById("myList");
var li = null ;
for (var i=0; i < 3; i++){
li = document.createElement("li");// 创建列表元素
li.appendChild(document.createTextNode("Item " + (i+1)));// 在列表元素中添加文本
fragment.appendChild(li);// 将列表元素添加中容器中,此时不会渲染页面
}
ul.appendChild(fragment); //将容器中的节点添加到文档中(但容器本身不会添加至文档树),这样只需要 渲染一次页面
}
需要注意的是,在DocumentFragment中的节点不属于文档,如果将文本中的节点添加至DocumentFragment中,该节点将会从文档树中移除。
8、操作表格
元素是HTML中最复杂的结构之一,在HTML DOM中还为、、等元素添加了一些属性和方法(请注意table、tbody、tr及td之间的关系):
元素
类别
属性/方法
说明
属性
caption
保存着对元素(如果有)的指针
tBodies
是一个 元素的HTMLCollection
tHead
保存着对元素(如果有)的指针
tFoot
保存着对元素(如果有)的指针
rows
表格中所有行的HTMLCollection
方法
createTHead()
创建元素,将其放到表格中,返回引用
createTFoot()
创建 元素,将其放到表格中,返回引用
createCaption()
创建元素,将其放到表格中,返回引用
deleteTHead()
删除元素
deleteTFoot()
删除 元素
deleteCaption()
删除元素
deleteRow(pos)
删除指定位置的行
insertRow(pos)
向rows集合中的指定位置插入一行
属性
rows
保存着 元素中行的HTMLCollection
方法
deleteRow(pos)
删除指定位置的行
insertRow(pos)
向rows集合中的指定位置插入一行,返回新插入行的引用
属性
cells
保存着 元素中单元格的HTMLCollection
方法
deleteCell(pos)
删除指定位置的单元格
insertCell(pos)
想cells集合中的指定位置插入一个单元格,返回新插入单元格的引用
注意,上表中列出的是原书中提及元素的属性和方法,并不全面,比如对应
元素还有HTMLTableCellElement对象,而 对应对象还有rowIndex属性等,实际使用时可以查阅相关的DOM参考手册。这里旨在通过主要的一些属性和方法明确概念,而非参考大全。
你可能感兴趣的:(JavaScript高级程序设计(第3版)学习笔记15——DOM基础)
三菱PLC全套学习资料及应用手册
good2know
本文还有配套的精品资源,点击获取简介:三菱PLC作为工业自动化领域的核心设备,其系列产品的学习和应用需要全面深入的知识。本次资料包为学习者提供从基础到进阶的全方位学习资源,包括各种型号PLC的操作手册、编程指南、软件操作教程以及实际案例分析,旨在帮助用户系统掌握PLC的编程语言、指令系统及在各类工业应用中的实施。1.三菱PLC基础知识入门1.1PLC的基本概念可编程逻辑控制器(PLC)是工业自动化
移动端城市区县二级联动选择功能实现包
good2know
本文还有配套的精品资源,点击获取简介:本项目是一套为移动端设计的jQuery实现方案,用于简化用户在选择城市和区县时的流程。它包括所有必需文件:HTML、JavaScript、CSS及图片资源。通过动态更新下拉菜单选项,实现城市到区县的联动效果,支持数据异步加载。开发者可以轻松集成此功能到移动网站或应用,并可基于需求进行扩展和优化。1.jQuery移动端解决方案概述jQuery技术简介jQuery
15个小技巧,让我的Windows电脑更好用了!
曹元_
01.桌面及文档处理第一部分的技巧,主要是围绕桌面的一些基本操作,包括主题设置、常用文档文件快捷打开的多种方式等等。主题换色默认情况下,我们的Win界面可能就是白色的文档界面,天蓝色的图表背景,说不出哪里不好看,但是就是觉得不够高级。imageimage说到高级感,本能第一反应就会和暗色模式联想起来,如果我们将整个界面换成黑夜模式的话,它会是这样的。imageimage更改主题颜色及暗色模式,我们
day15|前端框架学习和算法
universe_01
前端 算法 笔记
T22括号生成先把所有情况都画出来,然后(在满足什么情况下)把不符合条件的删除。T78子集要画树状图,把思路清晰。可以用暴力法、回溯法和DFS做这个题DFS深度搜索:每个边都走完,再回溯应用:二叉树搜索,图搜索回溯算法=DFS+剪枝T200岛屿数量(非常经典BFS宽度把树状转化成队列形式,lambda匿名函数“一次性的小函数,没有名字”setup语法糖:让代码更简洁好写的语法ref创建:基本类型的
《极简思维》第三部分
小洋苏兮
整理你的人际关系如何改善人际关系?摘录:因为人际关系问题是人们生活中不快乐的主要原因。感想:感觉这个说的挺对,之前我总是埋头学习,不管舍友不管自己的合作伙伴的一些事情,但实际上,这学期关注了之后好多了摘录:“亲密关系与社交会让你健康而快乐。这是基础。太过于关注成就或不太关心人际关系的人都不怎么快乐。基本上来说,人类就是建立在人脉关系上的。”感想:但是如果有时想的太多就不太好,要以一个开放的心态跟别
Spring进阶 - SpringMVC实现原理之DispatcherServlet处理请求的过程
倾听铃的声
后端 spring java mvc 开发语言 分布式
前文我们有了IOC的源码基础以及SpringMVC的基础,我们便可以进一步深入理解SpringMVC主要实现原理,包含DispatcherServlet的初始化过程和DispatcherServlet处理请求的过程的源码解析。本文是第二篇:DispatcherServlet处理请求的过程的源码解析。@pdaiSpring进阶-SpringMVC实现原理之DispatcherServlet处理请求的
JVM 内存模型深度解析:原子性、可见性与有序性的实现
练习时长两年半的程序员小胡
JVM 深度剖析:从面试考点到生产实践 jvm java 内存模型
在了解了JVM的基础架构和类加载机制后,我们需要进一步探索Java程序在多线程环境下的内存交互规则。JVM内存模型(JavaMemoryModel,JMM)定义了线程和主内存之间的抽象关系,它通过规范共享变量的访问方式,解决了多线程并发时的数据一致性问题。本文将从内存模型的核心目标出发,详解原子性、可见性、有序性的实现机制,以及volatile、synchronized等关键字在其中的作用。一、J
Flowable 高级扩展:自定义元素与性能优化实战
练习时长两年半的程序员小胡
Flowable 流程引擎实战指南 流程图 flowable BPMN 流程引擎 java
在前五篇文章中,我们从基础概念、流程设计、API实战、SpringBoot集成,到外部系统协同,逐步构建了Flowable的应用体系。但企业级复杂场景中,原生功能往往难以满足定制化需求——比如需要特殊的审批规则网关、与决策引擎联动实现动态路由,或是在高并发场景下优化流程引擎性能。本文将聚焦Flowable的高级扩展能力,详解如何自定义流程元素、集成规则引擎,并掌握大型系统中的性能调优策略。一、自定
互信息:理论框架、跨学科应用与前沿进展
大千AI助手
人工智能 Python # OTHER 人工智能 深度学习 算法 互信息 香农 通信 随机变量
1.起源与核心定义互信息(MutualInformation,MI)由克劳德·香农(ClaudeShannon)在1948年开创性论文《AMathematicalTheoryofCommunication》中首次提出,该论文奠定了现代信息论的基础。互信息用于量化两个随机变量之间的统计依赖关系,定义为:若已知一个随机变量的取值,能为另一个随机变量提供的信息量。数学上,对于离散随机变量XXX和YYY,
力扣面试题07 - 旋转矩阵
茶猫_
leetcode 矩阵 算法 c语言
题目:给你一幅由N×N矩阵表示的图像,其中每个像素的大小为4字节。请你设计一种算法,将图像旋转90度。不占用额外内存空间能否做到?示例1:给定matrix=[[1,2,3],[4,5,6],[7,8,9]],原地旋转输入矩阵,使其变为:[[7,4,1],[8,5,2],[9,6,3]]示例2:给定matrix=[[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,
车载刷写架构 --- 刷写思考扩展
汽车电子实验室
电子电器架构——刷写方案 架构 开发语言 关于网关转发性能引起的思考 汽车中央控制单元HPC软件架构 车载诊断进阶篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师:做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是系统思考、大胆设计、小心求证;三是“一张纸制度”,也就是无论多么复杂的工作内容,要在一张纸上描述清楚;四是要坚决反对虎头蛇尾,反对繁文缛节,反对老
2025年SDK游戏盾终极解析:重新定义手游安全的“隐形护甲”
上海云盾商务经理杨杨
游戏 安全
副标题:从客户端加密到AI反外挂,拆解全链路防护如何重塑游戏攻防天平引言:当传统高防在手游战场“失效”2025年全球手游市场规模突破$2000亿,黑客单次攻击成本却降至$30——某SLG游戏因协议层CC攻击单日流失37%玩家,某开放世界游戏遭低频DDoS瘫痪6小时损失千万。传统高防IP的致命短板暴露无遗:无法识别伪造客户端流量、难防协议篡改、误杀率超15%。而集成于游戏终端的SDK游戏盾,正以“源
js操作样式
郝加升
DOM样式属性和方法:指定的元素,它的style有这么几个属性和方法:cssText:通过这个属性可以访问到元素的特性style设置的属性,并且可以直接赋值设置。removeProperty(属性名称):从样式中删除给定属性。setProperty(属性名称,值,权重):可以通过这个方法设置给定样式的同时设置其权重,可以传入”important”或者一个空字符串。获取计算后样式:window.ge
《自控力》P158
迷糊笑
作者:凯利•麦格尼格尔图片发自App金句:众多研究显示,自我批评会降低积极性和自控力,而且也是最容易导致抑郁的因素。它不仅耗尽了“我要做”的力量,还耗尽了“我想要”的力量。相反,自我同情则会提升积极性和自控力,比如,在压力和挫折面前支持自己、对自己好一些。感想:我当年抑郁是不是也是因为这样?图片发自App
19.07.13
aa350fd4409a
晚上在路边加资源的时候碰到了丁姐,那时候我才加了十个,丁姐已经加了15个。丁姐直接说要陪我一起加。然后我下意识反应就说“好”然后我们就一起加了,丁姐陪我加资源加到八点半,期间总是鼓励我说你真棒,你真棒,你真棒,在丁姐的鼓励下,我加到了15个。然后丁姐本来七点半就可以回去了的,然后我们回到馆里的时候,馆里门都关了。也是晚上才知道钥匙就会放在消防栓那里。今天在西湖文化广场那边加的资源质量不是很高。
2018-10-15
麋鹿含
妈妈让我挑一副最好的画,参加两岸少儿书画大赛。妈妈把我的画全拿过来,妈妈说你全摆着把入册的和没有入册的分开摆。我横着的放一排,我把竖着的放一排,画太多了我实在是太累了,我都出汗了。我感觉孔雀最好看,我就拿他参加比赛了。
C++编程基础与面向对象概念解析
侯昂
面向对象编程 C++语法 函数 类与对象 继承与多态性
C++编程基础与面向对象概念解析背景简介C++是一种广泛使用的面向对象编程语言,它允许开发者创建高效、灵活且功能强大的程序。本文基于《C++Primer》一书的章节内容,深入解析C++的核心概念和面向对象编程原则,旨在帮助读者构建扎实的C++编程基础。面向对象编程的原则软件危机与进化介绍了软件危机的产生和软件进化的必要性,强调了面向对象编程(OOP)在应对这些问题中的优势。面向对象编程范式讨论了面
K8s常用的命令
尚未来-
运维 k8s
一、基础命令查看集群信息bashkubectlcluster-info#显示集群端点和服务信息查看节点bashkubectlgetnodes#列出所有节点kubectldescribenode#查看节点详细信息查看命名空间bashkubectlgetnamespaces#列出所有命名空间切换命名空间bashkubectlconfigset-context--current--namespace=二
51晨间日记
讨喜的鱼
2018年11月15日,马上一个月又过去一半,离过年也不远。每到这个时候,心底总有些焦虑。是不是又像去年一样的场景,没赚什么钱,还是一无所有。再有没有以前的潇洒,一无所有,一身轻松,身上有些东西一旦背负,就卸不掉。今天比预计的时间,晚了两个小时,原来说服自己是这么简单的事,告诉自己多睡10分钟。一睁眼,已经过了2小时,这是常有的事。自律必须时刻警惕,而懒惰是要打个盹。工作的话,最近还算顺利。天天写
《感官品牌》读书笔记 1
西红柿阿达
原文:最近我在东京街头闲逛时,与一位女士擦肩而过,我发现她的香水味似曾相识。“哗”的一下,记亿和情感立刻像潮水般涌了出来。这个香水味把我带回了15年前上高中的时候,我的一位亲密好友也是用这款香水。一瞬间,我呆站在那里,东京的街景逐渐淡出,取而代之的是我年少时的丹麦以及喜悦、悲伤、恐惧、困惑的记忆。我被这熟悉的香水味征服了。感想:感官是有记忆的,你所听到,看到,闻到过的有代表性的事件都会在大脑中深深
Anaconda 和 Miniconda:功能详解与选择建议
古月฿
python入门 python conda
Anaconda和Miniconda详细介绍一、Anaconda的详细介绍1.什么是Anaconda?Anaconda是一个开源的包管理和环境管理工具,在数据科学、机器学习以及科学计算领域发挥着关键作用。它以Python和R语言为基础,为用户精心准备了大量预装库和工具,极大地缩短了搭建数据科学环境的时间。对于那些想要快速开展数据分析、模型训练等工作的人员来说,Anaconda就像是一个一站式的“数
Pandas:数据科学的超级瑞士军刀
科技林总
DeepSeek学AI 人工智能
**——从零基础到高效分析的进化指南**###**一、Pandas诞生:数据革命的救世主****2010年前的数据分析噩梦**:```python#传统Python处理表格数据data=[]forrowincsv_file:ifrow[3]>100androw[2]=="China":data.append(float(row[5])#代码冗长易错!```**核心痛点**:-Excel处理百万行崩
大数据之路:阿里巴巴大数据实践——大数据领域建模综述
为什么需要数据建模核心痛点数据冗余:不同业务重复存储相同数据(如用户基础信息),导致存储成本激增。计算资源浪费:未经聚合的明细数据直接参与计算(如全表扫描),消耗大量CPU/内存资源。数据一致性缺失:同一指标在不同业务线的口径差异(如“活跃用户”定义不同),引发决策冲突。开发效率低下:每次分析需重新编写复杂逻辑,无法复用已有模型。数据建模核心价值性能提升:分层设计(ODS→DWD→DWS→ADS)
学C++的五大惊人好处
为什么要学c++学c++有什么用学习c++的好处有1.中考可以加分2.高考可能直接录取3.就业广且工资高4.在未来30--50年c++一定是一个很受欢迎的职业5.c++成功的例子deepsick等AI智能C++语言兼备编程效率和编译运行效率的语言C++语言是C语言功能增强版,在c语言的基础上添加了面向对象编程和泛型编程的支持既继承了C语言高效,简洁,快速和可移植的传统,又具备类似Java、Go等其
Android 基础知识:Android 应用权限详解
流水mpc
android
这篇文章为大家系统的梳理一下Android权限相关的知识,在日常开发中,我们都用过权限,但是对于权限的一些细节我们可能掌握的还不够全面,这篇文章会全面的为大家介绍权限相关的知识。当然,本篇文章依然是参考了Google的官方文档:应用权限。本文目录一、认识Android权限(一)Android系统为什么需要权限?Android系统设置权限的目的是保护Android用户的隐私。对于用户的敏感数据And
Selenium基础教程
lemontree1945
selenium python 测试工具
1.Selenium环境安装1.1浏览器安装Chrome和ChromeDriver下载地址:https://googlechromelabs.github.io/chrome-for-testing/注意:驱动版本号要和浏览器版本号一致;安装后关闭浏览器自动更新:services.msc:打开系统服务找到和google相关的服务,全部修改为禁用1.2安装第三方库seleniumpipinstall
机器学习必备数学与编程指南:从入门到精通
a小胡哦
机器学习基础 机器学习 人工智能
一、机器学习核心数学基础1.线性代数(神经网络的基础)必须掌握:矩阵运算(乘法、转置、逆)向量空间与线性变换特征值分解与奇异值分解(SVD)为什么重要:神经网络本质就是矩阵运算学习技巧:用NumPy实际操作矩阵运算2.概率与统计(模型评估的关键)核心概念:条件概率与贝叶斯定理概率分布(正态、泊松、伯努利)假设检验与p值应用场景:朴素贝叶斯、A/B测试3.微积分(优化算法的基础)重点掌握:导数与偏导
Android 媒体播放开发完全指南
安卓开发者
Android Jetpack android 媒体 python
引言在当今移动应用生态中,媒体播放功能已成为许多应用的核心组成部分。无论是音乐流媒体应用、视频平台、播客客户端还是游戏应用,都需要强大的媒体播放能力。Android平台提供了丰富的API来支持各种媒体播放场景。本文将全面介绍Android媒体播放的开发技术,从基础到高级功能实现。一、Android媒体播放基础1.1支持的媒体格式Android原生支持多种媒体格式:音频:MP3、AAC、FLAC、W
Android通知(Notification)全面解析:从基础到高级应用
一、Android通知概述通知(Notification)是Android系统中用于在应用之外向用户传递信息的重要机制。当应用需要告知用户某些事件或信息时,可以通过通知在状态栏显示图标,用户下拉通知栏即可查看详细信息。这种机制几乎被所有现代应用采用,用于推送新闻、消息、广告等内容3。与Toast相比,Notification的优势在于:可以长时间停留在通知栏,适合内容较多且需要持久展示的信息支持丰
Unity学习笔记1
zy_777
通过一个星期的简单学习,初步了解了下unity,unity的使用,以及场景的布局,UI,以及用C#做一些简单的逻辑。好记性不如烂笔头,一些关键帧还是记起来比较好,哈哈,不然可能转瞬即逝了,(PS:纯小白观点,unity大神可以直接忽略了)一:MonoBehaviour类的初始化1,Instantiate()创建GameObject2,通过Awake()和Start()来做初始化3,Update、L
Enum用法
不懂事的小屁孩
enum
以前的时候知道enum,但是真心不怎么用,在实际开发中,经常会用到以下代码:
protected final static String XJ = "XJ";
protected final static String YHK = "YHK";
protected final static String PQ = "PQ";
【Spark九十七】RDD API之aggregateByKey
bit1129
spark
1. aggregateByKey的运行机制
/**
* Aggregate the values of each key, using given combine functions and a neutral "zero value".
* This function can return a different result type
hive创建表是报错: Specified key was too long; max key length is 767 bytes
daizj
hive
今天在hive客户端创建表时报错,具体操作如下
hive> create table test2(id string);
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:javax.jdo.JDODataSto
Map 与 JavaBean之间的转换
周凡杨
java 自省 转换 反射
最近项目里需要一个工具类,它的功能是传入一个Map后可以返回一个JavaBean对象。很喜欢写这样的Java服务,首先我想到的是要通过Java 的反射去实现匿名类的方法调用,这样才可以把Map里的值set 到JavaBean里。其实这里用Java的自省会更方便,下面两个方法就是一个通过反射,一个通过自省来实现本功能。
1:JavaBean类
1 &nb
java连接ftp下载
g21121
java
有的时候需要用到java连接ftp服务器下载,上传一些操作,下面写了一个小例子。
/** ftp服务器地址 */
private String ftpHost;
/** ftp服务器用户名 */
private String ftpName;
/** ftp服务器密码 */
private String ftpPass;
/** ftp根目录 */
private String f
web报表工具FineReport使用中遇到的常见报错及解决办法(二)
老A不折腾
finereport web报表 java报表 总结
抛砖引玉,希望大家能把自己整理的问题及解决方法晾出来,Mark一下,利人利己。
出现问题先搜一下文档上有没有,再看看度娘有没有,再看看论坛有没有。有报错要看日志。下面简单罗列下常见的问题,大多文档上都有提到的。
1、没有返回数据集:
在存储过程中的操作语句之前加上set nocount on 或者在数据集exec调用存储过程的前面加上这句。当S
linux 系统cpu 内存等信息查看
墙头上一根草
cpu 内存 liunx
1 查看CPU
1.1 查看CPU个数
# cat /proc/cpuinfo | grep "physical id" | uniq | wc -l
2
**uniq命令:删除重复行;wc –l命令:统计行数**
1.2 查看CPU核数
# cat /proc/cpuinfo | grep "cpu cores" | u
Spring中的AOP
aijuans
spring AOP
Spring中的AOP
Written by Tony Jiang @ 2012-1-18 (转)何为AOP
AOP,面向切面编程。
在不改动代码的前提下,灵活的在现有代码的执行顺序前后,添加进新规机能。
来一个简单的Sample:
目标类:
[java]
view plain
copy
print
?
package&nb
placeholder(HTML 5) IE 兼容插件
alxw4616
JavaScript jquery jQuery插件
placeholder 这个属性被越来越频繁的使用.
但为做HTML 5 特性IE没能实现这东西.
以下的jQuery插件就是用来在IE上实现该属性的.
/**
* [placeholder(HTML 5) IE 实现.IE9以下通过测试.]
* v 1.0 by oTwo 2014年7月31日 11:45:29
*/
$.fn.placeholder = function
Object类,值域,泛型等总结(适合有基础的人看)
百合不是茶
泛型的继承和通配符 变量的值域 Object类转换
java的作用域在编程的时候经常会遇到,而我经常会搞不清楚这个
问题,所以在家的这几天回忆一下过去不知道的每个小知识点
变量的值域;
package 基础;
/**
* 作用域的范围
*
* @author Administrator
*
*/
public class zuoyongyu {
public static vo
JDK1.5 Condition接口
bijian1013
java thread Condition java多线程
Condition 将 Object 监视器方法(wait、notify和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set (wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。
条件(也称为条件队列或条件变量)为线程提供了一
开源中国OSC源创会记录
bijian1013
hadoop spark MemSQL
一.Strata+Hadoop World(SHW)大会
是全世界最大的大数据大会之一。SHW大会为各种技术提供了深度交流的机会,还会看到最领先的大数据技术、最广泛的应用场景、最有趣的用例教学以及最全面的大数据行业和趋势探讨。
二.Hadoop
&nbs
【Java范型七】范型消除
bit1129
java
范型是Java1.5引入的语言特性,它是编译时的一个语法现象,也就是说,对于一个类,不管是范型类还是非范型类,编译得到的字节码是一样的,差别仅在于通过范型这种语法来进行编译时的类型检查,在运行时是没有范型或者类型参数这个说法的。
范型跟反射刚好相反,反射是一种运行时行为,所以编译时不能访问的变量或者方法(比如private),在运行时通过反射是可以访问的,也就是说,可见性也是一种编译时的行为,在
【Spark九十四】spark-sql工具的使用
bit1129
spark
spark-sql是Spark bin目录下的一个可执行脚本,它的目的是通过这个脚本执行Hive的命令,即原来通过
hive>输入的指令可以通过spark-sql>输入的指令来完成。
spark-sql可以使用内置的Hive metadata-store,也可以使用已经独立安装的Hive的metadata store
关于Hive build into Spark
js做的各种倒计时
ronin47
js 倒计时
第一种:精确到秒的javascript倒计时代码
HTML代码:
<form name="form1">
<div align="center" align="middle"
java-37.有n 个长为m+1 的字符串,如果某个字符串的最后m 个字符与某个字符串的前m 个字符匹配,则两个字符串可以联接
bylijinnan
java
public class MaxCatenate {
/*
* Q.37 有n 个长为m+1 的字符串,如果某个字符串的最后m 个字符与某个字符串的前m 个字符匹配,则两个字符串可以联接,
* 问这n 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。
*/
public static void main(String[] args){
mongoDB安装
开窍的石头
mongodb安装 基本操作
mongoDB的安装
1:mongoDB下载 https://www.mongodb.org/downloads
2:下载mongoDB下载后解压
 
[开源项目]引擎的关键意义
comsci
开源项目
一个系统,最核心的东西就是引擎。。。。。
而要设计和制造出引擎,最关键的是要坚持。。。。。。
现在最先进的引擎技术,也是从莱特兄弟那里出现的,但是中间一直没有断过研发的
 
软件度量的一些方法
cuiyadll
方法
软件度量的一些方法http://cuiyingfeng.blog.51cto.com/43841/6775/在前面我们已介绍了组成软件度量的几个方面。在这里我们将先给出关于这几个方面的一个纲要介绍。在后面我们还会作进一步具体的阐述。当我们不从高层次的概念级来看软件度量及其目标的时候,我们很容易把这些活动看成是不同而且毫不相干的。我们现在希望表明他们是怎样恰如其分地嵌入我们的框架的。也就是我们度量的
XSD中的targetNameSpace解释
darrenzhu
xml namespace xsd targetnamespace
参考链接:
http://blog.csdn.net/colin1014/article/details/357694
xsd文件中定义了一个targetNameSpace后,其内部定义的元素,属性,类型等都属于该targetNameSpace,其自身或外部xsd文件使用这些元素,属性等都必须从定义的targetNameSpace中找:
例如:以下xsd文件,就出现了该错误,即便是在一
什么是RAID0、RAID1、RAID0+1、RAID5,等磁盘阵列模式?
dcj3sjt126com
raid
RAID 1又称为Mirror或Mirroring,它的宗旨是最大限度的保证用户数据的可用性和可修复性。 RAID 1的操作方式是把用户写入硬盘的数据百分之百地自动复制到另外一个硬盘上。由于对存储的数据进行百分之百的备份,在所有RAID级别中,RAID 1提供最高的数据安全保障。同样,由于数据的百分之百备份,备份数据占了总存储空间的一半,因而,Mirror的磁盘空间利用率低,存储成本高。
Mir
yii2 restful web服务快速入门
dcj3sjt126com
PHP yii2
快速入门
Yii 提供了一整套用来简化实现 RESTful 风格的 Web Service 服务的 API。 特别是,Yii 支持以下关于 RESTful 风格的 API:
支持 Active Record 类的通用API的快速原型
涉及的响应格式(在默认情况下支持 JSON 和 XML)
支持可选输出字段的定制对象序列化
适当的格式的数据采集和验证错误
MongoDB查询(3)——内嵌文档查询(七)
eksliang
MongoDB查询内嵌文档 MongoDB查询内嵌数组
MongoDB查询内嵌文档
转载请出自出处:http://eksliang.iteye.com/blog/2177301 一、概述
有两种方法可以查询内嵌文档:查询整个文档;针对键值对进行查询。这两种方式是不同的,下面我通过例子进行分别说明。
二、查询整个文档
例如:有如下文档
db.emp.insert({
&qu
android4.4从系统图库无法加载图片的问题
gundumw100
android
典型的使用场景就是要设置一个头像,头像需要从系统图库或者拍照获得,在android4.4之前,我用的代码没问题,但是今天使用android4.4的时候突然发现不灵了。baidu了一圈,终于解决了。
下面是解决方案:
private String[] items = new String[] { "图库","拍照" };
/* 头像名称 */
网页特效大全 jQuery等
ini
JavaScript jquery css html5 ini
HTML5和CSS3知识和特效
asp.net ajax jquery实例
分享一个下雪的特效
jQuery倾斜的动画导航菜单
选美大赛示例 你会选谁
jQuery实现HTML5时钟
功能强大的滚动播放插件JQ-Slide
万圣节快乐!!!
向上弹出菜单jQuery插件
htm5视差动画
jquery将列表倒转顺序
推荐一个jQuery分页插件
jquery animate
swift objc_setAssociatedObject block(version1.2 xcode6.4)
啸笑天
version
import UIKit
class LSObjectWrapper: NSObject {
let value: ((barButton: UIButton?) -> Void)?
init(value: (barButton: UIButton?) -> Void) {
self.value = value
Aegis 默认的 Xfire 绑定方式,将 XML 映射为 POJO
MagicMa_007
java POJO xml Aegis xfire
Aegis 是一个默认的 Xfire 绑定方式,它将 XML 映射为 POJO, 支持代码先行的开发.你开发服 务类与 POJO,它为你生成 XML schema/wsdl
XML 和 注解映射概览
默认情况下,你的 POJO 类被是基于他们的名字与命名空间被序列化。如果
js get max value in (json) Array
qiaolevip
每天进步一点点 学习永无止境 max 纵观千象
// Max value in Array
var arr = [1,2,3,5,3,2];Math.max.apply(null, arr); // 5
// Max value in Jaon Array
var arr = [{"x":"8/11/2009","y":0.026572007},{"x"
XMLhttpRequest 请求 XML,JSON ,POJO 数据
Luob.
POJO json Ajax xml XMLhttpREquest
在使用XMlhttpRequest对象发送请求和响应之前,必须首先使用javaScript对象创建一个XMLHttpRquest对象。
var xmlhttp;
function getXMLHttpRequest(){
if(window.ActiveXObject){
xmlhttp:new ActiveXObject("Microsoft.XMLHTTP
jquery
wuai
jquery
以下防止文档在完全加载之前运行Jquery代码,否则会出现试图隐藏一个不存在的元素、获得未完全加载的图像的大小 等等
$(document).ready(function(){
jquery代码;
});
<script type="text/javascript" src="c:/scripts/jquery-1.4.2.min.js&quo