- 浏览: 951786 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
sscsacdsadcsd:
mike8625 写道react还要自己的一些标签 还得编译 ...
对于React体系的一点想法 -
mike8625:
说的都是给大公司听的,国内很多还是小公司,做个小项目, 说实话 ...
关于国内前端和JS技术发展的乱想 -
mike8625:
react还要自己的一些标签 还得编译 编译吧浏览器端说还慢 ...
对于React体系的一点想法 -
u012814086:
下意识想到了Golang
JavaScript语句后应该加分号么? -
xueduanyang:
我是水羊,年轻的时候觉得只要有好斧子就能做成好产品,各种产品都 ...
关于国内前端和JS技术发展的乱想
前不久写了一个小脚本,用来获取页面中CSS样式的 used value 。
什么是Used Value?
简单来说就是样式表应用到页面元素的最终结果值。比方说一个p元素,可能有多份样式表的多个样式规则,都关系到p元素的最终样式,但是最终一个特定p元素的实际css属性,比如它的width,当然只能有一个值。这个值就叫做used value。更精确的定义,请看CSS 2.1规范的6.1.3节。
大多数同志可能知道computed value,因为符合标准的浏览器上有window.getComputedStyle()方法。
实际上,按照我对规范的理解,这个getComputedStyle方法返回的其实应该是used value,而不是computed value。这两者的差别是,computed value是无需layout时所能得到的值。比如,经过cascade计算后,实际应用于p的width为10em,假设p的fontSize是16px,则它的width的computed value就是160px,这是可以确定计算出来的。但是不是所有computed value都能这样确定下来,有些值要到layout时才能确定。比如p的width为50%,假定p是body的子元素,则这个50%是相对于body的宽度的。如果body没有设过明确的宽度,那实际上就是窗口的客户区宽度(clientWidth)。所以p的width是多少,只有到了layout的步骤才能算出来。另一个例子是table,本身td的宽度可以设定为table宽度的百分比,而非fixed的table本身的宽度又是要根据所有td(如内容多少、字体大小、换行设置等)来确定的,这个layout计算过程相当复杂。
所以,将computed value加上所有相关依赖,最后得到的结果,就叫做used value。
那么为什么DOM方法叫做getComputedStyle,而不是getUsedStyle呢?这是因为DOM level 2 CSS规范制定时(2000年)还没有CSS2.1。DOM是按照更早的CSS2规范来的,在CSS2中还没有提出computed value和used value的区分。严格的说,CSS2中定义的computed value,既不是CSS2.1的computed value,也不是CSS2.1的used value,而是某种有点含糊的两者混合体。CSS2.1之所以加上这个区分,可能是为了澄清有关inherit的值如何计算的问题。
抛开规范的问题,获得used value对于ajax开发者来说有时是很有用的。比如典型的垂直居中问题,通常的做法,你要获得实际的元素高度和容器高度的used value。就这个特定问题,通常利用clientHeight、offsetHeight(它们不是CSS property)等来计算。不过如果要满足一些其他要求,你可能还需要获得padding、border、margin、outline的used value。getUsedValue还具有更广泛的用途,例如获取某个元素里font的实际大小、或者某个元素的实际颜色之类的信息。另外,浏览器的功能有多强大,bug就有多烦人。有时候你难免要为特定问题打patch,而getUsedValue是打patch的居家必备武器。
我写的这个getUsedValue的API如下:
前两个参数比较好理解,最后一个参数是指定css长度单位(如果你要取的是一个css长度值的话)。如果不指定这个值(就传前两个参数),则返回的是一个字符串,例如"12px",如果你指定了cssUnit为“px”,则返回的是一个数字,即12。这对于要进行运算来说比较方便,省得你自己去parseFloat和parseInt。
来看一个简单的使用例子:
这个verticalAlign,用来将一个元素(由第一个参数e指定)在其父元素内垂直定位,默认会放在中间偏上一些(符合黄金分割的比例)。具体实现主要是通过clientHeight和offsetHeight来的,本来可以不用getUsedValue。但是我们有个额外的要求,希望在垂直定位时,仍然保留marginTop的用途,即元素上方至少要保留由元素的marginTop指定的空间。所以我们要得到marginTop的值,作为垂直定位时top的下限。
var minTop = getUsedValue(e, 'marginTop', 'px')
这句就是了。它表示获得e元素的marginTop以px单位记的数值。
下面是这个getUsedValue函数的源代码。代码以LGPL方式发布。
注意,目前还只是0.1版,没有经过充分的测试。
已知的问题包括:
1. 标准浏览器下,依赖getComputedStyle,而getComputedStyle函数,由于之前讲过的标准制定上的不同步,导致实际各浏览器实现可能有差异(可参考http://www.nabble.com/getComputedStyle-results-td16390247.html)。
2. getComputedStyle不支持px以外的相对单位,即使specified value确实是em/ex,也只能得到绝对值,无法倒算回去。
3. IE下是根据currentStyle来进一步计算的。currentStyle介于specified value和computed value之间(当然实际上都不是,因为IE的CSS模型根本完全不合标准,所以只是就概念上说部分属性相当于specified value,部分属性相当于computed value)。目前只针对css长度进行了进一步计算,而且不支持百分比和ex计算。em只在currentStyle返回原值是em时才可用。
4. 复杂情况,如table,如visibility:hidden、display:none之类的,都尚未有时间测试。
下一步的计划是:
1. 做更多实例的测试
2. 做更多浏览器的测试(目前其实只测了IE6和FF3)
3. 完全支持em和%长度的计算(ex不会支持,因为基本没人用,且无法准确测量ex,ex依赖于字体,bug之多无法计数)
4. 支持各种格式的颜色值的计算
欢迎大家测试和反馈bug。
什么是Used Value?
简单来说就是样式表应用到页面元素的最终结果值。比方说一个p元素,可能有多份样式表的多个样式规则,都关系到p元素的最终样式,但是最终一个特定p元素的实际css属性,比如它的width,当然只能有一个值。这个值就叫做used value。更精确的定义,请看CSS 2.1规范的6.1.3节。
大多数同志可能知道computed value,因为符合标准的浏览器上有window.getComputedStyle()方法。
实际上,按照我对规范的理解,这个getComputedStyle方法返回的其实应该是used value,而不是computed value。这两者的差别是,computed value是无需layout时所能得到的值。比如,经过cascade计算后,实际应用于p的width为10em,假设p的fontSize是16px,则它的width的computed value就是160px,这是可以确定计算出来的。但是不是所有computed value都能这样确定下来,有些值要到layout时才能确定。比如p的width为50%,假定p是body的子元素,则这个50%是相对于body的宽度的。如果body没有设过明确的宽度,那实际上就是窗口的客户区宽度(clientWidth)。所以p的width是多少,只有到了layout的步骤才能算出来。另一个例子是table,本身td的宽度可以设定为table宽度的百分比,而非fixed的table本身的宽度又是要根据所有td(如内容多少、字体大小、换行设置等)来确定的,这个layout计算过程相当复杂。
所以,将computed value加上所有相关依赖,最后得到的结果,就叫做used value。
那么为什么DOM方法叫做getComputedStyle,而不是getUsedStyle呢?这是因为DOM level 2 CSS规范制定时(2000年)还没有CSS2.1。DOM是按照更早的CSS2规范来的,在CSS2中还没有提出computed value和used value的区分。严格的说,CSS2中定义的computed value,既不是CSS2.1的computed value,也不是CSS2.1的used value,而是某种有点含糊的两者混合体。CSS2.1之所以加上这个区分,可能是为了澄清有关inherit的值如何计算的问题。
抛开规范的问题,获得used value对于ajax开发者来说有时是很有用的。比如典型的垂直居中问题,通常的做法,你要获得实际的元素高度和容器高度的used value。就这个特定问题,通常利用clientHeight、offsetHeight(它们不是CSS property)等来计算。不过如果要满足一些其他要求,你可能还需要获得padding、border、margin、outline的used value。getUsedValue还具有更广泛的用途,例如获取某个元素里font的实际大小、或者某个元素的实际颜色之类的信息。另外,浏览器的功能有多强大,bug就有多烦人。有时候你难免要为特定问题打patch,而getUsedValue是打patch的居家必备武器。
我写的这个getUsedValue的API如下:
getUsedValue(element, cssPropertyName, cssUnit)
前两个参数比较好理解,最后一个参数是指定css长度单位(如果你要取的是一个css长度值的话)。如果不指定这个值(就传前两个参数),则返回的是一个字符串,例如"12px",如果你指定了cssUnit为“px”,则返回的是一个数字,即12。这对于要进行运算来说比较方便,省得你自己去parseFloat和parseInt。
来看一个简单的使用例子:
function verticalAlign(e, ratio) { ratio = ratio || 0.382 var p = e.offsetParent || e.parentNode var s = e.style var minTop = getUsedValue(e, 'marginTop', 'px') s.position = 'relative' s.top = Math.max(minTop, (p.clientHeight - e.offsetHeight) * ratio - minTop) + 'px' }
这个verticalAlign,用来将一个元素(由第一个参数e指定)在其父元素内垂直定位,默认会放在中间偏上一些(符合黄金分割的比例)。具体实现主要是通过clientHeight和offsetHeight来的,本来可以不用getUsedValue。但是我们有个额外的要求,希望在垂直定位时,仍然保留marginTop的用途,即元素上方至少要保留由元素的marginTop指定的空间。所以我们要得到marginTop的值,作为垂直定位时top的下限。
var minTop = getUsedValue(e, 'marginTop', 'px')
这句就是了。它表示获得e元素的marginTop以px单位记的数值。
下面是这个getUsedValue函数的源代码。代码以LGPL方式发布。
// getUsedValue() version 0.1 // Copyright 2009 hax<johnhax@gmail.com> // You can use and distribute these codes under LGPL v3 license. var CSSValueUnitTypes = [ 'unknown', 'number', '%', 'em', 'ex', 'px', 'cm', 'mm', 'in', 'pt', 'pc', 'deg', 'rad', 'grad', 'ms', 's', 'hz', 'khz', 'dimension', 'string', 'uri', 'indent', 'attr', 'counter', 'rect', 'rgbcolor' ] function isLengthProperty(prop) { return '\ top right bottom left \ marginLeft marginRight marginTop marginBottom outlineWidth \ borderTopWidth borderRightWidth borderBottomWidth borderLeftWidth \ paddingTop paddingRight paddingBottom paddingLeft \ maxHeight maxWidth minHeight minWidth height width \ fontSize lineHeight textIndent letterSpacing wordSpacing \ borderSpacing backgroundPosition clip \ '.indexOf(prop) != -1 } function isLengthUnit(unit) { return ('% em ex px cm mm in pt pc'.indexOf(unit) != -1) } function isAbsoluteLengthUnit(unit) { return ('cm mm in pt pc'.indexOf(unit) != -1) } function convertAbsoluteLength(n, u, u2) { if (u == u2) return n var t = { in_cm:2.54, in_pt:72, cm_mm:10, pc_pt:12 } t.in_mm = t.in_cm * t.cm_mm //25.4 t.in_pc = t.in_pt / t.pc_pt //6 t.cm_pt = t.in_pt / t.in_cm t.cm_pc = t.in_pc / t.in_cm t.mm_pt = t.in_pt / t.in_mm t.mm_pc = t.in_pc / t.in_mm var r if (r = t[u + '_' + u2]) return n * r if (r = t[u2 + '_' + u]) return n / r throw Error('Can not convert: ' + u + ' -> ' + u2) } function cssPropertyName(cssAttributeName) { return cssAttributeName.replace(/([A-Z])/g, '-$1').toLowerCase() } function getDPI() { if (!getDPI._1in) { getDPI._1in = document.createElement('div') var s = getDPI._1in.style s.margin = s.borderWidth = s.padding = '0' s.maxWidth = s.minWidth = s.width = '1in' } return getDPI._1in.style.pixelWidth } function calcPixelLength(elt, cssLength) { var s if (!calcPixelLength._temp) { calcPixelLength._temp = document.createElement('div') s = calcPixelLength._temp.style s.margin = s.borderWidth = s.padding = '0' s.display = 'none' } s = calcPixelLength._temp.style s.maxWidth = s.minWidth = s.width = cssLength elt.appendChild(calcPixelLength._temp) var r = s.pixelWidth elt.removeChild(calcPixelLength._temp) return r } function calcFontSize(size) { var s if (!calcFontSize._temp) { calcFontSize._temp = document.createElement('div') s = calcFontSize._temp.style s.margin = s.borderWidth = s.padding = '0' s.maxWidth = s.minWidth = s.width = '1em' } s = calcFontSize._temp.style s.fontSize = size return s.pixelWidth } function getUsedValue(elt, prop, unit) { if (typeof getComputedStyle == 'function') { if (unit == null) { return getComputedStyle(elt, null)[prop] } else { var unitType = CSSValueUnitTypes.indexOf(unit) var value = getComputedStyle(elt, null). getPropertyCSSValue(cssPropertyName(prop)) switch (unitType) { default: return value.getFloatValue(unitType) } } } if (elt.currentStyle) { var v = elt.currentStyle[prop] if (!v) return v if (isLengthUnit(unit) || isLengthProperty(prop)) { if (prop == 'fontSize') { if ('xx-small x-small small medium large x-large xx-large'. indexOf(v) != -1) { var n = calcFontSize(v) if (unit == null) return n + 'px' if (unit == 'px') return n if (isAbsoluteLengthUnit(unit)) return convertAbsoluteLength(n / getDPI(), 'in', unit) throw Error('px -> ' + unit + ' convertion has not implemented yet') } if ('smaller larger'.indexOf(v) != -1) throw Error('Calculation of font relative size has not implemented yet') } var n, u var a = /^([+-]?([0-9]+|[0-9]*[.][0-9]+))(em|ex|px|in|cm|mm|pt|pc|%)?/.exec(v) if (a == null) throw Error('Unknown length format: ' + v) n = parseFloat(a[1]), u = a[3] if (u == unit) return n if (u == 'px') { if (unit == null) return v if (isAbsoluteLengthUnit(unit)) return convertAbsoluteLength(n / getDPI(), 'in', unit) throw Error('px -> ' + unit + ' convertion has not implemented yet') } if (isAbsoluteLengthUnit(u)) { if (isAbsoluteLengthUnit(unit)) return convertAbsoluteLength(n, u, unit) n = convertAbsoluteLength(n, u, 'in') * getDPI() if (unit == 'px') return n if (unit == null) return n + 'px' throw Error(u + ' -> ' + unit + ' convertion has not implemented yet') } var pixelProp = { width:'pixelWidth',height:'pixelHeight', top:'pixelTop',bottom:'pixelBottom', left:'pixelLeft',right:'pixelRight' }[prop] if (pixelProp) { n = elt.currentStyle[pixelProp] if (unit == 'px') return n if (unit == null) return n + 'px' throw Error('px -> ' + unit + ' convertion has not implemented yet') } if (u == '%') { throw Error('Percentage value calculation has not implemented yet') } if (u == 'ex') { throw Error('ex value calculation has not implemented yet') } if (u == 'em') { if (prop == 'fontSize') { n = calcPixelLength(elt.parentNode, v) } else { n *= getUsedValue(elt, 'fontSize', 'px') } if (unit == 'px') return n if (unit == null) return n + 'px' throw Error('em -> ' + unit + ' convertion has not implemented yet') } throw Error('Unknown unit type: ' + u) } else { return v } } }
注意,目前还只是0.1版,没有经过充分的测试。
已知的问题包括:
1. 标准浏览器下,依赖getComputedStyle,而getComputedStyle函数,由于之前讲过的标准制定上的不同步,导致实际各浏览器实现可能有差异(可参考http://www.nabble.com/getComputedStyle-results-td16390247.html)。
2. getComputedStyle不支持px以外的相对单位,即使specified value确实是em/ex,也只能得到绝对值,无法倒算回去。
3. IE下是根据currentStyle来进一步计算的。currentStyle介于specified value和computed value之间(当然实际上都不是,因为IE的CSS模型根本完全不合标准,所以只是就概念上说部分属性相当于specified value,部分属性相当于computed value)。目前只针对css长度进行了进一步计算,而且不支持百分比和ex计算。em只在currentStyle返回原值是em时才可用。
4. 复杂情况,如table,如visibility:hidden、display:none之类的,都尚未有时间测试。
下一步的计划是:
1. 做更多实例的测试
2. 做更多浏览器的测试(目前其实只测了IE6和FF3)
3. 完全支持em和%长度的计算(ex不会支持,因为基本没人用,且无法准确测量ex,ex依赖于字体,bug之多无法计数)
4. 支持各种格式的颜色值的计算
欢迎大家测试和反馈bug。
评论
12 楼
cloudgamer
2009-04-22
ie8和ff的规律是一行中第一个和最后一个td的实际宽度是offsetWidth减去boder的一半
中间的还是相同的
中间的还是相同的
11 楼
cloudgamer
2009-04-22
上面的ie是ie8
10 楼
cloudgamer
2009-04-22
发现一个用offsetWidth也不准确的情况
<table border="30" width="300" style="border-collapse:collapse;">
<tr>
<td id="tt" bgcolor="#FF0000"> 1</td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
</table>
ie中tt的offsetWidth是98但实际应该是约83
ff中offsetWidth是111但实际应该是约95
相差都差不多是15(border的一半)
<table border="30" width="300" style="border-collapse:collapse;">
<tr>
<td id="tt" bgcolor="#FF0000"> 1</td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
</table>
ie中tt的offsetWidth是98但实际应该是约83
ff中offsetWidth是111但实际应该是约95
相差都差不多是15(border的一半)
9 楼
hax
2009-04-21
因为border比较麻烦,所以暂时没有支持。下个小版本(明天吧)会增加对border的支持。
8 楼
cloudgamer
2009-04-21
看来还是得用原始的方法了
你好像忘了考虑border哦
你好像忘了考虑border哦
7 楼
hax
2009-04-21
更新了,版本0.1.3,加入了对IE下width:auto/height:auto的支持,另外修正了一个小bug。
地址不变:http://pie.googlecode.com/svn/trunk/src/util/getUsedValue.js
地址不变:http://pie.googlecode.com/svn/trunk/src/util/getUsedValue.js
6 楼
cloudgamer
2009-04-21
哦
确实需要runtimeStyle
忘了考虑
但还有一个情况
<div style="width:500px;">
<div id="tt"></div>
</div>
这样tt得到的width是auto
就得不到结果了
还有什么方法吗
确实需要runtimeStyle
忘了考虑
但还有一个情况
<div style="width:500px;">
<div id="tt"></div>
</div>
这样tt得到的width是auto
就得不到结果了
还有什么方法吗
5 楼
cloudgamer
2009-04-21
今天才知道有个pixelWidth的属性
谢谢!
貌似直接style.pixelWidth就能得到结果了
谢谢!
貌似直接style.pixelWidth就能得到结果了
4 楼
hax
2009-04-21
使用更新的0.1.1版本:http://pie.googlecode.com/svn/trunk/src/util/getUsedValue.js
加上了对于 width/height/top/left/right/bottom 在IE下的支持,不过注意:似乎只在IE6的standard模式下才正确,在quirk mode下,得到的值似有问题。
加上了对于 width/height/top/left/right/bottom 在IE下的支持,不过注意:似乎只在IE6的standard模式下才正确,在quirk mode下,得到的值似有问题。
<!DOCTYPE html> <style> #test { width:50%; } </style> <div id="test" style="padding:2px; border:2px solid black;">test</div> <script src="http://pie.googlecode.com/svn/trunk/src/util/getUsedValue.js"></script> <script> var div = document.getElementById("test") try { alert(getUsedValue(div, 'width')) } catch(e) { alert(e.message) } </script>
3 楼
cloudgamer
2009-04-20
这么快哦
例如
<div id="tt" style="width:50%"></div>
<script>
var o=document.getElementById("tt");
if(document.defaultView){
alert(document.defaultView.getComputedStyle(o, null).width)
}else{
alert(o.currentStyle.width)
}
</script>
currentStyle是50%
getComputedStyle是准确值
我需要在ie获取准确值有什么方法
求教
例如
<div id="tt" style="width:50%"></div>
<script>
var o=document.getElementById("tt");
if(document.defaultView){
alert(document.defaultView.getComputedStyle(o, null).width)
}else{
alert(o.currentStyle.width)
}
</script>
currentStyle是50%
getComputedStyle是准确值
我需要在ie获取准确值有什么方法
求教
2 楼
hax
2009-04-20
@cloudgamer 能否说得更详细一点,给出testcase是最好的。
1 楼
cloudgamer
2009-04-20
宽度获取document.defaultView.getComputedStyle
和currentStyle不相同
怎么解决
和currentStyle不相同
怎么解决
发表评论
-
对于React体系的一点想法
2015-06-12 01:53 5645这一年来react和react native火得不行。 我对 ... -
图片lazyload兼容无脚本的小改进
2012-12-04 19:09 5582刚刚改进了一下某个页 ... -
tagName的大小写问题(QWrap选择器的一个bug)
2011-07-16 23:33 6462今儿写程序。 对于现 ... -
document.enableStyleSheetsForSet() 的兼容
2011-06-17 16:27 3456可能有不少同学已经了 ... -
IE神奇小bug一则
2010-12-03 18:05 2724<input type="text&quo ... -
前端优化新得一则
2010-02-22 15:05 2810因为把公司的电脑搞坏两台,这两天没有工作电脑可用了,所以就不干 ... -
一个史上最快的Web语法高亮引擎即将诞生
2009-05-02 03:33 6165对比对象是目前最有名,也是JavaEye所使用的highlig ... -
getUsedValue 0.4发布
2009-04-28 18:46 2004关于used value的基本解释,请看getUsedValu ... -
表单数据提交时的字符编码问题
2009-01-18 02:28 6166人老了,以前研究过的东西都忘记了。所以还是记录下来比较好。 ... -
再贴一次form的属性和控件name冲突的老问题
2008-11-07 18:59 3137更新: John Resig也谈到了这个问题。 而这里是一个非 ... -
一个嵌入式HTML引擎
2008-05-10 18:28 4092http://www.terrainformatica.com ... -
西方人通常发现不了的一个IE的bug
2008-05-09 20:00 8645这个问题我大概在一年 ... -
IE memory leak 备忘
2008-03-03 01:07 5091本篇只记录一下工具,有空再做研究。 Drip: http:/ ... -
批量修改style采取哪种方式好(续篇)
2008-02-24 19:20 3889前篇见批量修改style采取哪种方式好,主要是回答fins的提 ... -
XBL2的实现
2008-02-24 02:35 2289今天发现几种XBL2的实现。浏览器实现XBL2还要等上一段时间 ... -
批量修改style采取哪种方式好(答fins)
2008-02-23 21:55 4330fins同志向我提了个问题。因这个问题其实可以展开讨论,所以提 ... -
使用捕获事件监听器(useCapture=true)的陷阱及其对策
2008-02-17 07:02 9675DOM event flow有三个phase,capture、 ... -
写了一个XML Base的JS实现(简介篇)
2008-01-23 01:08 3119最近想在一个小应用中采用浏览器端的xinclude。找了一下, ... -
MSXML默认解析外部DTD
2007-11-07 18:17 3555昨日aimingoo说它测试xmldom的速度,发现载入一个w ... -
基于Ajax技术的VNC
2007-09-19 10:44 2940http://sourceforge.net/projects ...
相关推荐
前18大旋转修整器企业占据全球87%的市场份额
SKYSAT IMAGERY PRODUCT SPECIFICATION PLANET.COM VIDEO Full motion videos are collected between 30 and 120 seconds by a single camera from any of the active SkySats. Videos are collected using only the Panchromatic half of the camera, hence all videos are PAN only. Videos are packaged and delivered with a video mpeg-4 file, plus all image frames with accompanying video metadata and a frame index file (reference Product Types below)
Screenshot_20240506_133458_com.netease.yhtj.vivo.jpg
大学生,数学建模,美国大学生数学建模竞赛,MCM/ICM,历年美赛特等奖O奖论文
雷达物位变送器安装和操作手册
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
快速排序是一种基于分治策略的排序算法,通过选择一个基准元素,将待排序的数组划分为两个子数组,一个包含所有小于基准的元素,另一个包含所有大于基准的元素,然后递归地对这两个子数组进行快速排序。快速排序在平均情况下具有O(n log n)的时间复杂度,是一种非常高效的排序算法。然而,在最坏情况下,当输入数据已经有序或接近有序时,快速排序的性能会退化为O(n^2)。此外,快速排序是不稳定的排序算法,即相等的元素可能在排序过程中改变相对位置。尽管如此,快速排序仍然因其高效的平均性能而在实际应用中广泛使用。在Python3中,可以通过递归或迭代的方式实现快速排序算法,但为了避免额外的空间开销,通常会采用原地排序的方式来实现。
【作品名称】:基于51单片机的出租车计价器(昼夜) 含(程序、仿真图、流程图、原理图) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 出租车计价器: 1、不同情况具有不同的收费标准,具有白天和夜晚不同的计价能力 2、能进行手动修改单价 3、具有数据的复位功能(起步价,起步公里数,里程单价,白天晚上不一样) 4、能够在掉电的情况下存储单价等数据 5、步进电机模拟里程,一圈表示一里路
2024年中国API 11P往复式气体压缩机行业研究报告
附件是Windows 10系统上安装和配置Tomcat的步骤,文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的!
此试题是考试后回忆版本,你会发现是惊喜。恭喜你考个好成绩。
数据库+人大金仓+Linux系统安装
大学生,数学建模,美国大学生数学建模竞赛,MCM/ICM,2023年美赛特等奖O奖论文
opencv-python-4.5.4.60-cp36-cp36m-win-amd64.whl
减肥管理,全球前10强生产商排名及市场份额
内容概要:《上海大学大学生创新创业训练计划申请书(创新训练项目)》是用于申请参加上海大学的大学生创新创业训练计划的申请书,旨在帮助学生提出创新项目计划,获得培训和支持,促进学生创新创业能力的提升。 适用人群:适合上海大学的在校大学生,特别是对创新创业感兴趣、有创新想法和创业计划的学生,希望通过该计划获得指导和资源支持,实现自己的创业梦想。 使用场景及目标:申请书的使用场景是为了参加上海大学的大学生创新创业训练计划,目标是通过提交详细的创新项目计划,获得评审通过并获得培训、指导和资金支持,从而推动学生的创新创业实践和能力提升。 其他说明:申请书应包括清晰的创新项目描述、项目可行性分析、预期目标和计划、团队介绍等内容,以展现学生的创新能力和项目潜力。申请书的撰写需要认真准备,体现出学生对创新创业的热情和才华,以提高申请成功的机会。
IEC 60364-7-716-2023 低压电气装置.第7-716部分:特殊装置或场所的要求.信息和通信技术(ICT)电缆基础设施上的ELV直流配电.pdf
IEC PAS 61851-1-1 2023 电动汽车导电充电系统.第1-1部分:使用4型车辆耦合器的电动汽车导电带电系统的特殊要求.pdf
前11大客运渡轮服务企业占据全球30.3%的市场份额
wsl+MCgpu安装记录