用于计算器变体的javascript

用于计算器变体的javascript,javascript,html,coding-style,logic,Javascript,Html,Coding Style,Logic,我正在做一个创建计算器变体的项目。基本上,我将所有用户的点击(可能是数字和运算符形式的+,-)存储在一个数组中,并在用户点击“=”时将数组交给另一个函数。我正在为此使用javascript。以下是我的代码: var arr=[]; //array of every input from the user interface stored var i=0; //number of input clicks from the user var opPos=[]; //position of th

我正在做一个创建计算器变体的项目。基本上,我将所有用户的点击(可能是数字和运算符形式的+,-)存储在一个数组中,并在用户点击“=”时将数组交给另一个函数。我正在为此使用javascript。以下是我的代码:

  var arr=[]; //array of every input from the user interface stored
var i=0; //number of input clicks from the user
var opPos=[]; //position of the operator as given by the user
var operAnd=[];//operands as given by the user
var disp='';

function clearval() {

// This function clears all the values stored in related array when C or CE is pressed

    document.getElementById("op").value=0;
    arr=[];
    i=0;
    opPos=[];
    operAnd=[];
    disp='';
}


//This Function get the value and supplies the array to calculating function

function getval(inp){

    if(inp!="=")

    {
    arr[i]=inp;
    disp=disp+inp;//for display in the screen of the output screen
    document.getElementById("op").value=disp;

        if (typeof inp!="number"){
        opPos.push(i);
        operAnd.push(inp);
        }
    i++;
    }

    else
    {
    var newInput=assembler(arr,opPos,operAnd);
    clearval();
    getval(parseFloat(newInput,10));
    }

}


//<!------This Function calculates based on array, operator position and operands------!>



function assembler(num_array,opPos,operAnd){

var num='';
var numCollect=[];
var posCount=0;
for(var j=0;j<num_array.length;j++){
if (j==opPos[posCount]) {
    numCollect.push(parseFloat(num,10));
    num='';
    j++;
    posCount++;
}
else if (j>posCount) {

}
num=num+num_array[j];

}
num=parseFloat(num,10);
numCollect.push(num);
//document.getElementById("op").value= numCollect;
var newInput=calculator(numCollect,operAnd);
return newInput;
}



function calculator(target_num,operAnd) {

//    Not the nice solution but straightforward nonetheless
var result='';
for (var l=0;l<operAnd.length;l++) {
    result=result+target_num[l]+operAnd[l];
}
result=result+target_num[l];
document.getElementById("op").value=result + '=' + eval(result) ;
return eval(result);
}
这基本上是要求用户输入号码,然后单击“=”进入程序。 现在你可以看到我的困境了。用户输入的任何内容都将首先由getval()处理,当用户单击“=”时,它会将数组传递给另一个函数,在本例中,这不是我想要的。要明确的是,对于这种情况,我会有很多,比如std.dev或类似的函数,我希望键盘像普通键盘一样工作,并将值传递给另一个函数,而不做正常的计算器工作


我想得对吗?有什么建议吗?

我认为您可以通过添加另一个名为
passval()
的函数来解决这个问题,该函数在将输入解析为浮点等方面与
getval()
包含许多相同的逻辑,但它永远不会将值推送到操作数堆栈上或调用
汇编函数。它只是将按下的按钮作为一个漂亮的浮点值返回给调用它的
.extra
函数


然后,作为
.extra
函数(如
Regression()
)逻辑的一部分,您首先将
onclick
函数与所有按钮从
getval()
交换为
passval()
。当回归或其他特殊函数完成时,将按钮切换回其默认行为。

我认为您可以通过添加另一个名为
passval()
的函数来解决此问题,该函数在将输入解析为浮点等方面包含与
getval()
相同的逻辑。,但它不会将值推送到操作数堆栈上或调用
汇编程序
函数。它只是将按下的按钮作为一个漂亮的浮点值返回给调用它的
.extra
函数


然后,作为
.extra
函数(如
Regression()
)逻辑的一部分,您首先将
onclick
函数与所有按钮从
getval()
交换为
passval()
。当回归或其他特殊功能完成时,将按钮切换回其默认行为。

