JavaScript实现多币种价格转换教程

javascript实现多币种价格转换教程

本教程详细讲解如何使用JavaScript实现多币种价格转换功能。文章将涵盖从远程API获取汇率数据、处理页面上多个价格元素的转换,以及如何避免重复转换导致的错误。核心在于利用`querySelectorAll`选取所有相关元素,并维护原始价格值以确保每次转换都基于准确的初始数据,从而实现稳定、准确的货币换算。

在现代Web应用中,动态货币转换是一个常见需求。本文将指导您构建一个功能,该功能能够从外部API获取实时汇率,并根据用户选择的货币类型,对页面上的多个价格进行实时转换。我们将着重解决在处理多个价格元素以及避免重复计算导致错误的关键问题。

1. HTML结构准备

首先,我们需要一个包含货币选择下拉菜单和多个价格显示元素的HTML结构。这些价格元素将通过JavaScript进行动态更新。

  选择货币  EUR  USD  GBP

2

25

60

在这个结构中,select元素用于用户选择货币,其id为coin。三个h1元素都带有priceCoin类,它们将是我们要进行货币转换的目标。初始值(2, 25, 60)代表某种基础货币的价格。

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

2. JavaScript核心逻辑

我们将通过JavaScript实现以下功能:

从外部API获取汇率数据。初始化页面上的价格显示。监听货币选择的变化,并根据选定的货币更新所有价格。

2.1 获取货币汇率数据

我们将使用fetch API从一个公共货币API获取汇率数据。这里以欧元(EUR)为基准货币获取对美元(USD)和英镑(GBP)的汇率。

// cambio de moneda (货币转换)function getCurrency() {  fetch('https://cdn.jsdelivr.net/gh/fawazahmed0/currency-api@1/latest/currencies/eur.json')    .then(res => res.json())    .then(data => {      crearMoneda(data);    })    .catch(error => console.error('获取货币数据失败:', error)); // 添加错误处理}// 页面加载时调用获取货币函数getCurrency();

getCurrency函数负责发起网络请求。一旦数据成功获取,它会将JSON响应传递给crearMoneda函数进行进一步处理。

2.2 处理货币数据与价格转换逻辑

crearMoneda函数是核心逻辑所在,它接收API返回的货币数据,并设置事件监听器来处理货币转换。

