parseInt returns NaN 什么时候应该是一个数字?
parseInt returns NaN when it should be a number?
我有以下代码:
$(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 全部 return NaN
。
更新:
正如查理 H 在评论中指出的那样,如果我删除 parseInt
它 returns undefined
。
我没有在代码中看到为什么它没有从 div 中提取数据属性值的错误。
如何解决这个问题?
您可以使用 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
});
});
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>
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 表现得更符合预期。
Jquery 在版本高于 1 的数据属性中只允许一个 "-"
。您的代码适用于所有 JQuery 1.x 版本。
在 jQuery 3.0.0 之前,jQuery 尝试将 data-
属性的其余部分检索为驼峰式。换句话说:
data-answer-1
变成 data-answer1
并尝试检索所述属性(因为它无法将其规范化回 data-answer-1
),当然没有,所以它 returns未定义。任何 data-
属性包含多个破折号且未正确驼峰化,将无法通过 jQuery data
方法获得,因为它们在实际检索之前已驼峰化。这包括 data-
个不以第二个破折号后的字母开头的属性。
基本上,jQuery 会:
var key = jQuery.camelCase(key);
//... some time later
var attrName = "data-" + key.replace(/[A-Z]/g, "-" ).toLowerCase();
// back to normal or is it...?
elem.getAttribute(attrName); //might not exist.
我有以下代码:
$(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 全部 return NaN
。
更新:
正如查理 H 在评论中指出的那样,如果我删除 parseInt
它 returns undefined
。
我没有在代码中看到为什么它没有从 div 中提取数据属性值的错误。
如何解决这个问题?
您可以使用 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
});
});
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>
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 表现得更符合预期。
Jquery 在版本高于 1 的数据属性中只允许一个 "-"
。您的代码适用于所有 JQuery 1.x 版本。
在 jQuery 3.0.0 之前,jQuery 尝试将 data-
属性的其余部分检索为驼峰式。换句话说:
data-answer-1
变成 data-answer1
并尝试检索所述属性(因为它无法将其规范化回 data-answer-1
),当然没有,所以它 returns未定义。任何 data-
属性包含多个破折号且未正确驼峰化,将无法通过 jQuery data
方法获得,因为它们在实际检索之前已驼峰化。这包括 data-
个不以第二个破折号后的字母开头的属性。
基本上,jQuery 会:
var key = jQuery.camelCase(key);
//... some time later
var attrName = "data-" + key.replace(/[A-Z]/g, "-" ).toLowerCase();
// back to normal or is it...?
elem.getAttribute(attrName); //might not exist.