2017-06-19 85 views
0

我創建了一個函數,我不能用onclick返回。js函數不返回onclick

我敢肯定這是簡單的東西,我失蹤了。

HTML:

<html> 
<head> 
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script> 
<script type="text/javascript" src="schedule.js"></script> 
</head> 
<body> 

    <input type="button" onclick="computeSchedule();" value="Submit" /><br> 
    <p id="scheduleOutput"></p> 

</body> 
</html> 

JS:

function computeSchedule(loan_amount, interest_rate, payments_per_year, years, payment) { 
var schedule = []; 
var remaining = loan_amount; 
var number_of_payments = payments_per_year * years; 

for (var i=0; i<=number_of_payments; i++) { 
    var interest = remaining * (interest_rate/100/payments_per_year); 
    var principle = (payment-interest); 
    var row = [i, principle>0?principle:0, interest>0?interest:0, remaining>0?remaining:0]; 
    schedule.push(row); 
    remaining -= principle 
} 

return schedule; 
} 

var list = JSON.stringify(computeSchedule(100000, 0.005, 12, 15, 843.86), 0, 4) 

document.getElementById('scheduleOutput').innerHTML = list; 

我可以得到功能自動返回jsFiddle onload,但是當我改變JS設置"no wrap - in head"這是行不通的。我假設當我試圖在jsFiddle之外運行時,也發生了什麼?

+1

嘗試將'script'標記行移動到HTML底部,就在關閉'body'標記之前。 – glhrmv

+2

加載'schedule.js'文件時,JavaScript代碼立即運行,此時HTML不會被解析爲DOM(這就是爲什麼您通過'document.getElementById'獲得'undefined'的原因。 )。 嘗試將'schedule.js'的加載移動到''標記的底部(正好在''之前)。這正如在JS Fiddle中選擇「no wrap,in 」。 – Catalyst

+0

是的,它做到了。謝謝。知道這對某人來說很簡單。 –

回答

1

您sripts運行的主體內容已經準備就緒。這就是爲什麼document.getElementById似乎無法正常工作,因爲此時此類元素不存在。

嘗試來包裝你的代碼中簡單的「內容加載」偵聽器,以確保以後的所有元素都準備將運行:

document.addEventListener('DOMContentLoaded', function() { 
    function computeSchedule(loan_amount, interest_rate, payments_per_year, years, payment) { 
     var schedule = []; 
     var remaining = loan_amount; 
     var number_of_payments = payments_per_year * years; 

     for (var i=0; i<=number_of_payments; i++) { 
      var interest = remaining * (interest_rate/100/payments_per_year); 
      var principle = (payment-interest); 
      var row = [i, principle>0?principle:0, interest>0?interest:0, remaining>0?remaining:0]; 
      schedule.push(row); 
      remaining -= principle 
     } 

     return schedule; 
    } 

    var list = JSON.stringify(computeSchedule(100000, 0.005, 12, 15, 843.86), 0, 4) 

    document.getElementById('scheduleOutput').innerHTML = list; 
}); 

是的,你的onclick現在沒有數據傳遞到功能。所以,你也需要傳遞params,並且一切都應該正常工作。

+0

是的,但我試圖更進一步,並在函數中使用變量。基本上我試圖創建的是抵押貸款計算器,用戶輸入貸款金額(100000),費率(0.005),年(15)。然後我從另一個函數計算每月支付(843.86)並將其返回給html。以前的函數運行後,如何在按鈕單擊時運行computeSchedule函數的任何想法?謝謝 –

+0

例如:https://fiddle.jshell.net/a62a1ra0/5/ –

0

當您點擊按鈕時,函數computeSchedule()正在觸發,但沒有值被傳遞給它。我敢打賭,如果你把價值放在html行的參數上,它會起作用。前

<input type="button" onclick="computeSchedule(100000, 0.005, 12, 15, 843.86);" value="Submit" />