JavaScript价格计算器:根据支付周期动态调整弹窗价格显示教程

JavaScript价格计算器:根据支付周期动态调整弹窗价格显示教程

本教程详细介绍了如何在javascript价格计算器中,根据用户选择的“月付”或“年付”选项,动态调整弹窗中显示的商品价格。通过修改核心价格显示函数并优化计算逻辑,确保“月付”时价格自动增加20%,而“年付”保持不变,从而提供准确的用户体验。

在构建交互式价格计算器时,一个常见的需求是根据用户选择的支付周期(例如月付或年付)来调整显示的价格。原始代码已经实现了对总价的调整,即在选择“月付”时将总价提高20%,选择“年付”时保持不变。然而,在用户点击“信息”按钮弹出的价格分级(Preisstaffelung)中,价格并未同步更新,这可能导致用户对价格的误解。本教程将指导您如何修改现有JavaScript代码,以确保价格分级弹窗中的价格也能根据支付周期动态调整。

理解现有价格计算与显示机制

在深入修改之前,我们首先需要理解代码中几个关键函数的职责:

calcSum(): 这是核心计算函数,负责根据用户输入和选择的选项计算总价、各项分项价格,并更新页面上的显示。它内部通过 percent 变量来处理月付/年付的折扣或加成。getPrice(pricemodels, percent, amount): 此函数用于根据用户数量从价格模型中获取基础价格,并应用 percent 参数进行调整。printPreisstaffel(preisstaffel, idelement): 此函数负责遍历价格分级数据 (preisstaffel),并将其渲染到指定的HTML元素 (idelement) 中,通常用于显示在弹窗中。

问题的核心在于,printPreisstaffel 函数在渲染价格分级时,没有考虑当前的支付周期(月付或年付),而是直接显示了基础价格。

解决方案一:修改 printPreisstaffel 函数以应用支付周期调整

为了使价格分级弹窗中的价格也能根据支付周期动态调整,我们需要在 printPreisstaffel 函数内部引入支付周期的判断逻辑。

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

修改步骤如下:

在 printPreisstaffel 函数内部,获取当前用户选择的支付周期。这可以通过读取ID为 zahlrythmus 的 select 元素的值来实现。根据获取到的支付周期,对 preisstaffel[key] 进行相应的价格调整。如果选择“月付”(”M”),则将价格增加20%;否则(选择“年付”,”J”),保持原价。将调整后的价格格式化为两位小数,并更新到HTML字符串中。

以下是修改后的 printPreisstaffel 函数代码:

