API 每小时数据的响应式 JavaScript 轮播

api 每小时数据的响应式 javascript 轮播

我差点把一个不完整的解决方案误认为是一个已完成的解决方案,然后继续研究我的天气应用程序的其他部分!在制作应该显示 12 小时天气的轮播时,我想添加一项功能,该功能将有助于在当天结束时获取第二天的时间。然而,轮播并没有过渡到第二天,而是不断循环回到当天的开始时间,我错误地认为任务已经完成。哎呀!

最初的挑战

我考虑过两个“for 循环”,但我不认为“j”打印整个“i”长度的所有元素是正确的。我在网上找到了很多关于“圆形数组”中模数运算符的使用的博客,但我不知道这对我的情况有什么帮助。我需要循环当前一天的时间,然后在时间重置为零后切换到第二天。发生了很多事情,我需要使其更加简洁,并将所有内容都放在一个函数中。艰难的!

认识不完整的解决方案和错误

我在网上发现了一些非常酷的东西,它可能会解决我的一个大问题。它帮助我了解模数运算符如何适用于圆形数组。这是网站上的示例:

const daysofweek = [  "monday",  "tuesday",  "wednesday",  "thursday",  "friday",  "saturday",  "sunday",];// function to cycle through the days of the weekfunction cycledays(index) {  return daysofweek[index % daysofweek.length];}// let's cycle through the days:for (let i = 0; i < 10; i++) {  console.log(`day ${i + 1}: ${cycledays(i)}`);}

结果如下:
第一天:星期一
第 2 天:星期二

我想要的是,它不应该返回到 daysofweek 数组,并从 ‘monday’ 开始,而是应该转到一个完全不同的数组。因此,我将代码带到代码编辑器中并进行了一些更改。首先,我创建了一个名为 ‘currentindex’ 的变量,并将模数运算存储在其中。然后我将其记录到控制台。 6点后重置并再次变为零。

但是,我将错误的变量记录到控制台。因为,如果我这样编写 if 条件: if(currentindex === 0),它实际上会在循环开始时移向新数组。所以,现在我改为记录“索引”,终于找到了答案!为了测试新代码,我为 ‘months’ 创建了一个新数组,然后尝试进行切换。但我又犯了一个错误——让我告诉你:

const daysofweek = [  "monday",  "tuesday",  "wednesday",  "thursday",  "friday",  "saturday",  "sunday",];const months = [  'jan',  'feb',  'march'];// function to cycle through the days of the weekfunction cycledays(index) {  let currentindex = index % daysofweek.length  console.log(index) if(index === 7){   return months[currentindex] } else {     return daysofweek[currentindex]; }}// let's cycle through the days:for (let i = 0; i < 10; i++) {  console.log(`day ${i + 1}: ${cycledays(i)}`);}

记录“jan”后,它切换回原始数组。错误是严格的相等检查,我应该使用‘大于或等于’来代替。当我插入它时,它成功切换到新阵列!

现在,我希望循环从当前小时开始并继续而不停止,并使用标记在数组之间切换。该标记将是模运算符而不是数组的长度。我还可以使用数组的长度,在本例中为 9(对于我的 api 数据,为 24),但我现在坚持使用硬编码值 9。

立即学习“Java免费学习笔记(深入)”;

当前索引 = (当前索引 + 1) % 9

这条线允许我在循环期间从第一天切换到第二天而不停止它。这是另一个试验(我更新了数组以类似于 api 结果):

const dayone = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten'];const daytwo = [11, 12, 13, 14, 15, 16, 17, 18, 19, 20];let hours = dayone;let currenthour = 5;function cycledays(currenthour) {  let currentindex = currenthour  for (let i = 0; i < 10; i++) {    console.log(`index is ${currentindex} and dayone is ${hours[currentindex]}`)    if(currentindex === 0){      hours = daytwo    console.log(`index is ${currentindex} and daytwo is ${hours[currentindex]}`)    }   currentindex = (currentindex + 1) % 9} }cycledays(currenthour)

注意结果中一些有趣的东西:

索引为 5,dayone 为 6,i 为 0
索引为 6,dayone 为 7,i 为 1
索引是 7,dayone 是 8,i 是 2
索引是 8,dayone 是 9,i 是 3
索引是 9,dayone 是 10,i 是 4
索引为 0,dayone 为 1,i 为 5
索引为 0,daytwo 为 11
索引为 1,dayone 为 12,i 为 6
索引为 2,dayone 为 13,i 为 7
索引为 3,dayone 为 14,i 为 8
索引为 4,dayone 为 15,i 为 9

