【问题标题】:Changing td color if its value is over 10,000如果值超过 10,000,则更改 td 颜色
【发布时间】:2019-07-22 05:04:51
【问题描述】:

我正在做 CS50 金融练习,并试图显示某人是否从他的股票中获利。最初,您将获得 10000 现金。我试图显示投资组合的总价值(HTML 代码结尾)何时超过 10000 美元。我已经编写了以下代码,但是它还没有工作,希望你能帮助我。

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.js"></script>
<script type="text/javascript">
  $(document).ready(function() {
    $('#table_id td.color').each(function() {
      if ($(this).val() > 10000) {
        $(this).css('color', '#2e944b');
      }
    });
  });
</script>
<table class="table" id="table_id">
  <tr>
    <th></th>
    <th>User ID</th>
    <th>Stock</th>
    <th>Company Name</th>
    <th>Amount</th>
    <th>Current Price</th>
    <th>Holdings</th>
  </tr>
  {% for port in portfolio %}
  <tr>
    <td></td>
    <td>{{port.id}}</td>
    <td>{{port.stocks}}</td>
    <td>{{lookup(port.stocks)['name']}}</td>
    <td>{{port.amount}}</td>
    <td>{{usd(lookup(port.stocks)['price'])}}</td>
    <td>{{usd(lookup(port.stocks)['price']*port.amount)}}</td>
  </tr>
  {% endfor %}
  <tr>
    <td><b>Cash</b></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td>{{ usd(cash) }}</td>
  </tr>
  <tr>
    <td><b>Total</b></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td class="color">{{ usd(grand_tot) }}</td>
  </tr>
</table>

【问题讨论】:

    标签: javascript jquery html html-table css-selectors


    【解决方案1】:

    您正在通过执行if ($(this).val() &gt; 1000) { 检查td 的值。但是td 没有值,它里面有一个文本。因此,您需要检查 .text() 方法,而不是 .val() 方法。

    $('#table_id td.color').each(function(){
        if ($(this).text() > 1000) {
            $(this).css('color','#2e944b');
        }
    });
    

    【讨论】:

    • 你在比较字符串和整数
    • 试试看,10 &gt; "11" 工作正常。尽管将其解析为 int 可能是一件好事,但这不是实际问题。顺便说一句,你应该在你的答案中添加一些描述,而不仅仅是“这会起作用”,否则有人可能也会对你投反对票,因为你有一个非描述性的答案.. ;-) 仅代码的答案通常不受欢迎。
    • @AmoghHegde 它被称为类型强制。它已经存在了很长时间,导致很多不理解它的人认为这是一个错误。
    • 好吧对不起这个错误..我自己试过了,我会删除downvote..编辑:哎呀太晚了5分钟抱歉..
    【解决方案2】:

    考虑到值始终是Integer,这应该可以工作

    val() 方法仅适用于输入字段,要获取 &lt;td&gt; 的内部 html,您需要使用 text()

    $(document).ready(function(){
        $('#table_id td.color').each(function(){
            if (parseInt($(this).text()) > 1000) {
                $(this).css('color','#2e944b');
            }
        });
    });
    

    【讨论】:

      【解决方案3】:

      问题是$(this).val()&lt;td&gt; 标签没有 val()

      <style></style>
      <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.js"></script>
      <script>
        $(document).ready(function(){
          $('#table_id td.color').each(function(){        
              if ($(this).html() > 1000) {
                  $(this).css('color','#2e944b');
              }
          });
      });
      </script>
        <table class="table" id="table_id" >
          <tr>
            <th></th>
            <th>User ID</th>
            <th>Holdings</th>
          </tr>
          <tr>
            <td><b>Total</b></td>
            <td></td>
            <td class="color">900</td>
          </tr>
          <tr>
            <td><b>Total</b></td>
            <td></td>
            <td class="color">1001</td>
          </tr>
        </table>

      【讨论】:

        【解决方案4】:

        首先请注意,jQuery 1.4.4 已经过时了。您应该至少使用 1.12.1,最好是 3.3.1(在提出这个问题时)。

        您的逻辑的主要问题是您在没有值的td 元素上使用val()。您需要改为检查text()。鉴于文本的格式,您还需要在进行比较之前从中删除 $, 字符。

        还请注意,最好将类应用于元素以设置它们的样式,以保持关注点分离。因此,您可以使用addClass(),并且可以为该方法调用提供一个函数,以根据单元格中的文本确定是否应添加该类。

        最后请注意,问题指出“超过 10,000”,但您的代码正在检查超过 1,000。无论哪种方式,这都是逻辑上的简单变化。试试这个:

        $(document).ready(function() {
          $('#table_id td.color').addClass(function() {
            var total = $(this).text().replace(/[$,]/g, '');
            return parseInt(total, 10) > 10000 ? 'foo' : null;
          });
        });
        .foo {
          color: #2E944B;
        }
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
        <table class="table" id="table_id">
          <tr>
            <th></th>
            <th>User ID</th>
            <th>Stock</th>
            <th>Company Name</th>
            <th>Amount</th>
            <th>Current Price</th>
            <th>Holdings</th>
          </tr>
          <tr>
            <td><b>Total</b></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td class="color">$101</td>
          </tr>
          <tr>
            <td><b>Total</b></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td class="color">$1,001</td>
          </tr>
          <tr>
            <td><b>Total</b></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td class="color">$10,001</td>
          </tr>
          <tr>
            <td><b>Total</b></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td class="color">$100,001</td>
          </tr>
        </table>

        【讨论】:

        • 嗨@Rory,感谢您提供的非常清晰的答案。还有一个问题:因为我通过一个使其成为美元符号的函数传递值,所以将其变为绿色似乎不起作用。这个函数的代码很简单:return f"${value:,.2f}" 有什么建议可以解决这个问题吗?
        • 您只需要在计算之前删除$parseInt($(this).text().replace('$', ''), 10)
        • 嗯,恐怕这对我不起作用。我也尝试将 $ 替换为 0 但它也没有。不好意思打扰了,谢谢帮忙。另外,您介意在原始帖子中指定 ')、10)' 中的十个和 'null' 在您的 jQuery 代码中的作用吗?我对此很陌生
        • 你能给我看一个实际输出值的例子吗? 10 是基数:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
        • 我已经添加了一个截图,希望这就是你的意思。 @罗里
        猜你喜欢
        • 1970-01-01
        • 2015-05-04
        • 1970-01-01
        • 1970-01-01
        • 2022-01-06
        • 1970-01-01
        • 2023-02-22
        • 2015-08-05
        • 1970-01-01
        相关资源
        最近更新 更多