function printPreisstaffel(preisstaffel, idelement) {  document.getElementById(idelement).innerHTML = ""; // 清空现有内容  // 获取当前支付周期  var paymenttype = document.querySelector("#zahlrythmus").value;  for (var key in preisstaffel) {    var price;    if (paymenttype == "M") {      // 如果是月付,价格增加20% (乘以1.2)      price = (preisstaffel[key] * 1.2).toFixed(2);    } else {      // 否则(年付),价格保持不变      price = preisstaffel[key].toFixed(2);    }    document.getElementById(idelement).innerHTML += `
Bis ${key} Benutzer: ${price}€
`; }}

代码解释:

document.querySelector(“#zahlrythmus”).value;:这行代码用于获取用户在支付周期下拉菜单中选择的值(”M” 或 “J”)。if (paymenttype == “M”) { price = (preisstaffel[key] * 1.2).toFixed(2); }:如果 paymenttype 是 “M”(月付),则将当前价格 preisstaffel[key] 乘以 1.2(即增加20%),并使用 toFixed(2) 格式化为两位小数。else { price = preisstaffel[key].toFixed(2); }:否则,如果 paymenttype 是 “J”(年付),则直接使用原始价格并格式化。

解决方案二:在 calcSum 函数中刷新价格分级显示

仅仅修改 printPreisstaffel 函数是不够的。当用户切换支付周期选项时,calcSum 函数会被调用,但 printPreisstaffel 并没有再次被调用以刷新弹窗内容。因此,我们需要在 calcSum 函数中,在确定了支付周期后,重新调用 printPreisstaffel 来更新弹窗显示。

修改 calcSum 函数,在处理完 percent 变量和计算完 apppreis 及 backendpreis 之后,添加对 printPreisstaffel 的调用。

function calcSum() {  // ... (现有代码,获取各种DOM元素和用户输入) ...  var paymenttype = document.querySelector("#zahlrythmus").value;  var backendtype = document.querySelector("#backendfunktion").value;  if (paymenttype == "M") {    percent = 1.2; // standardvalue for monthly  } else {    percent = 1; // standardvalue for annual  }  // If abfrage für Backend um Preisstaffel anzeigen zu lassen  if (backendtype == "ZR") {    backendpreis = getPrice(pricingbackendzr, percent, backendanzahl);  } else {    backendpreis = getPrice(pricingbackendz, percent, backendanzahl);  }  apppreis = getPrice(pricingapp, percent, appanzahl);  // 重新调用 printPreisstaffel 以刷新弹窗中的价格分级显示  printPreisstaffel(pricingapp, "preisstaffelapp");  if (backendtype == "ZR") {    printPreisstaffel(pricingbackendzr, "preisstaffelbackend");  } else {    printPreisstaffel(pricingbackendz, "preisstaffelbackend");  }  // ... (现有代码,计算并更新总价、分项价格等) ...}

代码解释:

在 calcSum 函数中,我们确保在 percent 变量根据 paymenttype 被正确设置,并且 apppreis 和 backendpreis 已经被 getPrice 函数计算之后,立即调用 printPreisstaffel。printPreisstaffel(pricingapp, “preisstaffelapp”); 会更新App用户的价格分级弹窗。条件判断 if (backendtype == “ZR”) { … } else { … } 会根据选择的后端功能类型,更新对应的后端价格分级弹窗。

完整 app.js 代码示例

为了方便您理解,以下是经过修改和优化的 app.js 文件的关键部分,包含了上述所有更改:

var percent = 1; // Standardvalue for yearlyapppreis = 7.5;backendpreis = 35;// Preisstaffelung Zeiterfassung+Rechnungswesen für Backendpreisvar pricingbackendzr = { 4: 35.00, 10: 32.50, 20: 30.00 };var pricingbackendz = { 4: 20.00, 10: 18.00, 20: 16.00 };var pricingapp = { 10: 7.50, 25: 7.00, 50: 6.50, 75: 6.00, 500: 5.50 };document.addEventListener("DOMContentLoaded", function (event) {  document.querySelectorAll(".updatecolor").forEach(updateinputs =>    updateinputs.addEventListener("input", function () {      var percent = calcPercent(this.value, this.min, this.max);      const bg = getComputedStyle(this).getPropertyValue('--background');      const slider = getComputedStyle(this).getPropertyValue('--slider');      var colorchanger = this.getAttribute('rangecolorid');      var sliderselect = document.querySelector('#' + colorchanger);      sliderselect.setAttribute(        'style',        ` background:linear-gradient(to right,${slider},${slider} ${percent}%,${bg} ${percent}%) `      )    })  );  // Initiale Anzeige der Daten和价格分级  calcSum();  updatePreisStaffelungBackend(); // 确保后端价格分级在页面加载时正确显示});function printPreisstaffel(preisstaffel, idelement) {  document.getElementById(idelement).innerHTML = "";  var paymenttype = document.querySelector("#zahlrythmus").value;  for (var key in preisstaffel) {    var price;    if (paymenttype == "M") {      price = (preisstaffel[key] * 1.2).toFixed(2); // 月付增加20%    } else {      price = preisstaffel[key].toFixed(2); // 年付保持不变    }    document.getElementById(idelement).innerHTML += `
Bis ${key} Benutzer: ${price}€
`; }}function updateUser(val, inputtype) { if (inputtype == 'Appuserrangecolor') { document.getElementById('AppInput').value = val; } if (inputtype == 'AppInput') { document.getElementById('Appuserrangecolor').value = val; } if (inputtype == 'Backendrangecolor') { document.getElementById('BackendInput').value = val; } if (inputtype == 'BackendInput') { document.getElementById('Backendrangecolor').value = val; } calcSum(); // 任何用户输入更新后都重新计算总和}function calcPercent(curval, min, max) { return ((curval - min) / (max - min)) * 100;}function updatePreisStaffelungBackend() { var backendtype = document.querySelector("#backendfunktion").value; if (backendtype == "ZR") { printPreisstaffel(pricingbackendzr, "preisstaffelbackend"); } else { printPreisstaffel(pricingbackendz, "preisstaffelbackend"); }}function calcSum() { var preisproapp = document.querySelector('.proapp'); var backendpreissum = document.querySelector('.backendpreissum'); var appstk = document.querySelector('.appanzahl'); var preisprobackend = document.querySelector('.probackend'); var jaehrlich = document.querySelector('.jaehrlichsum'); var summetext = document.querySelector('.summe'); var rabatt = document.querySelector('.rabattsum'); var backendanzahl = document.querySelector(".backenduser").value; var appanzahl = document.querySelector(".appuser").value; var paymenttype = document.querySelector("#zahlrythmus").value; var backendtype = document.querySelector("#backendfunktion").value; if (paymenttype == "M") { percent = 1.2; // standardvalue for monthly } else { percent = 1; // standardvalue for annual } // 根据后端类型获取后端价格 if (backendtype == "ZR") { backendpreis = getPrice(pricingbackendzr, percent, backendanzahl); } else { backendpreis = getPrice(pricingbackendz, percent, backendanzahl); } apppreis = getPrice(pricingapp, percent, appanzahl); // 刷新价格分级弹窗显示 printPreisstaffel(pricingapp, "preisstaffelapp"); if (backendtype == "ZR") { printPreisstaffel(pricingbackendzr, "preisstaffelbackend"); } else { printPreisstaffel(pricingbackendz, "preisstaffelbackend"); } var mytext = (((backendanzahl * backendpreis + +appanzahl * apppreis) * 1)).toFixed(2); summetext.textContent = mytext + "€"; // Rechnung für Backendpreissumme var backendpreissumme = (backendanzahl * backendpreis).toFixed(2); backendpreissum.textContent = backendpreissumme + "€"; // Rechnung für Apppreissumme var apppreissumme = (appanzahl * apppreis).toFixed(2); appstk.textContent = apppreissumme + "€"; // Rechnung für Preis pro Backendbenutzer var probackend2 = ((backendpreis * backendanzahl) / (backendanzahl)).toFixed(2); preisprobackend.textContent = probackend2; // Rechnung für Preis pro App-Benutzer var proapp2 = appanzahl > 0 ? ((apppreis * appanzahl) / (appanzahl)).toFixed(2) : apppreis.toFixed(2); preisproapp.textContent = proapp2; // If Abfrage wenn "Jaehrlich" ausgewaehlt wird var jaehrlicherrabatt = 0; // Initialize jaehrlicherrabatt if (paymenttype == "J") { jaehrlicherrabatt = ((backendanzahl * backendpreis + +appanzahl * apppreis) * 12).toFixed(2); jaehrlich.textContent = jaehrlicherrabatt + "€"; } else { jaehrlich.textContent = ""; // Clear annual sum if not annual } // Rechnung für Ersparnis (此处逻辑似乎与需求不符,但保持原样) var rabattsum = (jaehrlicherrabatt * 0.2).toFixed(2); // 原代码中 rabattsum 依赖 jaehrlicherrabatt,需注意其作用域和计算逻辑 rabatt.textContent = "-" + rabattsum + "€";}function checkHide(element) { var hidden = document.getElementById('hiddenMonthly'); if (element && hidden) { element.value === 'M' ? (hidden.style.visibility = 'hidden') : (hidden.style.visibility = 'unset') }}function getPrice(pricemodels, percent, amount) { for (var key in pricemodels) { if (parseInt(key) >= parseInt(amount)) { return pricemodels[key] * percent; } } // If amount exceeds all defined keys, return the price of the largest key const lastKey = Object.keys(pricemodels).pop(); return pricemodels[lastKey] * percent;}

注意事项

DOM元素ID的准确性: 确保 document.querySelector(“#zahlrythmus”) 能够正确地选中HTML中支付周期选择框的ID。函数调用时机: 任何可能影响价格计算或显示(包括弹窗)的用户交互(如滑块拖动、文本输入、下拉菜单选择)都应该触发 calcSum() 函数的调用,以确保所有价格数据同步更新。代码可读性: 像 1.2 这样的魔法数字可以定义为常量,例如 const MONTHLY_PREMIUM_FACTOR = 1.2;,以提高代码的可读性和未来的维护性。初始化: 在 DOMContentLoaded 事件监听器中,确保 calcSum() 和 updatePreisStaffelungBackend() 被调用,以便在页面加载时就显示正确的初始价格和价格分级。

总结

通过上述修改,我们成功地解决了JavaScript价格计算器中,根据支付周期动态调整弹窗价格显示的问题。核心在于:

在 printPreisstaffel 函数中引入支付周期判断逻辑,直接在渲染价格分级时应用20%的月付加成。在 calcSum 函数中,确保每次支付周期或相关输入变更后,重新调用 printPreisstaffel 函数,以刷新弹窗内容,保证用户界面上显示的价格始终与实际计算结果一致。

这种方法确保了价格计算器在提供总价信息的同时,也能在详细的价格分级弹窗中展现出与支付周期相符的准确价格,从而提升了用户体验和系统的准确性。

以上就是JavaScript价格计算器:根据支付周期动态调整弹窗价格显示教程的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月23日 08:41:43
下一篇 2025年12月23日 08:41:58

相关推荐

  • 在Spring Boot Thymeleaf中创建动态链接的教程

    本教程详细介绍了如何在spring boot应用中使用thymeleaf模板引擎,为html表格中的动态数据(如url)生成可点击的链接。通过利用thymeleaf的`th:href`属性,结合表达式语法,您可以轻松地将后端传递的url字符串转换为前端页面上功能完善的超链接,从而提升用户体验和页面交…

    好文分享 2025年12月23日
    000
  • JavaScript实现动态下拉子菜单:精准控制显示与隐藏

    本教程旨在解决动态下拉菜单中一个常见问题:点击父级菜单项时,错误地显示所有子菜单。它将演示如何利用javascript的nextelementsibling属性,精准控制单个子菜单的可见性,确保仅显示与所点击父级项对应的子菜单,且无需大幅改动现有html结构。 引言 在现代Web应用中,下拉菜单是常…

    2025年12月23日
    000
  • 如何使用 current-device 模块实现精确的条件CSS样式控制

    本文详细介绍了如何结合 `current-device` javascript模块,动态地为特定设备(如平板电脑或移动设备)应用条件css样式,以解决传统媒体查询的局限性。通过javascript检测设备类型,并利用 `document.createelement(‘style&#821…

    2025年12月23日
    000
  • 响应式布局中保持连字符单词不换行:使用非断行连字符的教程

    在响应式网页设计中,当屏幕尺寸变化时,带连字符的单词(如“ab-cd”)可能会在连字符处断开,导致显示不佳。本教程将介绍如何利用html中的非断行连字符(non-breaking hyphen)来确保这些特定词组始终保持在同一行,即使在空间受限的情况下也能维持其完整性,从而提升页面布局的稳定性与可读…

    2025年12月23日 好文分享
    000
  • 旧版 PayPal Standard 集成:配置商品级运费的实践指南

    本文旨在指导用户如何在旧版 paypal standard html 表单集成中实现商品级运费的自定义设置。针对硬编码的 paypal 按钮,我们将探讨如何通过查阅 paypal 官方的 html 变量文档,特别是购物车上传命令 (`_cart`) 相关的参数,来为每个商品定义不同的运费。同时,文章…

    2025年12月23日
    000
  • html中如何重置_HTML表单/元素重置(reset)功能实现方法

    一、使用reset按钮可快速还原表单至初始状态,点击后自动清空所有输入项;二、通过JavaScript调用form.reset()方法实现程序化重置,适用于自定义事件触发;三、手动重置特定元素可精准控制部分字段恢复,需分别处理不同控件类型;四、利用FormData API保存初始值并比对还原,适合复…

    2025年12月23日
    000
  • 使用uBlock Origin高级过滤:基于嵌套子元素内容屏蔽父元素

    本文旨在深入讲解如何利用uBlock Origin的高级过滤功能,特别是`:has()`和`:has-text()`伪类,实现根据深层嵌套子元素的特定文本内容来精确屏蔽其父级HTML元素。通过具体的代码示例和详细解释,读者将掌握构建复杂过滤规则的技巧,从而实现更精细化的网页内容控制。 在日常网页浏览…

    2025年12月23日
    000
  • JavaScript:根据数据属性创建唯一数组集合

    本教程详细介绍了如何利用 javascript 遍历 html 元素,并根据其自定义数据属性(如 `data-tab`)动态地将相关数据分组到不同的唯一数组或对象中。通过获取 dom 元素、初始化数据容器以及迭代处理每个元素的属性,最终生成一个结构化的 javascript 对象,其中每个键对应一个…

    2025年12月23日
    000
  • 使用纯JavaScript实现表单字段的动态显示与生成

    本教程详细讲解如何利用纯javascript实现表单字段的动态显示与生成。通过监听`select`下拉菜单的`onchange`事件,我们能够根据用户的选择实时调整表单中输入字段的数量。文章将涵盖html结构准备、javascript逻辑编写以及关键注意事项,旨在帮助开发者构建交互性更强的动态表单。…

    2025年12月23日
    000
  • CSS过渡效果:实现元素悬停双向平滑动画的正确姿势

    在网页开发中,实现元素悬停(hover)时的平滑过渡效果是常见的需求。然而,开发者常遇到的一个问题是,过渡效果只在鼠标进入时生效,而鼠标离开时元素会瞬间恢复原状。本文将深入探讨这一常见问题,并提供正确的解决方案:将`transition`属性应用于元素的默认状态,而非仅限于`:hover`伪类,从而…

    好文分享 2025年12月23日
    000
  • Django教程:在更新页面正确显示已选中的单选按钮值

    本教程旨在解决django应用中更新页面无法正确显示已保存的单选按钮选中状态的问题。我们将详细介绍如何通过在模型中定义`choices`、使用django的`modelform`结合`radioselect`小部件,以及优化模板渲染来确保单选按钮状态的准确回显,同时提供手动处理html时的正确条件判…

    2025年12月23日
    000
  • CSS样式重置:消除浏览器默认边距与间距的专业实践

    本文深入探讨了html页面中常见的意外顶部边距问题,即使设置了`body { margin: 0; }`也可能无效的原因,并提供了一种专业的解决方案——使用css重置(css reset)。通过一个全面的css重置文件,开发者可以统一不同浏览器的默认样式,从而彻底消除不必要的边距和填充,确保页面布局…

    2025年12月23日
    000
  • 响应式图片焦点控制:Media Queries与CSS属性实践

    本文将深入探讨如何利用CSS媒体查询(Media Queries)结合`object-position`或`background-position`属性,解决移动设备上图片显示焦点不准确的问题。通过调整图片在不同屏幕尺寸下的定位,我们可以在不使用多张图片的情况下,确保图像的关键部分始终居中或按需显示…

    2025年12月23日
    000
  • 响应式图片焦点控制:利用CSS媒体查询优化移动端视觉体验

    在移动设备上,图片经常因缩放而导致焦点偏离,影响用户体验。本文将详细介绍如何利用css的`object-fit`和`object-position`属性,结合媒体查询(media queries),精确控制图片在不同屏幕尺寸下的显示区域和焦点位置,从而无需为移动端准备单独图片,实现图片内容的智能适配…

    2025年12月23日
    000
  • 深入理解CSS浮动清除:clear: both的应用与实践

    本文深入探讨了css浮动布局中`clear`属性的正确使用,特别是在同时应用`float: left`和`float: right`后如何清除浮动。文章详细解释了`clear: left`、`clear: right`和`clear: both`的区别与适用场景,强调了`clear: both`作为…

    2025年12月23日
    000
  • 纯JavaScript实现高效双标签页切换与内容管理

    本教程旨在提供一个优化且高效的纯javascript解决方案,用于管理双标签页的激活状态及其对应内容的显示。文章将深入探讨如何通过精简的html结构、明确的css样式以及集中的javascript逻辑,解决传统实现中常见的激活状态混乱和内容显示异常(如点击后所有内容消失)等问题,确保标签页切换体验的…

    2025年12月23日
    000
  • 如何在HTML中插入图片放大查看功能_JavaScript放大镜

    首先通过HTML结构搭建预览图、放大镜玻璃和放大区域,再用CSS进行定位与隐藏控制,最后利用JavaScript监听鼠标事件实现坐标同步与图片偏移,完成放大镜效果。 要在HTML中实现图片放大查看功能,也就是常说的“JavaScript放大镜”效果,可以通过监听鼠标移动事件,结合CSS定位和图片缩放…

    2025年12月23日
    000
  • 手机上怎么打html5_移动端HTML5开发环境配置方法

    可通过移动端代码编辑器App如CodePen、JSFiddle Mobile编写并实时预览HTML5;2. 使用Replit、CodeSandbox等云编辑器在手机浏览器中开发;3. 借助Termux+code-server或KSWEB等工具实现本地编写与服务器部署;4. 配合蓝牙键盘、语法高亮编辑…

    2025年12月23日
    000
  • HTA中利用VBScript动态控制HTML元素位置的教程

    在html应用程序(hta)中,直接在html标签的`style`属性中嵌入vbscript变量来动态设置元素位置是无效的。本教程旨在解决这一常见误区,详细阐述如何通过vbscript函数,结合html输入框的`onchange`事件,实时读取用户输入并更新指定html元素(如图片)的`style.…

    2025年12月23日
    000
  • Flexbox布局中内容溢出滚动方案:兼顾垂直居中与滚动功能

    本教程旨在解决CSS Flexbox布局中,当容器设置`height: 100%`并应用`justify-content: center`实现垂直居中时,内容超出视口却无法滚动的问题。核心解决方案是在Flex容器上添加`overflow: auto;`,从而在保持内容垂直居中的同时,为溢出内容启用滚…

    2025年12月23日
    000

发表回复

登录后才能评论
关注微信