2013-06-24 25 views
0

나는 프로젝트의 일종으로 계산기를 만들려고 노력 중이다. 기본적으로 배열의 모든 사용자 클릭 수 (+와 - 같은 숫자와 연산자 일 수 있음)를 저장하고 사용자가 "="을 클릭하면 다른 함수에 배열을 건네줍니다. 이 자바 스크립트를 사용하고 있습니다. 기본적인 수학에 대한계산기 변형을위한 자바 스크립트

<button class="num" onclick="getval(0)">0</button> 
<button class="num" onclick="getval(1)">1</button> 
<button class="num" onclick="getval(2)" >2</button> 
<button class="num" onclick="getval(3)" >3</button> 
......................... and so on 

이 코드는 잘 작동하고 문제가되지 않습니다 :이 같은 버튼이 있습니다 HTML을

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

: 아래는 내 코드입니다. 그러나 여기에 구현하는 방법을 생각하는 데 어려움을 겪고있는 곳에서 내 문제가 있습니다. 예를 들어, 다음과 같은 버튼이 있습니다.

<button class='extra' onclick="Regression()"> Find Regression </button> 

지금, 입력 회귀 유형을 사용자에게 요청한다 회귀 함수를 가질 것이다 (2 차 등등 1 선형 ... 이것은 단지 일례이다).

function regression(){ 

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

기본적으로 사용자가 번호를 입력하고 '='을 클릭하여 프로그램에 입장하도록 요청합니다. 이제 내 딜레마를 볼 수 있습니다. 사용자가 입력 한 내용은 먼저 getval()에 의해 처리됩니다.이 getval()은 사용자가 '='을 클릭하면 배열을 다른 함수로 전달합니다.이 경우에는 내가 원하지 않습니다. 분명히 말하자면, 이런 종류의 경우에 나는 std와 같은 많은 것을 가질 것입니다. dev 또는 이런 종류의 함수를 사용하고 싶다면 키패드가 일반 키패드처럼 작동하고 정상적인 계산기 작업을 수행하지 않고 다른 기능에 값을 전달해야합니다.

나는이 똑바로 생각하고 있니? 어떤 제안?

답변

1

음,이 (내가 바로 undestood 경우) 내가 할 것 인 것이다 : 이것에

변경하면 버튼 레이아웃 :

<input type="button" class="num" value="0" />onclick 이벤트

항상 더 나은를 제거하면 사용 input type="button"보다 <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]); } 
    } 
} 

당신은 모든 버튼의 click 이벤트를 변경하는 기능을 가지고 있습니다. 이렇게하면 엔진의 유연성이 향상됩니다.

당신은 그 자체로 가치를 얻기 위해 조금 당신의 getval 기능을 변경해야합니다 :

bindButtonEvent(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:"; 
} 

참고 : 그건 이상입니다. 나는 코드를 테스트하지 않았다. 이 문제에 관심이 있고 구현에 오류가있는 경우 알려 주시면 수정 해 드리겠습니다.

+0

이것은 실제로 볼 때까지 좋은 방법입니다. 하지만 다시 내 무지를 용서해, 배열에 좋은 버튼을 생각할 수 없다 ... var 버튼 ... 어떻게 할 수 있습니까? –

+0

이 말은 sth를 의미합니까? var buttons = document.getElementsByTagName ('button'); –

+0

예, 그런 것 같습니다. 그러나 나의 예를 들어 보면, 다음과 같이 될 것입니다.'var buttons = document.getElementsByTagName ('input');'그런 다음 안에있는 버튼을 찾습니다. – DontVoteMeDown

2

passval()이라는 다른 함수를 추가하여이 문제를 해결할 수 있다고 생각합니다. float에 입력을 구문 분석하는 측면에서 getval()과 동일한 로직을 많이 포함하지만, 피연산자 스택을 호출하거나 assembler 함수를 호출하십시오. 좋은 float 값으로 푸시 된 버튼을 호출 한 .extra 함수에 반환합니다.

그런 Regression()처럼 .extra 기능의 로직의 한 부분으로, 당신은 처음 getval()에서 passval()에 모든 버튼에 대한 onclick 기능을 바꿀 것입니다. 회귀 또는 다른 특수 기능이 완료되면 버튼을 기본 동작으로 되돌립니다.

+0

어떻게 '스왑'을 수행 할 수 있습니까? 나는 자바 스크립트에 익숙하지 않고 버튼의 onclick 동작을 어떻게 바꿀 수 있는지 알지 못한다. 그래도 고마워. –

+1

DOM에서 button 요소를 모두 가져와야합니다. 아마도 [document.getElementsByClassName] (https://developer.mozilla.org/en-US/docs/Web/API/document.getElementsByClassName)을 사용하고, 그런 다음 각 요소에 대해 onclick 이벤트를 변경하십시오. 저기 [여기] (http://stackoverflow.com/questions/4244401/change-onclick-event-with-javascript-not-working)하는 방법에 대한 좋은 답변이 있습니다. – uptownnickbrown

+1

Javascript를 처음 사용하는 사람이라면 일반 JS를 사용하여이 모든 작업을 수행하는 것이 당신의 인생을 어렵게 만드는 것입니다. [jQuery] (http://learn.jquery.com)를 확인하십시오./about-jquery/how-jquery-works /). – uptownnickbrown

관련 문제