2017-08-03 143 views
0

我正試圖在JavaScript中做簡單的計算器。我的代碼遠非完美,但現在我只想修復錯誤。 首先我想不通,如何阻止運營商傳播。我的意思是,例如,我點擊1 + 1 =一切正常,我得到正確的結果。 問題是,當我多次點擊操作員時,我可以添加很多。如何在點擊後禁用/停止運營商。我嘗試了不同的方法:數按鈕點擊,爲每個數字和運算符添加,但無濟於事。簡單的計算器 - 如何在一次點擊後停止按鈕點擊

還有就是HTML代碼:

<!doctype html> 
<html lang="en"> 

<head> 
    <meta charset="UTF-8"> 
    <title>EASY Calculator</title> 
    <link rel="stylesheet" href="css/calculator.css"> 
</head> 

<body> 
    <script src="js/calculator.js"></script> 
</body> 
</html> 

JavaScript代碼:

// creating wrapper for all div's and append to HTML body tag 
var myWraper = document.createElement('div'); 
myWraper.id = 'container'; 
document.body.appendChild(myWraper); 

//function creating div's for calculator and buttons 
function divCalc(divClass, btnInnerHTML) { 
    var div = document.createElement('div'); 
    div.className = divClass; 
    div.innerHTML = btnInnerHTML; 
    return div; 
} 
// array of calclulator div's 
var rowsCalc = [ 
    divCalc('row1', '<button class="btnDel">Del</button><button class="btnOper" value="%">%</button><button class="btnOper" value="+">+</button>'), 
    divCalc('row2', '<button class="btnNum" value="7">7</button><button class="btnNum" value="8">8</button><button class="btnNum" value="9">9</button><button class="btnOper" value="-">-</button>'), 
    divCalc('row3', '<button class="btnNum" value="4">4</button><button class="btnNum" value="5">5</button><button class="btnNum" value="6">6</button><button class="btnOper" value="*">*</button>'), 
    divCalc('row4', '<button class="btnNum" value="1">1</button><button class="btnNum" value="2">2</button><button class="btnNum" value="3">3</button><button class="btnOper" value="/">/</button>'), 
    divCalc('row5', '<button class="btnNum" value="0">0</button><button class="btnNum" value=".">.</button><button class="btnEql" value="=">=</button>') 
]; 

//function creating div's for page 
function divPage(divID) { 
    var div = document.createElement('div'); 
    div.id = divID; 
    return div; 
} 
// array of page div's 
var rowsPage = [ 
    divPage('result'), 
    divPage('main') 
]; 

// using createDocumentFragment() method append all div's at once to page 
var docFragPage = document.createDocumentFragment(); 
for (var i = 0; i < rowsPage.length; i += 1) { 
    docFragPage.appendChild(rowsPage[i]); 
} 
myWraper.appendChild(docFragPage); // appends all div's at once to 'container' div 

// the same as above for calculator div's 
var docFragCalc = document.createDocumentFragment(); 
for (var i = 0; i < rowsCalc.length; i += 1) { 
    docFragCalc.appendChild(rowsCalc[i]); 
} 
rowsPage[1].appendChild(docFragCalc); // appends all div's at once to 'main' div 

//append event listener 
document.querySelector('#container').addEventListener('click', function(e) { 
    // event only triger when pressed on buttons 
    if (e.target.tagName === 'BUTTON') { 
     // variable for output 
     var output = document.querySelector('#result').innerHTML; 

     // trigered when 'Del' button is clicked 
     if (e.target.className === "btnDel") { 
      document.querySelector('#result').innerHTML = ''; 

     } 
     // trigered when numbers are clicked 
     if (e.target.className === 'btnNum') { 
      document.querySelector('#result').innerHTML += e.target.value; 
     } 
     // trigered when operators are clicked 
     if (e.target.className === 'btnOper') { 
      document.querySelector('#result').innerHTML += e.target.value; 
     } 
     // trigered when equality button is clicked 
     if (e.target.className === 'btnEql') { 
      document.querySelector('#result').innerHTML = eval(output); 
     } 
    } 
}, false); 
+0

禁用按鈕,直到其它按鈕被再次點擊? –

回答

0

最好w ^唉,要做的是檢查最後一個字符是什麼。如果是與點擊操作不同的操作,則將其替換爲新操作。如果它是平等的,則防止複製它。
試試這個:

var myWraper = document.createElement('div'); 
 
myWraper.id = 'container'; 
 
