搜索
首页web前端js教程使用node.js创建电池:客户端

使用node.js创建电池:客户端

钥匙要点

  • >本文介绍了如何使用Node.js构建电池可视化服务的客户端部件,该服务在不重新加载页面的情况下定期更新电池状态。客户可以暂停或恢复更新,以避免在不需要信息时使系统重载。
  • >
  • 反应性设计和声明框架用于自动有效地更新文档对象模型(DOM),以响应数据的变化。这是使用ractive.js来实现的,ractive.js是一个将数据绑定到DOM元素并每次数据更改时都会更新DOM的库。
  • >作者演示了如何使用ractive.js创建电池可视化,包括设置暂停/简历更新的机制,并从静止服务中异步检索数据。
  • >
  • >本文以一个呼吁结束,以进一步探索所讨论的工具和概念,例如使用node.js设置http服务器,RESTFULE API,在Node.js服务器上运行OS终端命令以及声明框架的基础知识和ractive.js。
  • 在这个迷你系列的第一部分中,我们讨论了我们正在构建的服务的细节以及您将学到的东西。然后,我们介绍了为什么我们需要服务器以及为什么我选择创建RESTFUL服务的原因。在讨论如何开发服务器时,我借此机会讨论了如何识别当前操作系统以及如何使用node.js在其上运行命令。 在本系列的第二个也是最后一部分中,您将发现如何以不错的方式构建客户部分以向用户提供信息。为了实现此目标,我们应该每x分钟(或秒)更新电池状态,而无需重新加载页面。此外,我们应该能够暂停/简历更新,以避免在不需要信息时泛滥到我们的系统,甚至当我们不查看页面时。为此,我们将:
    >安排Ajax通过常规时间间隔来打电话给我们的后端服务; >
  • >使用一个声明的框架,该框架会自动有效地对数据的更改进行自动更新; >
  • 使用一些jQuery效用功能使我们的生活更轻松;
  • >
  • >使用一些不错的图像和CSS使仪表板视觉吸引人(作为奖励!)。

反应性设计

讨论Ajax和异步电话肯定不在本文的范围之内(我将在帖子结尾提供一些有用的链接)。出于我们的目的,我们甚至可以将它们视为黑匣子,使我们可以向服务器询问一些数据,并在将数据发送回数据后执行某些操作。 相反,让我们花一点时间讨论反应性设计和声明性框架。 HTML页面默认是静态实体。这意味着,对于纯HTML页面,每次在浏览器中渲染时,页面上显示的内容保持不变。但是,我们知道,通过使用JavaScript以及一些模板库(例如Mustache),我们可以动态更新它们。 有许多库可以帮助开发人员将数据绑定到DOM节点。他们中的大多数使用JavaScript来描述应转换数据的DOM元素,并需要对页面进行更新,以手动触发(通过JavaScript)。因此,我们最终依靠应用程序的逻辑来确定应何时更新可视化以及应对数据更改应进行的更改。 声明框架将数据绑定到DOM元素,并在数据更改时自动更新DOM。还使用演示文稿中的模板(HTML标记)而不是JavaScript中的模板提供了这种绑定。 这些框架的附加值可以在几个关键点中标识:
    他们在内容和呈现之间实施更大程度的分离。这是通过让您在演示层中定义数据,事件处理程序甚至视图的结构(例如迭代和复合对象,例如表); 来实现的。
  • >他们提供了一种简单的方法,可以使您的数据模型和您的演示文稿保持同步;
  • >他们通常以极其有效的方式进行操作,确保仅将DOM树的最小可能子集重新流动。在这方面,请记住,回流和重新粉刷通常是客户端浏览器应用程序的瓶颈。

> ractive.js

对于ractive.js,我们将要使用的库,数据和DOM之间的同步是通过>容器对象获得的。该库创建对象围绕数据包裹的对象。这些对象可以访问数据,因此每次您设置或获取任何属性时,库都可以捕获您的操作并内部广播给所有订户。 >动手 现在,我们已经看到了什么是ractive.js有用的,现在该将我们的第一个ractive模板添加到我们的页面了。为此,您可以在内的任何位置添加带有您选择的ID的脚本标签。我建议您明智地选择ID,因为我们以后需要它。我们还需要添加类型='text/ractive'属性:

type ='text/ractive' 实际上,对您的浏览器没有任何意义,因为除非您也将ractive的脚本添加到页面上,否则它会忽略脚本:

现在,在RACTIVE脚本内部,您可以添加HTML标签,模板变量以及条件/循环。 ractive.js将负责评估{{}}组内的所有内容。
<span><span><span><script> id<span >='meterVizTemplate'</script></span> type<span>='text/ractive'</span>></span><span><span></span>></span></span>
在上面的示例中,您可以看到:
<span><span><span><script> src<span >='http://cdn.ractivejs.org/latest/ractive.js'</script></span>></span><span><span></span>></span></span>
<span><span><span><script> id<span >='meterVizTemplate'</script></span> type<span>='text/ractive'</span>></span><span>
</span></span><span><span>    <span>{{#batteryState}}
</span></span></span><span><span>      <span><br>
</span></span></span><span><span>      <span><div class="battery-div">
<span><span>        <span><div class="battery-shell">
<span><span>          <span><div class="battery-percent-text">{{batteryPercent.toFixed(1) + '%'}}</div>
</span></span></span><span><span>        <span></span></span></span>
</div>
</span></span></span><span><span>        <span><div class="battery-level">
<span><span>          <span><div class="battery-mask" style="width:{{(100 - batteryPercent) + '%'}};">
<span><span>          <span></span></span></span>
</div>                
</span></span></span><span><span>        <span></span></span></span>
</div>
</span></span></span><span><span>        <span>{{#batteryCharging}}
</span></span></span><span><span>          <span><div class="battery-plug" intro-outro="fade:1000"></div>
</span></span></span><span><span>        <span>{{/batteryCharging}}
</span></span></span><span><span>        <span>{{#batteryPercent </span></span><span><span>          <span><div class="battery-warning" intro-outro="fade:1000"></div>
</span></span></span><span><span>        <span>{{/batteryLife}}                
</span></span></span><span><span>      <span></span></span></span></span>
</div>
</span></span></span><span><span>      <span><br>
</span></span></span><span><span>      <span><br>
</span></span></span><span><span>        <span><span class="key">Battery state:</span> <span class="value {{batteryStateClass(batteryState)}}">{{batteryState}}</span>
</span></span></span><span><span>        <span><br>
</span></span></span><span><span>        <span>{{#batteryLife}}
</span></span></span><span><span>          <span><span class="key">Time to empty:</span> <span class="value {{batteryLifeClass(batteryPercent)}}">{{batteryLife}}</span>
</span></span></span><span><span>        <span>{{/batteryLife}}                  
</span></span></span><span><span>    <span>{{/batteryState}}
</span></span></span><span><span>    <span>{{^batteryState}}
</span></span></span><span><span>      <span><br>
</span></span></span><span><span>      <span>LOADING...
</span></span></span><span><span>    <span>{{/batteryState}}
</span></span></span><span><span></span><span><span></span>></span></span>
>变量:{{{电池state}}
  • 条件:{{#batterystate}}}
  • >函数召唤:{{{BattuctStateClass(Battertstate)}}}
为了使这些事情有效,我们必须在JavaScript中添加一些约束力。为此,我们必须创建一个新的ractive.js对象:
<span><span><span><script> id<span >='meterVizTemplate'</script></span> type<span>='text/ractive'</span>></span><span><span></span>></span></span>
我们传递给构造函数的选项非常重要。首先,EL需要匹配ractive.js内部的DOM元素的ID。在这种情况下,我们需要添加一个Div到OUT HTML页面:
<span><span><span><script> src<span >='http://cdn.ractivejs.org/latest/ractive.js'</script></span>></span><span><span></span>></span></span>
您插入此标签的点很重要。对于ractive.js模板系统呈现的所有元素,它将是parent 元素。您必须谨慎的第二个重要参数是模板。它的值必须匹配页面上文本/ractive脚本的ID。最后,我们将键是我们在模板中引用的变量名称或我们调用的函数的对象。 使用ractive.js,我们甚至可以定义库将回应的自定义事件:
<span><span><span><script> id<span >='meterVizTemplate'</script></span> type<span>='text/ractive'</span>></span><span>
</span></span><span><span>    <span>{{#batteryState}}
</span></span></span><span><span>      <span><br>
</span></span></span><span><span>      <span><div class="battery-div">
<span><span>        <span><div class="battery-shell">
<span><span>          <span><div class="battery-percent-text">{{batteryPercent.toFixed(1) + '%'}}</div>
</span></span></span><span><span>        <span></span></span></span>
</div>
</span></span></span><span><span>        <span><div class="battery-level">
<span><span>          <span><div class="battery-mask" style="width:{{(100 - batteryPercent) + '%'}};">
<span><span>          <span></span></span></span>
</div>                
</span></span></span><span><span>        <span></span></span></span>
</div>
</span></span></span><span><span>        <span>{{#batteryCharging}}
</span></span></span><span><span>          <span><div class="battery-plug" intro-outro="fade:1000"></div>
</span></span></span><span><span>        <span>{{/batteryCharging}}
</span></span></span><span><span>        <span>{{#batteryPercent </span></span><span><span>          <span><div class="battery-warning" intro-outro="fade:1000"></div>
</span></span></span><span><span>        <span>{{/batteryLife}}                
</span></span></span><span><span>      <span></span></span></span></span>
</div>
</span></span></span><span><span>      <span><br>
</span></span></span><span><span>      <span><br>
</span></span></span><span><span>        <span><span class="key">Battery state:</span> <span class="value {{batteryStateClass(batteryState)}}">{{batteryState}}</span>
</span></span></span><span><span>        <span><br>
</span></span></span><span><span>        <span>{{#batteryLife}}
</span></span></span><span><span>          <span><span class="key">Time to empty:</span> <span class="value {{batteryLifeClass(batteryPercent)}}">{{batteryLife}}</span>
</span></span></span><span><span>        <span>{{/batteryLife}}                  
</span></span></span><span><span>    <span>{{/batteryState}}
</span></span></span><span><span>    <span>{{^batteryState}}
</span></span></span><span><span>      <span><br>
</span></span></span><span><span>      <span>LOADING...
</span></span></span><span><span>    <span>{{/batteryState}}
</span></span></span><span><span></span><span><span></span>></span></span>
在几行中,我们设置了一种机制来暂停/恢复我们的更新。但是,我们仍然需要定义updatebatterystatus() 功能。

异步检索数据

如所承诺的,这是一个功能,可以照顾从我们的休息服务中检索数据。通过使用jQuery延期对象,我们设置了一个回调,一旦从服务器收到某些数据,就会被调用。由于我们还在此回调中使用ractive.js,因此我们不必仔细研究如何更新演示层的逻辑。实际上,我们只是更新模板脚本中使用的变量的值,ractive.js将负责所有内容。 我刚刚描述的是由下面报告的代码实现的:
ractive <span>= new Ractive({
</span>    <span>el: 'panels',
</span>    <span>template: '#meterVizTemplate',
</span>    <span>data: {
</span>        <span>// Percentage at which the battery goes to 'red' zone (export for Ractive templates)
</span>        <span>batteryRedThreshold: BATTERY_RED_THRESHOLD,
</span>        <span>// Percentage at which the battery enters 'yellow' zone (export for Ractive templates)
</span>        <span>batteryYellowThreshold: BATTERY_YELLOW_THRESHOLD,
</span>        <span>// The capacity of the battery, in percentage. Initially empty
</span>        <span>batteryPercent: NaN,
</span>        <span>// How much more time can the battery last?
</span>        <span>batteryLife: "",
</span>        <span>// True  the update daemon for the battery has been paused
</span>        <span>batteryPaused: false,
</span>        <span>// True  the update daemon for the battery has reported an error at its last try
</span>        <span>batteryUpdateError: false,
</span>        <span>// Is the battery connected to power?
</span>        <span>batteryCharging: false,
</span>        <span>batteryStateClass: function (state) {
</span>            <span>return state === 'discharging' ? BATTERY_RED_CLASS : BATTERY_GREEN_CLASS;
</span>        <span>},
</span>        <span>batteryLifeClass: function (percent) {
</span>            <span>return percent         <span>}
</span>    <span>}
</span><span>});</span></span>

将它们全部放在一起

当然,还有更多的接线可以将所有这些连接在一起。我们完全跳过了仪表板UX的设计。最终,这取决于您,一旦您获得了如何使其与模板系统一起使用!例如,如果我们可以使用图像和动画将充电百分比显示为文本,并且在视觉上以某些凉爽的功率指示器显示为文本和视觉上,那会有多酷?使用ractive.js,这并不难!看看最终结果: 使用node.js创建电池:客户端 如果您想检查代码,则可以在GitHub上再次找到它。

结论

我们的多平台电池仪表板现在应该准备就绪。但这应该是一个起点,而不是最终结果,我希望您在此过程中了解到的重要一点是:
  • 如何使用node.js
  • 设置HTTP服务器
  • > RESTFUL API
  • >如何在node.js服务器上运行OS终端命令
  • 声明框架和ractive.js的基础知识尤其
如果您想将其提升到一个新的水平,我的建议是开始尝试这些工具并挖网,以加深这些领域的知识。如果您想加深本文所涵盖的主题,我强烈建议您查看这些良好的资源:
  • 建筑风格和基于网络的软件体系结构的设计
  • >创建RESTFUL API
  • 的指南
  • 在本机库中使用REST API的优点/缺点是什么?
  • 模板方法模式
  • JavaScript中的异步请求
  • >克罗克福德(Crockford)在JavaScript上 - 第四集:Ajax的变态 - 像往常一样的洞察力,以及关于Ajax一词起源的超级有趣的故事,作为奖励!
  • >
  • > jQuery $ .getjson方法
  • ractivejs教程
  • >常见问题(常见问题解答)关于使用node.js客户端创建电池可视化的问题
>如何使用JavaScript获得电池状态?

>

使用JavaScript获得电池状态,您可以使用电池状态API。该API提供有关系统电池充电水平的信息,并让您通过电池级别或充电状态更改时发送的事件通知您。这是一个如何使用它的简单示例:


navigator.getBattery()。然后(function(battery){
console.log(“电池级别:“电池级别:“电池)。 );
});
此代码将当前的电池电量记录到控制台。

什么是navigator.getBattery方法?

如何可视化电池状态数据?

为了可视化电池状态数据,您可以使用任何JavaScript图表库,例如Chart.js或d3.js。这些库允许您从数据中创建各种类型的图表和图形。您还可以使用HTML和CSS创建一个简单的栏或饼图。

>我可以在所有设备上获取电池状态吗?

>电池状态API受到大多数现代浏览器的支持,但是不是全部。还值得注意的是,某些设备(例如台式计算机)可能无法提供准确或任何电池状态信息。

>

>如何处理电池状态更改?

您可以通过将事件侦听器添加到电池管理器对象中来处理电池状态更改。电池状态API提供了多个事件,例如“ ChargingChange”,“ LevelChange”,“ ChargingTimeChange”和“ AnergingTimeChange”。这是如何使用这些事件的一个示例:


navigator.getBattery()。然后(function(Batterion){
battery.addeventlistener('levelChange',function',function(){
console。 log(“电池级别:”电池级*100“%”);
});
});

该代码将记录新的电池级别每当电池级别更改时,要进入控制台。

>我如何使用node.js获得电池状态?我可以在未经用户许可的情况下获得电池状态吗?但是,如果您收集了有关其系统的任何数据,请告知用户。

>电池状态API提供的电池级别的准确性如何?按电池状态API为0.0至1.0之间,代表当前电池电量的一小部分充电。该值的准确性取决于设备及其电池。

>我可以在Web Worker中获得电池状态吗?但是,请记住,并非所有浏览器都支持网络工人,而不是所有支持Web工作人员支持网络工作人员中电池状态API的浏览器。

>如果不支持电池状态API,该怎么办?

>

如果不支持电池状态API,那么您没有什么可以做的来获得电池状态。您可以使用功能检测来检查是否支持API,并为用户提供替代功能或消息。

以上是使用node.js创建电池:客户端的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
JavaScript的演变:当前的趋势和未来前景JavaScript的演变:当前的趋势和未来前景Apr 10, 2025 am 09:33 AM

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

神秘的JavaScript:它的作用以及为什么重要神秘的JavaScript:它的作用以及为什么重要Apr 09, 2025 am 12:07 AM

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

Python还是JavaScript更好?Python还是JavaScript更好?Apr 06, 2025 am 12:14 AM

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。 1.Python以简洁语法和丰富库生态着称,适用于数据分析和Web开发。 2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

如何安装JavaScript?如何安装JavaScript?Apr 05, 2025 am 12:16 AM

JavaScript不需要安装,因为它已内置于现代浏览器中。你只需文本编辑器和浏览器即可开始使用。1)在浏览器环境中,通过标签嵌入HTML文件中运行。2)在Node.js环境中,下载并安装Node.js后,通过命令行运行JavaScript文件。

在Quartz中如何在任务开始前发送通知?在Quartz中如何在任务开始前发送通知?Apr 04, 2025 pm 09:24 PM

如何在Quartz中提前发送任务通知在使用Quartz定时器进行任务调度时,任务的执行时间是由cron表达式设定的。现�...

在JavaScript中,如何在构造函数中获取原型链上函数的参数?在JavaScript中,如何在构造函数中获取原型链上函数的参数?Apr 04, 2025 pm 09:21 PM

在JavaScript中如何获取原型链上函数的参数在JavaScript编程中,理解和操作原型链上的函数参数是常见且重要的任�...

微信小程序webview中Vue.js动态style位移失效是什么原因?微信小程序webview中Vue.js动态style位移失效是什么原因?Apr 04, 2025 pm 09:18 PM

在微信小程序web-view中使用Vue.js动态style位移失效的原因分析在使用Vue.js...

在Tampermonkey中如何实现对多个链接的并发GET请求并依次判断返回结果?在Tampermonkey中如何实现对多个链接的并发GET请求并依次判断返回结果?Apr 04, 2025 pm 09:15 PM

在Tampermonkey中如何对多个链接进行并发GET请求并依次判断返回结果?在Tampermonkey脚本中,我们经常需要对多个链...

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境