function crearMoneda(moneda) {  // 从API数据中提取所需汇率  const eurRate = moneda.eur.eur; // 欧元对欧元的汇率,通常为1  const usdRate = moneda.eur.usd; // 欧元对美元的汇率  const gbpRate = moneda.eur.gbp; // 欧元对英镑的汇率  // 获取HTML元素  const selectCoin = document.getElementById('coin');  // 使用querySelectorAll获取所有具有'priceCoin'类的元素,这将返回一个NodeList  const priceCoinsArr = document.querySelectorAll('.priceCoin');  // 存储原始价格值。这是关键!  // 避免在每次转换时基于上一次转换的结果进行计算。  const initialVals = [2, 25, 60];   // 构建一个汇率对象,方便通过货币代码访问  const exchangeValues = {    "default": 1, // 默认选项,不进行转换或视为1倍    'eur': eurRate,    'usd': usdRate,    "gbp": gbpRate  };  // 监听货币选择框的变化事件  selectCoin.addEventListener('change', (event) => {    let coinSelected = event.target.value; // 获取用户选择的货币代码    // 遍历所有原始价格,并根据选定的货币进行转换    initialVals.forEach((value, index) => {      // 获取对应的HTML元素,并更新其innerHTML      priceCoinsArr[index].innerHTML = (value * exchangeValues[coinSelected]).toFixed(2); // 保留两位小数    });  });}

关键改进点分析:

querySelectorAll 的使用: 原始代码中使用querySelector(‘.priceCoin’)只会返回第一个匹配的元素。为了操作所有价格元素,必须使用document.querySelectorAll(‘.priceCoin’),它会返回一个包含所有匹配元素的NodeList(类似于数组)。initialVals 数组: 这是解决“重复转换导致数值递减”问题的关键。我们不再从priceCoin.innerHTML中获取当前值进行计算,而是维护一个存储原始价格的数组initialVals。每次进行货币转换时,都基于这些原始值乘以新的汇率,确保计算的准确性。exchangeValues 对象: 将所有汇率存储在一个对象中,通过货币代码(键)直接访问汇率(值),使得代码更简洁、可读性更高,并避免了冗长的switch语句。forEach 循环: 结合initialVals数组和priceCoinsArr NodeList,使用forEach循环可以方便地遍历每个原始价格,并将其转换后的结果更新到对应的HTML元素中。错误处理与格式化: 添加了catch块处理fetch请求可能出现的错误,并在更新价格时使用toFixed(2)确保显示两位小数,提升用户体验。

3. 完整代码示例

将上述HTML和JavaScript代码整合,即可得到一个功能完整的货币转换器。

HTML (index.html):

            多币种价格转换器            body { font-family: Arial, sans-serif; margin: 20px; }        select { padding: 8px; margin-bottom: 20px; }        h1 { margin: 10px 0; font-size: 2em; }                选择货币        EUR        USD        GBP        

2

25

60

JavaScript (app.js):

// cambio de moneda (货币转换)function getCurrency() {  fetch('https://cdn.jsdelivr.net/gh/fawazahmed0/currency-api@1/latest/currencies/eur.json')    .then(res => res.json())    .then(data => {      crearMoneda(data);    })    .catch(error => console.error('获取货币数据失败:', error)); // 添加错误处理}// 页面加载时调用获取货币函数getCurrency();function crearMoneda(moneda) {  // 从API数据中提取所需汇率  const eurRate = moneda.eur.eur; // 欧元对欧元的汇率,通常为1  const usdRate = moneda.eur.usd; // 欧元对美元的汇率  const gbpRate = moneda.eur.gbp; // 欧元对英镑的汇率  // 获取HTML元素  const selectCoin = document.getElementById('coin');  // 使用querySelectorAll获取所有具有'priceCoin'类的元素,这将返回一个NodeList  const priceCoinsArr = document.querySelectorAll('.priceCoin');  // 存储原始价格值。这是关键!  // 避免在每次转换时基于上一次转换的结果进行计算。  // 注意:这里的原始值需要与HTML中h1标签的初始值一致。  const initialVals = [      parseFloat(priceCoinsArr[0].innerHTML),      parseFloat(priceCoinsArr[1].innerHTML),      parseFloat(priceCoinsArr[2].innerHTML)  ];   // 构建一个汇率对象,方便通过货币代码访问  const exchangeValues = {    "default": 1, // 默认选项,不进行转换或视为1倍    'eur': eurRate,    'usd': usdRate,    "gbp": gbpRate  };  // 监听货币选择框的变化事件  selectCoin.addEventListener('change', (event) => {    let coinSelected = event.target.value; // 获取用户选择的货币代码    // 遍历所有原始价格,并根据选定的货币进行转换    initialVals.forEach((value, index) => {      // 获取对应的HTML元素,并更新其innerHTML      priceCoinsArr[index].innerHTML = (value * exchangeValues[coinSelected]).toFixed(2); // 保留两位小数    });  });}

注意事项:

在initialVals的初始化中,为了更具通用性,我们直接从priceCoinsArr中解析了初始值,而不是硬编码。这使得HTML中的初始值可以直接控制initialVals。汇率API可能会有调用限制或不稳定,实际生产环境中应考虑使用更稳定的服务、缓存机制和错误重试策略。对于用户体验,可以在加载数据时显示加载指示器,并在转换时提供即时反馈。此示例中的default选项被设置为汇率1,这意味着选择它将显示原始价格。您可以根据需求调整此行为。

总结

通过本教程,我们学习了如何构建一个健壮的JavaScript货币转换器。核心思想在于:

使用document.querySelectorAll()准确获取所有需要操作的DOM元素。维护一个独立的原始价格数组,确保每次货币转换都基于初始值,避免累积计算错误。将汇率组织成易于访问的对象结构,简化代码逻辑。

遵循这些原则,您可以为您的Web应用程序实现稳定且用户友好的货币转换功能。

以上就是JavaScript实现多币种价格转换教程的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月23日 17:02:18
下一篇 2025年12月23日 17:02:33

相关推荐

  • 解决CSS表单输入框焦点移动与元素间距问题

    本教程深入探讨了CSS表单开发中常见的输入框焦点移动和元素间距处理难题。通过分析焦点时边框变化导致的布局抖动,以及不当使用内外边距引起的布局膨胀,文章提供了专业的解决方案,包括统一边框尺寸以避免位移,以及对父容器应用外边距以实现正确的元素间距,旨在帮助开发者构建稳定且美观的表单布局。 在Web表单设…

    2025年12月23日
    000
  • Vue.js 导航菜单项独立选中状态管理教程

    本教程旨在解决 vue.js 开发中导航菜单或列表项点击时,所有元素同时被激活的问题。通过引入基于 `v-for` 的列表渲染和每个菜单项独立的状态管理,我们将展示如何实现点击单个元素时,仅该元素获得激活样式,从而确保 ui 行为的精确性和独立性。 在 Vue.js 应用中构建交互式导航菜单或列表时…

    2025年12月23日
    000
  • 海龟编辑器怎么运行html_海龟编辑器运行html步骤【指南】

    海龟编辑器不能直接运行HTML文件,需通过Python代码调用浏览器打开。具体步骤:1. 准备HTML文件并保存至指定路径,如C:usersyournamedesktopest.html;2. 在海龟编辑器中使用Python的webbrowser模块编写代码:import webbrowser,we…

    2025年12月23日
    000
  • 掌握HTML 元素:实现响应式图像的高级技巧

    本文深入探讨 html “ 元素的使用方法,重点强调其在响应式图像设计中的核心地位。文章明确指出,“ 必须包含一个 “ 元素作为回退和默认显示,并结合 “ 元素为不同媒体条件提供优化的图像版本。通过实例和最佳实践,帮助开发者确保图像在各种设备和视口下高效且正确地…

    好文分享 2025年12月23日
    000
  • 模拟原生按钮行为:自定义div双击防选与Ctrl+A兼容性实现

    本文探讨了如何为模拟按钮行为的`div`元素实现双击时不选择文本,同时保持`ctrl+a`全选功能的兼容性。通过结合css的`user-select: none`属性与javascript动态监听`ctrl`键的按下与释放事件,精确控制`user-select`的值,从而完美复刻原生“的交互特性,…

    2025年12月23日
    000
  • 如何使用CSS调整重叠区域的颜色

    本教程详细探讨了在CSS中如何控制两个重叠div的交集区域颜色。核心原理是理解CSS的层叠上下文和背景渲染机制。文章通过调整顶层元素的背景色和透明度,展示了如何直接改变重叠区域的视觉效果,并区分了何时应使用简单的背景设置与何时可能需要更复杂的图形技术如`clip-path`。 理解CSS元素重叠与背…

    2025年12月23日
    000
  • 自建的HTML网页怎么运行_运行自建HTML网页步骤【指南】

    要成功运行自建HTML网页,首先需保存为.html文件并用浏览器直接打开预览;若需HTTP环境,则可通过Node.js的http-server、Python内置服务器或VS Code的Live Server插件启动本地服务器,再在浏览器访问对应地址查看效果。 如果您已经创建了一个HTML网页文件,但…

    2025年12月23日
    000
  • HTML/CSS教程:确保样式生效的关键——正确链接样式表

    本教程旨在解决html与css学习者常遇到的样式不生效问题。即使关系选择器编写正确,若未在html文档中通过“标签正确引用css文件,浏览器将无法加载并应用样式。文章将详细阐述这一常见疏忽,并提供完整的代码示例和最佳实践,确保你的css样式能够如预期般生效。 在前端开发中,HTML负责页…

    2025年12月23日 好文分享
    000
  • Selenium headless模式下动态菜单与复选框的交互策略

    本文旨在解决Selenium在无头浏览器模式下,无法直接点击隐藏或动态生成的复选框(input)的问题。通过分析HTML结构和Selenium的交互机制,文章提出并详细阐述了点击关联的“元素作为有效替代方案,并结合`execute_script`方法和适当的等待策略,提供了一套完整的解决方案和最佳…

    2025年12月23日
    000
  • Vue 2中动态重构DOM结构:利用details和summary标签分组内容

    本教程详细讲解如何在vue 2应用中动态重构dom结构,将一系列`h1`标题及其后续的段落(`p`标签)分组,并封装到html的`ails>`和` `标签中。文章将介绍在vue生命周期钩子`mounted`中使用原生dom操作方法(如`getelementsbytagname`、`insert…

    2025年12月23日 好文分享
    000
  • 解决HTML按钮无响应:显示正常但无法交互的常见原因与调试技巧

    当html按钮在页面上正常显示却无法响应用户交互时,通常涉及css样式、javascript事件处理或元素层叠等问题。本文将深入探讨这些常见原因,特别是css选择器中的细微差别,并通过具体案例分析和调试技巧,指导开发者有效诊断并解决按钮无响应的困境,确保交互功能如期实现。 HTML按钮无响应的常见原…

    2025年12月23日
    000
  • cmd怎么运行html_cmd命令运行html文件方法【教程】

    1、使用start命令可调用默认浏览器打开HTML文件,操作为cd目录后输入start example.html;2、直接指定浏览器路径如chrome.exe并附加HTML文件路径可精准控制打开程序;3、编写批处理脚本for %%i in (*.html) do start “&#822…

    2025年12月23日
    000
  • hbuilder怎么运行html5_hbuilder运行html5步骤【指南】

    首先确认项目结构完整并将HTML文件保存在无中文路径的目录下,接着在HBuilder中设置默认浏览器,然后右键HTML文件选择“运行”以启动内置服务器预览,若依赖服务器功能需确保内置Web服务器已开启,最后通过控制台排查报错并验证文档声明是否为。 如果您在使用HBuilder开发HTML5项目时,希…

    2025年12月23日
    000
  • HTML标签内部换行符的处理与影响:深入理解空白字符在渲染器和DOM中的行为

    本文深入探讨html中空白字符的处理机制。html渲染器在显示页面时,通常会忽略标签内部及周围的多数空白字符,将其折叠为单个空格。然而,文档对象模型(dom)会完整保留所有空白字符,以供内部处理和脚本访问。因此,在html标签内添加换行符等格式化操作,主要目的是提高代码可读性,并不会影响页面的最终渲…

    2025年12月23日
    000
  • 网页怎么运行代码html_网页运行代码html方法【教程】

    将HTML文件保存为.html格式并用浏览器直接打开可查看效果;2. 使用VS Code配合Live Server插件实现修改后自动刷新;3. 部署至XAMPP等本地服务器以支持需HTTP协议的功能;4. 利用JSFiddle等在线平台即时编辑与预览,适合快速测试。 如果您在编写HTML代码后希望查…

    2025年12月23日
    000
  • 使用 JavaScript 动态创建 HTML 表格并填充数组数据

    本教程详细介绍了如何利用 JavaScript 动态生成 HTML 表格,并将数组中的数据逐一填充到表格的每个单元格中。文章涵盖了从基本的 HTML 结构、JavaScript DOM 操作到 CSS 样式设置的完整过程,旨在帮助开发者高效地实现数据在网页上的结构化展示。 在现代前端开发中,经常需要…

    2025年12月23日
    000
  • Angular Material 轮廓输入框占位符文本截断与浏览器兼容性指南

    本文深入探讨了在 Angular Material 中为 `appearance=”outline”` 类型的输入框实现占位符文本截断(省略号)的挑战。我们将详细解析占位符与标签的渲染机制、提供精确的 CSS 样式方案,并着重强调浏览器在输入框聚焦时对占位符省略号显示行为的差…

    2025年12月23日
    000
  • Shadow DOM 样式与布局机制深度解析

    本文深入探讨了web components中shadow dom的样式与布局机制。我们将解析shadow dom内部元素如何获取样式、可继承样式的作用、自定义元素默认的内联显示特性,以及内部块级元素(如` `)如何影响整体布局,并提供实际的代码示例和最佳实践,帮助开发者更好地掌握shadow dom…

    2025年12月23日
    000
  • jQuery点击表格行内按钮高亮特定行教程

    本教程旨在解决如何使用jquery精确实现点击表格行内的操作按钮时,仅高亮显示该按钮所在行的功能。文章通过分析常见实现误区,提供了一种简洁高效的解决方案,重点讲解了正确的事件绑定机制、dom遍历技巧以及jquery选择器的运用,帮助开发者避免重复高亮或无效操作,从而提升用户界面交互的准确性和流畅性。…

    2025年12月23日
    000
  • 如何精确控制可拖拽元素的行为:阻止子元素拖拽事件冒泡到父元素

    本文详细介绍了在嵌套可拖拽元素场景中,如何通过javascript的event.stoppropagation()方法,精确控制拖拽事件的传播。当子元素被拖拽时,此方法能有效阻止dragstart事件冒泡到父容器,从而避免父子元素同时响应拖拽,确保用户交互的准确性和预期行为。 在前端开发中,我们经常…

    2025年12月23日
    000

发表回复

登录后才能评论
关注微信