document.body.appendChild(myWraper); 
 

 
//function creating div's for calculator and buttons 
 
function divCalc(divClass, btnInnerHTML){ 
 
    var div = document.createElement('div');  
 
    div.className = divClass; 
 
    div.innerHTML = btnInnerHTML; 
 
    return div; 
 
} 
 
// array of calclulator div's 
 
var rowsCalc = [ 
 
    divCalc('row1', '<button class="btnDel">Del</button><button class="btnOper" value="%">%</button><button class="btnOper" value="+">+</button>'), 
 
    divCalc('row2', '<button class="btnNum" value="7">7</button><button class="btnNum" value="8">8</button><button class="btnNum" value="9">9</button><button class="btnOper" value="-">-</button>'), 
 
    divCalc('row3', '<button class="btnNum" value="4">4</button><button class="btnNum" value="5">5</button><button class="btnNum" value="6">6</button><button class="btnOper" value="*">*</button>'), 
 
    divCalc('row4', '<button class="btnNum" value="1">1</button><button class="btnNum" value="2">2</button><button class="btnNum" value="3">3</button><button class="btnOper" value="/">/</button>'), 
 
    divCalc('row5', '<button class="btnNum" value="0">0</button><button class="btnNum" value=".">.</button><button class="btnEql" value="=">=</button>') 
 
]; 
 

 
//function creating div's for page 
 
function divPage(divID){ 
 
    var div = document.createElement('div'); 
 
    div.id = divID; 
 
    return div; 
 
} 
 
// array of page div's 
 
var rowsPage = [ 
 
    divPage('result'), 
 
    divPage('main')  
 
]; 
 

 
// using createDocumentFragment() method append all div's at once to page 
 
var docFragPage = document.createDocumentFragment(); 
 
for(var i = 0; i < rowsPage.length; i +=1) { 
 
    docFragPage.appendChild(rowsPage[i]); 
 
} 
 
myWraper.appendChild(docFragPage); // appends all div's at once to 'container' div 
 

 
// the same as above for calculator div's 
 
var docFragCalc = document.createDocumentFragment(); 
 
for(var i = 0; i < rowsCalc.length; i +=1) { 
 
    docFragCalc.appendChild(rowsCalc[i]); 
 
} 
 
rowsPage[1].appendChild(docFragCalc); // appends all div's at once to 'main' div 
 

 
var disable = false; 
 

 
//append event listener 
 
document.querySelector('#container').addEventListener('click', function(e){ 
 
    // event only triger when pressed on buttons 
 
    if(e.target.tagName === 'BUTTON'){ 
 
     // variable for output 
 
     if(disable){ 
 
     document.querySelector('#result').innerHTML = ''; 
 
     disable = false; 
 
     } 
 
     var output = document.querySelector('#result').innerHTML;  
 

 
     // trigered when 'Del' button is clicked 
 
     if(e.target.className === "btnDel"){ 
 
      document.querySelector('#result').innerHTML = ''; 
 

 
     } 
 
     // trigered when numbers are clicked 
 
     if(e.target.className === 'btnNum'){   
 
      document.querySelector('#result').innerHTML += e.target.value;  
 
     } 
 
     // trigered when operators are clicked 
 
     if(e.target.className === 'btnOper'){ 
 
     //operations on a list 
 
     var charsToSearch = ["+","-","*","/","%"]; 
 
      //check what was the last char 
 
      var lastChar = document.querySelector('#result').innerHTML.slice(-1); 
 
      //if last char was a different operation, replace it with new 
 
      if(e.target.value != lastChar){ 
 
      if(charsToSearch.indexOf(lastChar) != -1){ 
 
       var str = document.querySelector('#result').innerHTML.slice(0, -1); 
 
       str = str + e.target.value; 
 
       document.querySelector('#result').innerHTML = str; 
 
       return; 
 
       }    
 
      } 
 
      switch(lastChar){ 
 
       case '+': 
 
       return; 
 
       case '-': 
 
       return; 
 
       case '*': 
 
       return; 
 
       case '/': 
 
       return; 
 
      } 
 
       document.querySelector('#result').innerHTML += e.target.value; 
 
     } 
 
     // trigered when equality button is clicked 
 
     if(e.target.className === 'btnEql'){ 
 
     
 
      document.querySelector('#result').innerHTML = eval(output); 
 
       disable = true; 
 
     } 
 
    } 
 
}, false);

+0