这里的问题是,即使将时间从 dayone 切换到 daytwo 后,日志在日志语句中仍然引用 dayone。发生这种情况是因为日志记录语句被硬编码为“dayone”,即使数组已切换到 daytwo。

为了解决这个问题,我们可以为这一天设置另一个标记,并使其在切换数组的同时进行切换。我将把 dayone 和 daytwo 分别切换为“星期一”和“星期二”:

const monday = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten'];const tuesday = [11, 12, 13, 14, 15, 16, 17, 18, 19, 20];let hours = monday;let currenthour = 5;let day = 'monday';function cycledays(currenthour) {  let currentindex = currenthour;  for (let i = 0; i < 10; i++) {    console.log(`index is ${currentindex} and ${day} is ${hours[currentindex]} and i is ${i}`);    if (currentindex === 0) {      hours = tuesday;       day = 'tuesday';       console.log(`index is ${currentindex} and ${day} is ${hours[currentindex]}`);    }    currentindex = (currentindex + 1) % 10;  }}cycledays(currenthour);

我的代码快完成了。使此代码有效的两个重要更改是跟踪日期并将模数运算置于 for 循环内。

最后,我可以为从 api 检索的 3 天数据构建代码,这是精炼版本:

function createhours(days){        if (!days || days.length === 0) {            console.error("days array is undefined or empty");            return; // prevent further execution if data is missing        }        const btnnext = document.queryselector('.next');        const btnprev = document.queryselector('.previous');        const hourcontainer = document.queryselector('.tfour_hours');        const currenthour = new date().gethours()        function gethoursforday(index) {         return days[index].hour;         }        let dayindex = 0;        let hours = gethoursforday(dayindex);        let index = currenthour;        let displayhours = [];        for (let i = 0; i < 12; i++) {            // console.log(hours)            // console.log(`index: ${index}`)            let hourdata = hours[index];            let hournum = index < 10 ? `0${index}` : index;            if (index === 0) {                displayhours.push(`                    

next day

${hournum}

@@##@@

${hourdata.temp_c}°c

`); } else { displayhours.push(`

${hournum}

@@##@@

${hourdata.temp_c}°c

`); } index = (index + 1) % 24; if(index === 0 && dayindex === 0){ dayindex = 1; hours = gethoursforday(dayindex) } } //for loop displayhours = displayhours.join(''); hourcontainer.innerhtml = displayhours;…};

创建动态 html 元素

我们来谈谈生成 12 个 div。我无法想象如何获取父 div 两侧的按钮,而 12 小时就漂浮在它们之间。如果我要在与按钮相同的父级中生成 12 个 div,则按钮元素将需要与 12 个 div 不同的对齐设置。

只有让他们拥有自己的容器才有意义。我花了一段时间才弄清楚这一点——实际上我不得不睡觉。然后第二天,我输入 .btn-container 并点击 tab,从那里开始,一切都点击了。我在 john smilga 的教程中看到了每个分组的项目以及它们自己的容器位于父容器内,直到我开始设计 24 小时容器时我才知道为什么需要这样的分组。这真是一个“陷阱时刻”。

现在又出现了一个困扰了好几天的问题。我在教程中设计的滑块并不像这些 div 那样具有挑战性。在教程中,有一个简单的翻译值,但现在我有很多问题。在较小的屏幕上,div 粘在一起,开始看起来像意大利面条。

而且,当我使用一个简单的translatex属性时,这意味着当我“猜测”像素时,div完全向左平移后留下了很多空间。这意味着他们平移的宽度超过了它们的总宽度。我需要找到一个合适的值来确保 div 完全停止在末尾而不留下额外的空间。找了好久,发现一个博客,提供了各种解决方案。

有很多解决方案。其中一些使用了模运算符,这让我想起了在“for 循环”中切换日期时应用的循环数组逻辑。这里有很多评论使用了 math.minmath.max。这基本上会使容器平移,直到到达其长度的末端。出色的!那么没有更多的空白了吗? 没那么快…

与这些示例不同的一点是我的容器最初会显示 3 或 4 个 div。所以,当offset为0时,父容器中已经有一定的长度了。

他们通过添加数字 1 来显示图像。因此,他们的轮播会根据数组中图像的索引号向前滑动 1 张图像。例如,如果容器中有 10 个图像,我们向 currentimage 变量添加 1 个图像,则 math.min 计算出的值将为“1”。然后,当我们添加另一个“1”时,当前图像将是 2,并且 math.min 的值将是 2,因为 2 mod 10 是 2。这个特定的示例将改变滑块的游戏我正在努力做。这是引起我注意的代码:

const imageData = [ 'image1.png', 'img2.png', 'img3.png', ... ];let currentImage = 0;____const handleImageChange = (imageShift) => {  currentImage = Math.max(    0,    Math.min(      imageData.length - 1,      (currentImage + imageShift) % imageData.length    )  );}____const firstImage = () => handleImageChange(-imageData.length);const prevImage = () => handleImageChange(-1);const nextImage = () => handleImageChange(1);const lastImage = () => handleImageChange(imageData.length);

在评论中发现 richard kichenama 解决方案的巧妙之处在于使用 math.max 来确保值不会低于 0,并使用 math.min 来计算平移值,直到达到最大长度图像数组。

现在,我该如何解决空白问题?我必须考虑所有子 div 的边距,并将它们加在一起以获得子 div 的整个长度。然后,一旦到达最后一个子项,滑块就应该停止移动。这意味着总宽度是所有子项宽度加上边距的总和。

但是,我遇到了另一个问题:一些 div 已经显示在容器中,这让我再次陷入困境。幸运的是,我的一个朋友救了我。与他们讨论问题后,我的理解如下:

我无法考虑子 div 的整个长度。剩下的空白区域几乎与容器的长度一样多。解决方案是从子容器的总长度(包括边距)中减去父容器的长度。这一调整有助于解决空白问题——唷!

一些代码示例有一个类似于“计数器”的变量。它充当翻译属性的“计数器”。当这个变量增加时,翻译属性增加等等。我将下一个和上一个按钮的 math.minmath.max 属性分开。这样更有帮助,也更容易。

在我引用的示例中,代码使用数组的长度来确定滑动距离,但是,根据我之前与朋友的讨论,我需要考虑空白,所以我必须减去容器。这样,我确保了我的 div 只能移动特定的量,避免了末尾的额外空间。

另外,感谢 john smilga 的教程,我学会了如何获取项目的宽度、高度、顶部属性。应用正确的值是一项艰巨的任务,找出某些值是字符串并且需要将其转换为数字也是一项艰巨的任务。我在谷歌上轻松找到了这一点,并被介绍给‘parsefloat’

我还发现了另一个有用的资源,它教我如何在大屏幕上仅显示三个 div,在小屏幕上显示两个 div。诀窍是将容器宽度的 100% 除以 3(对于小屏幕则为 2)并减去边距。这允许大小相同的 div 完美地适合容器(太聪明了!)。最后,要查看最终的功能,请访问我的github。这是我的存储库的链接。

用于调整大小的窗口事件侦听器对于解决容器中的对齐问题至关重要。它通过重置调整大小时的偏移量解决了“无样式内容的 flash”(fouc) 问题。我必须感谢我的朋友帮助我了解如何计算 maxoffset——这真的改变了游戏规则。

最后,向所有经验丰富的开发人员大声喊叫:您分享的每句话都会对这个领域的新手有所帮助。因此,请继续发布您这边的信息,因为我们正在另一边等待渴望了解。谢谢你!

iconicon

以上就是API 每小时数据的响应式 JavaScript 轮播的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1493467.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
在 JavaScript 中编写简洁且可维护的代码的最佳实践
上一篇 2025年12月19日 15:42:55
OpenID Connect:您的 Web 应用程序的简化登录解决方案
下一篇 2025年12月19日 15:43:01

相关推荐

  • 开源免费PHP工具 PHP开发效率提升利器

    推荐开源免费PHP开发工具以提升效率:VS Code、Sublime Text轻量高效,PhpStorm专业强大;调试用Xdebug、Kint、Ray;依赖管理选Composer;代码质量工具包括PHPStan、Psalm、PHP_CodeSniffer;数据库管理可用%ignore_a_1%MyA…

    2026年5月10日
    000
  • 谷歌浏览器如何截图 谷歌浏览器页面截图技巧

    谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧

    使用谷歌浏览器的开发者工具截图步骤:1. 按ctrl+shift+i(windows/linux)或cmd+option+i(mac)打开开发者工具。2. 点击右上角三个点,选择”更多工具”,再选择”截图”。3. 选择截取整个页面。推荐的谷歌浏览器扩展…

    2026年5月10日 用户投稿
    100
  • JavaScript计算器开发:解决数值显示与初始化问题

    本教程深入探讨了使用JavaScript构建计算器时常见的数值显示异常问题,特别是由于类属性未初始化导致的`Cannot read properties of undefined`错误。我们将详细分析问题根源,并通过在构造函数中调用初始化方法来解决该问题,同时优化显示逻辑,确保计算器功能稳定且界面显…

    2026年5月10日
    000
  • NextAuth getToken 在服务端返回 null 的问题排查与解决

    问题描述 在使用 Next.js 和 NextAuth 构建应用程序时,有时需要在服务端获取用户的身份验证信息。getToken 函数是 NextAuth 提供的一个便捷方法,用于从请求中提取 JWT (JSON Web Token)。然而,在某些情况下,尤其是在使用 getServerSidePr…

    2026年5月10日
    000
  • HTML文档如何工作?如何编辑HTML格式文件?

    HTML文档如何工作?如何编辑HTML格式文件?HTML文档如何工作?如何编辑HTML格式文件?HTML文档如何工作?如何编辑HTML格式文件?HTML文档如何工作?如何编辑HTML格式文件?

    浏览器解析和渲染html的过程包括:1. 解析html构建dom树;2. 结合css构建渲染树;3. 布局计算元素位置;4. 绘制像素到屏幕。编辑html可使用记事本、vs code、sublime text等文本或代码编辑器,其中vs code因语法高亮、自动补全和插件生态成为主流选择。标准htm…

    2026年5月10日 用户投稿
    000
  • GolangWeb项目异常捕获与日志记录

    答案:通过中间件使用defer和recover捕获panic,结合zap等结构化日志库记录请求链路信息,为每个请求生成trace ID,实现异常捕获与可追踪日志,提升系统稳定性与可观测性。 在Go语言Web项目中,异常捕获与日志记录是保障系统稳定性和可维护性的关键环节。Go本身没有像其他语言那样的t…

    2026年5月10日
    000
  • Python官网用户调查的参与方式_Python官网反馈提交详细教程

    答案是通过访问Python官网新闻页面、邮件邀请链接或GitHub仓库提交反馈。具体为:访问官网查找用户调查公告,或点击邮件中的专属链接参与,在GitHub的cpython仓库提交技术建议,并注意如实填写问卷与保护隐私。 如果您希望参与Python官网的用户调查并提交反馈,可以通过官方指定的渠道完成…

    2026年5月10日
    000
  • Go语言连接外部MySQL数据库:DSN配置与常见错误解析

    本文详细阐述了go语言使用`go-sql-driver/mysql`驱动连接外部mysql数据库的正确方法。重点介绍了数据源名称(dsn)的规范格式,特别是主机地址部分的配置,以避免常见的“getaddrinfow: the specified class was not found.”等网络解析错…

    2026年5月10日
    000
  • Tensorflow 音乐预测

    在本文中,我展示了如何使用张量流来预测音乐风格。在我的示例中,我比较了电子音乐和古典音乐。 你可以在我的github上找到代码:https://github.com/victordalet/sound_to_partition i – 数据集 第一步,您需要创建一个数据集文件夹,并在里面…

    2026年5月10日
    000
  • Binance官方网站 币安Binance最新App下载 v3.8.0官方下载通道

    币安(binance)作为全球交易量领先的数字资产服务平台,其官方应用的安全性和功能的及时更新至关重要。本篇指南将为您详细解析如何通过币安官方网站,安全地获取并安装其最新版本的官方app,确保您使用的是官方正版通道,从而保障您的资产安全。 官网访问与账户准备 币安(Binance)官网入口: 币安(…

    2026年5月10日
    200
  • 学习了Python的Flask后,Go语言的Web框架该选Gin还是Beego?

    学习编程时,选择合适的框架至关重要。许多开发者在掌握Python Flask后,转向Go语言Web开发时,常常在Gin和Beego之间难以抉择。本文将深入分析,助您做出明智选择。 虽然网上搜索结果多建议使用Go原生标准库http,但实际上所有框架都是对http的封装。虽然使用http开发灵活,但工作…

    2026年5月10日
    000
  • JavaScript动态下拉菜单:实现日期选项与价格计算关联

    在现代web应用中,动态生成表单元素并使其具备交互逻辑是常见的需求。特别是在需要根据用户选择调整价格或服务参数的场景下,下拉菜单()常被用来展示一系列选项。本教程将指导您如何利用javascript动态生成一个包含日期选项的下拉菜单,并为每个选项关联一个具体的数值(如剩余天数),进而实现一个基于用户…

    2026年5月10日
    000
  • 如何在不暴露密钥的情况下,在客户端创建 Stripe Payment Link

    本文介绍了在纯静态网站环境下,如何利用 Stripe Payment Link 实现商品售卖,并着重讨论了在不暴露 Stripe 密钥的前提下,客户端创建 Payment Link 的可行性。分析了直接在客户端使用密钥的风险,并提出了预先生成 Payment Link 或使用后端服务动态生成 Pay…

    2026年5月10日
    000
  • 解决Go语言中GOPATH未设置错误及工作区配置指南

    本文旨在解决go语言开发中常见的“gopath not set”错误,并提供详细的go工作区配置指南。内容涵盖`gopath`环境变量的设置、go项目目录结构、`path`变量的扩展,以及一些高级配置技巧,旨在帮助开发者建立一个高效、规范的go开发环境,确保包的下载、编译和运行顺利进行。 Go语言在…

    2026年5月10日
    000
  • 掌握 JavaScript 中的高阶函数

    现代 javascript 开发严重依赖函数式编程,掌握其基本思想将极大提高你的编码能力。 高阶函数是这个范式最有力的武器之一。为了帮助您掌握它们,本文将介绍它们的定义、应用程序和独特的实现。 1. 函数式编程 函数式编程是一种编程范式,强调: 纯函数:没有副作用的函数,对于相同的输入返回相同的输出…

    2026年5月10日
    000
  • Golang使用assert库简化测试断言

    使用testify/assert库可提升Go测试代码的可读性和效率,通过go get github.com/stretchr/testify/assert安装后导入包,用assert.Equal等函数替代冗长的手动判断,支持丰富断言方法如Equal、True、Nil、Contains等,并可添加自定…

    2026年5月10日
    100
  • 如何处理在线编辑HTML时外部链接验证的处理方法

    在线编辑HTML时需验证外部链接以保障安全与可用性,可通过自动检测标记外链并添加rel属性提升安全性;2. 实时验证链接有效性,利用HEAD请求检查状态码并在编辑界面提示结果;3. 配置可信域名白名单控制高风险链接输入,适用于合规要求高的场景;4. 提供友好反馈机制,对无效或可疑链接弹出提示并支持新…

    2026年5月10日
    000
  • 怎样为C++配置嵌入式AI开发环境 TensorFlow Lite Micro移植指南

    怎样为C++配置嵌入式AI开发环境 TensorFlow Lite Micro移植指南怎样为C++配置嵌入式AI开发环境 TensorFlow Lite Micro移植指南怎样为C++配置嵌入式AI开发环境 TensorFlow Lite Micro移植指南怎样为C++配置嵌入式AI开发环境 TensorFlow Lite Micro移植指南

    要在c++++项目中使用tensorflow lite micro进行嵌入式ai开发,关键步骤包括:1. 确定mcu平台并安装对应的交叉编译工具链;2. 配置python环境并安装必要的依赖包;3. 获取并裁剪tflm源码,保留核心模块;4. 将tflm静态库集成到c++工程中;5. 按照模型加载、…

    2026年5月10日 用户投稿
    000
  • 火币app下载 火币app官方下载最新版 火币htx交易所安卓版

    若您需要下载火币htx官方最新版的安卓应用,最安全可靠的方式是通过其官方网站进行获取。为了保障您的数字资产安全,请务必避免使用任何非官方渠道提供的下载链接或安装包,因为这些来源可能包含恶意软件,对您的账户和资金构成威胁。访问官网后,通常可以在页面显眼位置找到app下载入口或二维码。 火币官网直达: …

    2026年5月10日
    000
  • Golang图片处理技巧 imaging库裁剪缩放

    答案:使用Go语言的imaging库可高效实现图片裁剪与缩放,其API简洁易用,支持多种缩放算法(如Lanczos、CatmullRom)以平衡质量与性能,提供Crop和CropAnchor两种裁剪方式实现精确区域控制,并建议通过算法选择、内存管理、并发处理和错误校验等策略优化性能与稳定性。 在Go…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信