好吧,这就是我要做的(如果我理解正确):

将按钮布局更改为:

删除
onclick
事件

使用
input type=“button”
总是比使用
更好

创建将事件绑定到按钮的函数:

function bindButtonEvent(func) {
    var buttons; // Here some way to get the button in a collection from the DOM tree
    for (var i = 0; i < buttons.length; i++) { 
        buttons[i].onclick = function() { func(buttons[i]); } 
    }
}
因此,在计算器加载时,您可以设置单击功能:

bindButtonEvent(getval())

如果要调用自定义行为函数,请再次调用绑定:

function regression() {
    bindButtonEvent(function(el) {
        value = el.value;
        // Do things

        // When done, take bindings back.
        bindButtonEvent(getval());
    });

    clearval();
    document.getElementById("op").value=" Enter the degree of regression:";
}

注意:这是一个想法。我没有测试代码。如果您对此感兴趣,并且在实现过程中出现错误,请告诉我,我们将修复它们。

好吧,这就是我要做的(如果我理解正确):

将按钮布局更改为:

删除
onclick
事件

使用
input type=“button”
总是比使用
更好

创建将事件绑定到按钮的函数:

function bindButtonEvent(func) {
    var buttons; // Here some way to get the button in a collection from the DOM tree
    for (var i = 0; i < buttons.length; i++) { 
        buttons[i].onclick = function() { func(buttons[i]); } 
    }
}
因此,在计算器加载时,您可以设置单击功能:

bindButtonEvent(getval())

如果要调用自定义行为函数,请再次调用绑定:

function regression() {
    bindButtonEvent(function(el) {
        value = el.value;
        // Do things

        // When done, take bindings back.
        bindButtonEvent(getval());
    });

    clearval();
    document.getElementById("op").value=" Enter the degree of regression:";
}

注意:这是一个想法。我没有测试代码。如果您对此感兴趣,并且在实现过程中出现错误,请告诉我,我们将着手解决这些问题。

如何进行“交换”?我是javascript新手,不知道如何更改按钮的onclick行为。不过,感谢您的回答。您需要从DOM中获取所有按钮元素,可能需要使用,然后更改这些元素的onclick事件。关于如何做到这一点,有一个很好的答案。所有这些都说明,如果你是Javascript新手,使用简单的旧JS做所有这些会让你的生活比需要的更困难——我想看看。我怎么做“交换”?我是javascript新手,不知道如何更改按钮的onclick行为。不过,感谢您的回答。您需要从DOM中获取所有按钮元素,可能需要使用,然后更改这些元素的onclick事件。关于如何做到这一点,有一个很好的答案。所有这些都说明,如果你是Javascript新手,那么使用简单的旧JS做所有这些事情会让你的生活变得比需要的更困难——我想看看。就我看来,这实际上是一个很好的方式。但请原谅我的无知,我想不出一个好办法让数组中的按钮用于…var按钮…我该怎么做?你的意思是这样的:var buttons=document.getElementsByTagName('button');是的,差不多。但在我的示例中,它将是这样的:
var buttons=document.getElementsByTagName('input')然后找到里面的按钮。我的第一个问题:当计算器加载时,我可以从bindButtonEvent(getval())开始…你说我应该稍微修改getval()函数。我不知道为什么我应该触摸它,因为现在所有的按钮都将它们的函数附加到getval()上,我希望getval()能像现在一样执行。如果我错了,请纠正我。第二个问题:我在理解你的变量方面有问题。el。它是什么,以及你对回归函数的实现。你能向我这样的新手解释一下吗。我真的很高兴,到目前为止,它正在朝着积极的方向发展。感谢您注意到我更改了按钮,因此您必须更改
getval
,因为您没有将按钮值作为参数传递给函数。在新的世界里
function getval(el){
    var inp = el.value;

    if(inp!="=")
function regression() {
    bindButtonEvent(function(el) {
        value = el.value;
        // Do things

        // When done, take bindings back.
        bindButtonEvent(getval());
    });

    clearval();
    document.getElementById("op").value=" Enter the degree of regression:";
}