這是現貨!我不知道自己,我仍然是一名程序員: - /花了我一段時間才明白你所做的一切,沒有Chrome和Web開發工具,我就不會這樣做:-)我一步一步地將代碼轉化爲代碼。 – Martin

+0

還有一件事..我沒有得到那部分代碼: '//變量輸出 if(disable){0} {0} {0} disable = false; }' – Martin

+0

@MartinT這將檢查用戶的最後操作是否點擊'='按鈕。如果是,它清除所有的值,所以用戶不需要每次點擊'Del'來啓動一個新的操作。 –

1

試試這個:

var myWraper = document.createElement('div'); 
 
myWraper.id = 'container'; 
 
document.body.appendChild(myWraper); 
 

 
//function creating div's for calculator and buttons 
 
function divCalc(divClass, btnInnerHTML){ 
 
    var div = document.createElement('div');  
 
    div.className = divClass; 
 
    div.innerHTML = btnInnerHTML; 
 
    return div; 
 
} 
 
// array of calclulator div's 
 
var rowsCalc = [ 
 
    divCalc('row1', '<button class="btnDel">Del</button><button class="btnOper" value="%">%</button><button class="btnOper" value="+">+</button>'), 
 
    divCalc('row2', '<button class="btnNum" value="7">7</button><button class="btnNum" value="8">8</button><button class="btnNum" value="9">9</button><button class="btnOper" value="-">-</button>'), 
 
    divCalc('row3', '<button class="btnNum" value="4">4</button><button class="btnNum" value="5">5</button><button class="btnNum" value="6">6</button><button class="btnOper" value="*">*</button>'), 
 
    divCalc('row4', '<button class="btnNum" value="1">1</button><button class="btnNum" value="2">2</button><button class="btnNum" value="3">3</button><button class="btnOper" value="/">/</button>'), 
 
    divCalc('row5', '<button class="btnNum" value="0">0</button><button class="btnNum" value=".">.</button><button class="btnEql" value="=">=</button>') 
 
]; 
 

 
//function creating div's for page 
 
function divPage(divID){ 
 
    var div = document.createElement('div'); 
 
    div.id = divID; 
 
    return div; 
 
} 
 
// array of page div's 
 
var rowsPage = [ 
 
    divPage('result'), 
 
    divPage('main')  
 
]; 
 

 
// using createDocumentFragment() method append all div's at once to page 
 
var docFragPage = document.createDocumentFragment(); 
 
for(var i = 0; i < rowsPage.length; i +=1) { 
 
    docFragPage.appendChild(rowsPage[i]); 
 
} 
 
myWraper.appendChild(docFragPage); // appends all div's at once to 'container' div 
 

 
// the same as above for calculator div's 
 
var docFragCalc = document.createDocumentFragment(); 
 
for(var i = 0; i < rowsCalc.length; i +=1) { 
 
    docFragCalc.appendChild(rowsCalc[i]); 
 
} 
 
rowsPage[1].appendChild(docFragCalc); // appends all div's at once to 'main' div 
 

 
var disable = false; 
 

 
//append event listener 
 
document.querySelector('#container').addEventListener('click', function(e){ 
 
    // event only triger when pressed on buttons 
 
    if(e.target.tagName === 'BUTTON'){ 
 
    
 
     // variable for output 
 
    
 
     var output = document.querySelector('#result').innerHTML;  
 

 
     // trigered when 'Del' button is clicked 
 
     if(e.target.className === "btnDel"){ 
 
      document.querySelector('#result').innerHTML = ''; 
 

 
     } 
 
     // trigered when numbers are clicked 
 
     if(e.target.className === 'btnNum'){ 
 
     disable = false 
 
      document.querySelector('#result').innerHTML += e.target.value;  
 
     } 
 
     // trigered when operators are clicked 
 
     if(e.target.className === 'btnOper'){ 
 
     if(!disable){ 
 
      document.querySelector('#result').innerHTML += e.target.value; 
 
      disable = true; 
 
     } 
 
       
 
       
 
     } 
 
     // trigered when equality button is clicked 
 
     if(e.target.className === 'btnEql'){ 
 
      
 
      
 
      
 
      document.querySelector('#result').innerHTML = eval(output); 
 
    
 
     } 
 
    } 
 
}, false);

+0

如果您有任何疑問,請告知我。 – dawit

+0

剛剛測試過你的例子,它不起作用。 –

+0

哪個測試失敗了? – dawit