我已经对上述主题进行了一些挖掘,但现在比起初时更加困惑。
我有一个我正在研究的单位转换器。
它作为基础模型工作正常,但我现在正试图使其更加模块化。
有很多单位和很多转换。
我的计划是有一个函数来确定需要什么类型的转换,温度,区域等,然后可以调用相应的函数来执行数学运算。
我对JS
很新,这对我没有帮助,因为它可能是一个简单的错误,但我很可能会犯错误。
我认为问题是将对象传递给下一个函数然后使用它。
我玩了很多代码并在网上尝试了很多不同的建议,但仍然没有成功。
这是我的代码:
<script type="text/javascript">
function Convert(from, to, units, res){
this.from = from;
this.to = to;
this.units = units;
this.res = res;
}
Convert.convertUnits = function(){
var measurementType = $(".from option:selected").attr("class");
var result = "invalid input";
var input = parseInt(this.units.val());
if(measurementType == "temp"){
var test = new Convert($("#from"), $("#to"), $("#units"), $("#result"));
test.convertTemp();
console.log('Did we get this far?!?! ::', measurementType);
}
console.log('or not???? ::', measurementType);
}
Convert.prototype.convertTemp = function(){
var result = "invalid input";
var input = parseInt(this.units.val());
var f = this.from.val();
var t = this.to.val()
if(!isNaN(input)) {
if(f == "degC"){
if(t == "degF"){
result = input * 1.8 + 32;
}
if(t == "kelvin"){
result = input + 273.15;
}
}
}
console.log('Parsed input is', input, "and result is", result);
this.res.val(result);
return result;
}
//var calcTempTest = new Convert($("#from"), $("#to"), $("#units"), $("#result"));
//var test = new Convert($("#from"), $("#to"), $("#units"), $("#result"));
$("#btnConvert").click.convertUnits();
</script>
答案 0 :(得分:1)
第一个明显的问题是这一行:
$("#btnConvert").click.convertUnits();
这会尝试调用由convertUnits()
返回的jQuery对象的click
方法定义的$("#btnConvert")
方法。没有这样的方法,所以你会得到关于click
没有方法'convertUnits'
的方法的错误。
你想要做的是将convertUnits()
函数绑定为点击处理程序,你可以将它作为参数传递给.click()
方法:
$("#btnConvert").click(Convert.convertUnits)
将convertUnits()
声明为Convert()
的属性是没有意义的,所以(尽管它会按原样运行)我会将其更改为:
function convertUnits() {
// your code here
}
$("#btnConvert").click(convertUnits);
停止代码工作的唯一另一件事就是在这一行:
var input = parseInt(this.units.val());
...你使用this
假设它是一个Convert
对象,但是你还没有创建一个units
对象 - 你这样做了使用此行在Convert
块内:
if(measurementType == "temp")
因此,将该行移至函数的开头,然后使用var test = new Convert($("#from"), $("#to"), $("#units"), $("#result"));
代替test
:
this
工作演示:http://jsfiddle.net/jT2ke/
一些不相关的建议:function convertUnits(){
var test = new Convert($("#from"), $("#to"), $("#units"), $("#result"));
var measurementType = $(".from option:selected").attr("class");
var result = "invalid input";
var input = parseInt(test.units.val());
if(measurementType == "temp"){
test.convertTemp();
console.log('Did we get this far?!?! ::', measurementType);
}
console.log('or not???? ::', measurementType);
}
对于输入转换器的数字没有意义,因为用户可能想要输入小数值。您可以使用parseInt()
代替,或使用一元加运算符:
parseFloat()
但是如果你想要var input = +test.units.val();
,通常建议传递第二个参数来指定基数:
parseInt()
...因为否则如果输入文本具有前导零,则某些浏览器将假定该值是八进制而不是十进制。 (var input = parseInt(test.units.val(), 10);
和一元加号没有那个问题。)
答案 1 :(得分:0)
我认为你不应该在Convert对象里面实现convertUnits方法。新代码如下所示:
convertUnits = function(){
var measurementType = $(".from option:selected").attr("class");
var result = "invalid input";
if(measurementType == "temp"){
var test = new Convert($("#from"), $("#to"), $("#units"), $("#result"));
test.convertTemp();
console.log('Did we get this far?!?! ::', measurementType);
}
console.log('or not???? ::', measurementType);
}
现在您可以点击按钮启动convertUnits:
$("#btnConvert").click(function(){new convertUnits()});