0

我已经对上述主题进行了一些挖掘,但现在比开始时更加困惑。

我有一个正在处理的单位转换器。

它作为基本模型运行良好,但我现在正试图使其更加模块化。

有许多单位和许多转换。

我的计划是有一个函数来确定需要什么类型的转换、温度、面积等,然后可以调用适当的函数来执行数学运算。

我很新,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>
4

2 回答 2

1

第一个明显的问题是这一行:

$("#btnConvert").click.convertUnits();

这会尝试调用在返回的 jQuery 对象的convertUnits()方法上定义的方法。没有这样的方法,所以你会得到一个关于 how has no method的错误。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

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);
}

工作演示:http: //jsfiddle.net/jT2ke/

一些不相​​关的建议:parseInt()将数字输入转换器实际上没有意义,因为用户可能想要输入十进制值。您可以parseFloat()改用,或使用一元加号运算符:

var input = +test.units.val();

但是,如果您愿意parseInt(),通常建议将第二个参数传递给它以指定基数:

var input = parseInt(test.units.val(), 10);

...因为否则如果输入文本有前导零,一些浏览器将假定该值是八进制而不是十进制。(parseFloat()并且一元加号没有这个问题。)

于 2013-07-08T11:37:45.627 回答
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()});
于 2013-07-08T11:32:41.517 回答