【问题标题】:parseInt returns NaN when it should be a number?当它应该是一个数字时,parseInt 返回 NaN?
【发布时间】:2016-01-14 16:11:04
【问题描述】:

我有以下代码:

$(function() {
    var $form = $("#pollAnswers"),
        $radioOptions = $form.find("input[type='radio']"),
        $existingDataWrapper = $(".web-app-item-data"),
        $webAppItemName = $existingDataWrapper.data("item-name"),
        $formButton = $form.find("button");
    
        $radioOptions.on("change",function(){
    
          $formButton.removeAttr("disabled");
    
          var chosenField = $(this).data("field"), 
              answer_1 = parseInt($existingDataWrapper.data("answer-1")),
              answer_2 = parseInt($existingDataWrapper.data("answer-2")),
              answer_3 = parseInt($existingDataWrapper.data("answer-3"));
            
            console.log("1 =" + answer_1);
            console.log("2 =" + answer_2);
            console.log("3 =" + answer_3);
            
            //Additional code not related to question
         });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="web-app-item-data" data-item-name="Test" data-answer-1="0"  data-answer-2="0"  data-answer-3="0"></div>

<form id="pollAnswers">
    <div class="answers">
        <input type="radio" name="radioChoice" data-field="CAT_Custom_2"> Answer 1<br>
        <input type="radio" name="radioChoice" data-field="CAT_Custom_4"> Answer 2<br>
        <input type="radio" name="radioChoice" data-field="CAT_Custom_6"> Answer 3<br>
    </div>
<button type="submit" disabled>Submit</button>
</form>

当您运行代码时,您将在控制台中看到答案 1、2 和 3 都返回 NaN

更新

正如 Charlie H 在评论中指出的那样,如果我删除 parseInt,它会返回 undefined

我没有在代码中看到为什么它没有从 div 中提取数据属性值的错误。

我该如何解决这个问题?

【问题讨论】:

  • existingDataWrapper.data("answer-1") 在没有 parseInt 的情况下为您提供什么
  • @CharlieH - undefined 是它给我的。 jQuery拉数据属性有什么不对吗?

标签: javascript jquery nan custom-data-attribute parseint


【解决方案1】:

jQuery 2.1.3 似乎无法识别包含仅由数字组成的名称段的数据属性。例如,这些工作:

  • data-answer.data()["answer"]
  • data-foo.data()["foo"]
  • data-foo-bar.data()["fooBar"]

这些不:

  • data-answer-1

  • data-foo-bar-3

jQuery 3 似乎表现得更符合预期。

【讨论】:

  • 是吗?在我的测试中,它完全忽略了那个。然而,奇怪的是,它确实允许 data-1-answer。
  • 啊哈!这取决于您使用的 jQuery 版本。
  • 很好地找到了关于 jQuery 的版本!当您指出有效和无效的方法时,我刚刚意识到的另一个解决方法是使用data-answer1。换句话说,只需删除 - 即可。感谢您的帮助。
【解决方案2】:

来自 jquery 的数据函数似乎没有考虑属性名称中具有数字的属性。 “number-1”不起作用,但“number-one”起作用。这可能会帮助您快速解决问题。

$(function() {
    var $form = $("#pollAnswers"),
        $radioOptions = $form.find("input[type='radio']"),
        $existingDataWrapper = $(".web-app-item-data"),
        $webAppItemName = $existingDataWrapper.data("item-name"),
        $formButton = $form.find("button");
    
        $radioOptions.on("change",function(){
    
          $formButton.removeAttr("disabled");
    
          var chosenField = $(this).data("field"), 
              answer_1 = parseInt($existingDataWrapper.data("answer-one")),
              answer_2 = parseInt($existingDataWrapper.data("answer-two")),
              answer_3 = parseInt($existingDataWrapper.data("answer-three"));
            console.log("1 =" + answer_1);
            console.log("2 =" + answer_2);
            console.log("3 =" + answer_3);
            
            //Additional code not related to question
         });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="web-app-item-data" data-item-name="Test" data-answer-one="0"  data-answer-two="0"  data-answer-three="0"></div>

<form id="pollAnswers">
    <div class="answers">
        <input type="radio" name="radioChoice" data-field="CAT_Custom_2"> Answer 1<br>
        <input type="radio" name="radioChoice" data-field="CAT_Custom_4"> Answer 2<br>
        <input type="radio" name="radioChoice" data-field="CAT_Custom_6"> Answer 3<br>
    </div>
<button type="submit" disabled>Submit</button>
</form>

【讨论】:

    【解决方案3】:

    jQuery 3.0.0 之前,jQuery 尝试将 data- 属性的其余部分检索为驼峰式。换句话说:

    data-answer-1 被骆驼化为data-answer1 并尝试检索所述属性(因为它无法将其规范化回data-answer-1),当然没有,所以它返回未定义。任何包含多个破折号且未正确驼峰化的 data- 属性将无法通过 jQuery data 方法获得,因为它们在实际检索之前已被驼峰化。这包括data- 在第二个破折号后不以字母开头的属性。

    基本上,jQuery 会:

    var key = jQuery.camelCase(key);
    //... some time later
    var attrName = "data-" + key.replace(/[A-Z]/g, "-$1" ).toLowerCase();
    // back to normal or is it...?
    elem.getAttribute(attrName); //might not exist.
    

    根据issue,这已在版本 3.0.0 上得到修复。这是修复它的commit

    【讨论】:

    • 感谢您提供的信息!它似乎在 1.xx 分支中工作,而不是 2.xx。很高兴看到它在 jQuery 3.0 中得到修复
    【解决方案4】:

    Jquery 在高于 1 的版本中只允许一个 "-" 在数据属性中。您的代码对所有 JQuery 1.x 版本都非常有效。

    【讨论】:

      【解决方案5】:

      您可以使用attr() 函数读取属性。但是,正如其他人所建议的那样,jQuery 不会读取带有数字的属性名称。

      查看代码以获取解决方案。

      $(function() {
          var $form = $("#pollAnswers"),
              $radioOptions = $form.find("input[type='radio']"),
              $existingDataWrapper = $(".web-app-item-data"),
              $webAppItemName = $existingDataWrapper.data("item-name"),
              $formButton = $form.find("button");
      
              $radioOptions.on("change",function(){
      
                $formButton.removeAttr("disabled");
      
                var chosenField = $(this).data("field"), 
                    answer_1 = parseInt($existingDataWrapper.attr("data-answer-1")),
                    answer_2 = parseInt($existingDataWrapper.attr("data-answer-2")),
                    answer_3 = parseInt($existingDataWrapper.attr("data-answer-3"));
      
                  console.log("1 =" + answer_1);
                  console.log("2 =" + answer_2);
                  console.log("3 =" + answer_3);
      
                  //Additional code not related to question
               });
      });
      

      【讨论】:

        猜你喜欢
        • 2012-04-28
        • 2016-05-20
        • 2014-11-16
        • 2015-07-09
        • 1970-01-01
        • 2022-06-12
        • 2017-03-28
        • 2012-07-07
        • 2021-12-20
        相关资源
        最近更新 更多