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