【问题标题】:Change all prices on the page from one currency to another with jquery?使用jquery将页面上的所有价格从一种货币更改为另一种货币?
【发布时间】:2017-12-29 21:57:39
【问题描述】:

我不需要使用 Yahoo Finance api 等。只需将数字乘以固定数量即可。

See codepen。下拉功能没有实现,我想先把交换放下。 我知道这只是一个开始,但是如何继续呢?这显然需要解决几个问题:

  • 目前这会将每个值更改为相同
  • 我需要能够在再次选择美元时将它们改回
  • 不给出类名,而是自动查找所有价格(包含 $ 或 €)是否效率太低?

请您给我一些建议,我该怎么做?

$(document).ready(function() {
//  $('select').material_select();
  $('.caret').text(" ");
  //here starts my attempt for the exchange
  var price = $(".price").text().replace("$", "");
  var convertedToNumber = parseFloat(price);
  var eurPrice = convertedToNumber / 1.18;
  $(".price").text(eurPrice);


});
input.select-dropdown {
  color: #26a69a;
}
.caret {
  background:url("http://svgshare.com/i/3Bc.svg") no-repeat 90% 50%;
  width:20px;
  height:auto;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<div class="row">

  <div class="input-field col s1">
    <select>
          <option value="1" selected>USD</option>
          <option value="2">EUR</option>
        </select>
    <label>Currency</label>
  </div>
</div>


<ul class="currencies">
  <li class="price">$1500</li>
  <li class="price">$2000</li>
  <li class="price">$342</li>
</ul>

【问题讨论】:

  • 对于美元符号,您可以使用 CSS 类。见这里:stackoverflow.com/questions/29997297/…
  • 您真的应该看看 Web 应用程序中的“数据绑定”。这将使这个流程更容易。有很多图书馆可以帮助你。

标签: javascript jquery html css


【解决方案1】:

您正在寻找的东西称为数据绑定,有很多库和东西可以为您提供它。

我假设你不知道我在说什么,我将向你解释基本概念是什么。

您有一组数据,在您的情况下是价格。

var prices = [
  1500,
  2000,
  342
];

那么你就有了货币汇率的对象

var rates = {
  USD: 1, // obviously
  EUR: 0.86
}

现在每次更改货币时,您都会重新计算价格并更新每次出现的情况。

function updatePrices(rate) {
  var elements = document.getElementsByClassName("price");

  prices.forEach((price, index) => {
    elements[index].innerHTML = price * rate
  });
}

document.getElementById("selector").onchange = function() {
  updatePrices(rates[this.value]);
}

并且最初也调用它。

updatePrices(rates.USD);

现在显然这是一种非常愚蠢的方法来绑定数据,使用数组索引和类名,但这是它背后的基本思想。

至于货币符号,将它们包括在内通常是个坏主意,因为实际上很少有货币具有它们,但想法是一样的。

var prices = [
  1500,
  2000,
  342
];


var rates = {
  USD: 1, // obviously
  EUR: 0.86
}

function updatePrices(rate) {
  var elements = document.getElementsByClassName("price");

  prices.forEach((price, index) => {
    elements[index].innerHTML = price * rate
  });
}

document.getElementById("selector").onchange = function() {
  updatePrices(rates[this.value]);
}


updatePrices(rates.USD);
<div class="row">
  <div class="input-field col s1">
    <select id="selector">
          <option value="USD" selected>USD</option>
          <option value="EUR">EUR</option>
        </select>
    <label>Currency</label>
  </div>
</div>


<ul class="currencies">
  <li class="price"></li>
  <li class="price"></li>
  <li class="price"></li>
</ul>

【讨论】:

  • 您错过了货币代码,但页面上的许多价格更优雅
  • @mplungjan 正如我所说的想法是一样的,没有什么能阻止你添加它。
  • 这很好,因为这都是香草 - 没有 jquery :) 问题?如果数据需要内联输入怎么办?像 cms 内容一样明智吗?
  • @Riskbreaker 不管你的数据来自哪里,或者我不明白这个问题。
【解决方案2】:

由于您必须在汇率发生变化时更新价格,因此您可以有两套

数据属性

$(function() {
  $("#curr").on("change",function() {
    var curr   = this.value;
    var prefix = curr=="usd"; // or ["usd","yen",...].indexOf(curr); for more
    var sign   = curr=="usd"?"$":"€";
    $(".price").each(function(){
      $(this).text(
        (prefix?sign:"")   +
        $(this).data(curr) +
        (prefix?"":sign)
      );  
    })
  }).change();
});
input.select-dropdown {
  color: #26a69a;
}
.caret {
  background:url("http://svgshare.com/i/3Bc.svg") no-repeat 90% 50%;
  width:20px;
  height:auto;
}
.currencies { display:none }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<div class="row">

  <div class="input-field col s1">
    <select id="curr">
          <option value="usd" selected>USD</option>
          <option value="eur">EUR</option>
        </select>
    <label>Currency</label>
  </div>
</div>


<br />Price 1
  <span class="price" data-usd="1,500" data-eur="1.271">$1,500</span>

<br />Price 2

<span class="price" data-usd="2,000" data-eur="1.702">$2,000</span>

<br />Price 3

<span class="price" data-usd="342" data-eur="291">$342</span>

显示和隐藏:

$(function() {
  $("#curr").on("change",function() {
    $(".currencies").hide();
    $("."+this.value).show();
  }).change();
});
input.select-dropdown {
  color: #26a69a;
}
.caret {
  background:url("http://svgshare.com/i/3Bc.svg") no-repeat 90% 50%;
  width:20px;
  height:auto;
}
.currencies { display:none }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<div class="row">

  <div class="input-field col s1">
    <select id="curr">
          <option value="usd" selected>USD</option>
          <option value="eur">EUR</option>
        </select>
    <label>Currency</label>
  </div>
</div>


<ul class="currencies usd">
  <li class="price">$1,500</li>
  <li class="price">$2,000</li>
  <li class="price">$342</li>
</ul>
<ul class="currencies eur">
  <li class="price">1.276€</li>
  <li class="price">1.702€</li>
  <li class="price">291€</li>
</ul>

【讨论】:

  • 这似乎是一个相当简单的解决方案。不过我有一个问题,欧元符号应该追随价格,而不是像美元之前...我已经修补了一段时间,但不能用你的代码实现它!请你帮帮我好吗?
  • 请参阅更新 - 作为欧元用户,我实际上更喜欢 EUR1.200 而不是 1.200€
【解决方案3】:
  1. 您可以使用 CSS 类来代替使用 jquery 切换符号 (基于:how to add a dollar sign through css content

    ul.dollar li:before {
      content: "\0024";
    }
    ul.euro li:before {
      content: "\20ac";
    }
    
  2. 要更改每个值,您应该使用each

      $.each($(".price"), function(i, p) {
        var convertedToNumber = parseFloat($(p).text());
        var eurPrice = convertedToNumber / 1.18;
        $(p).text(eurPrice);
      });
    

在此处查看运行示例: https://codepen.io/anon/pen/oGZrpX

【讨论】:

  • 您的笔无法恢复
猜你喜欢
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
  • 2020-11-22
  • 2022-12-11
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 2015-06-08
相关资源
最近更新 更多