jQuery(..).val()的结果上无法使用Number.prototype.function

3

我从另一篇帖子中获取了这段代码。

Number.prototype.countDecimals = function () {
    if(Math.floor(this.valueOf()) === this.valueOf()) return 0;
    return this.toString().split(".")[1].length || 0; 
}

var x = 23.453453453;
x.countDecimals(); //returns 9 as expected

基本上,它返回给定数字中的小数位数。问题在于,我需要从输入框内的数字中获取该值:

console.log($('#myinput').val().countDecimals());

...但是该操作返回:未捕获的类型错误:未定义的函数

我如何将先前的代码与输入值(使用jQuery)集成在一起?谢谢!

3个回答

2
这是因为.val()实际上返回一个对象:Object [value]。只需在其上执行parseFloat即可:
console.log( parseFloat( $('#myinput').val() ).countDecimals() );

实际上抛出此错误的内容为:TypeError: Cannot read property 'length' of undefined - Andres SK
@andufo 你是否定义了value?这里有一个例子:http://jsfiddle.net/5p8L84ot/ - Spencer Wieczorek
太棒了!它真的起作用了,我在测试你的解决方案时出现了一个错误。谢谢! - Andres SK

2

它将会得到期望的结果。

(注:已保留HTML标签)
 <html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
</head>
<body>
<input type ="text" id="inpVal">
<input type ="button" id="inpBtn" value="click!!!!">
<script>
Number.prototype.countDecimals = function () {
    if(Math.floor(this.valueOf()) === this.valueOf()) return 0;
    return this.toString().split(".")[1].length || 0; 
}

$("#inpBtn").click(function(){
    var x = parseFloat($("#inpVal").val()).countDecimals();
    alert(x);
});
</script>
</body>
</html>

是的,但如果我尝试执行$('#myinput').val().countDecimals(),它就不起作用,这就是我想要实现的。 - Andres SK
我的错,问题理解错误了。已经纠正过来了。 - invinciblejai

2
你正在定义 countDecimals 函数在 Number 对象的原型中,因此它只能在 Number 类型的对象上调用。我没有测试过,但你可以使用 Number($('#myinput').val()).countDecimals() 来代替。

使用 NumberparseFloat 有什么区别?(两者都可以正常工作) - Andres SK
countDecimals 可以适用于任何数字类型或数值;JavaScript 会根据需要将原始类型提升为相应的对象类型。(这就是为什么 1.23.toFixed(1) 能够工作的原因。) - user2864740
1
@andufo parseFloat() 将其转换为浮点数。Number() 将其转换为数字。两者都将其转换为一般的数字。 - Spencer Wieczorek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接