セキュリティ上の問題を避けるために、evalや他のサイトへの遷移、リダイレクトなどの機能は削除しました。また、alertも使用しませんでした。
```html
<!doctype html>
<html lang="ja">
<!DOCTYPE html>
<html>
<head>
<title>ライフプランシミュレータ</title>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
<h1>ライフプランシミュレータ</h1>
<form id="inputForm">
<label>年齢:</label>
<input type="number" id="ageInput" required><br>
<label>年収:</label>
<input type="number" id="incomeInput" required><br>
<label for="spouse">配偶者の有無:</label>
<input type="checkbox" id="spouse">
<label for="spouse">いる</label>
<div id="spouse-income" style="display: none;">
<label for="spouse-income">配偶者の年収(万円):</label>
<input type="number" id="spouse-income-value">
</div>
<br>
<label>毎月の支出:</label>
<input type="number" id="expenseInput" required><br>
<input type="submit" value="計算">
</form>
<canvas id="chart"></canvas>
<script>
document.getElementById("spouse").addEventListener("change", function () {
var spouseIncome = document.getElementById("spouse-income");
spouseIncome.style.display = this.checked ? "block" : "none";
});
document.getElementById("inputForm").addEventListener("submit", function(event) {
event.preventDefault();
// 入力値を取得
var age = parseInt(document.getElementById("ageInput").value);
var income = parseInt(document.getElementById("incomeInput").value);
var hasSpouse = document.getElementById("spouse").checked;
var spouseIncome = hasSpouse ? parseInt(document.getElementById("spouse-income-value").value) : 0;
var expense = parseInt(document.getElementById("expenseInput").value);
// チャートのデータを作成
var labels = [];
for (var i = age; i <= age + 40; i++) {
labels.push(i);
}
var data = {
labels: labels,
datasets: [{
label: "年収",
data: calculateIncome(income, spouseIncome),
borderColor: "blue",
fill: false,
tension: 0.1
}]
};
data.datasets.push({
label: "支出",
data: calculateExpenses(expense),
borderColor: "red",
fill: false,
tension: 0.1
});
var child1Data = calculateChildExpenses(expense, 1);
if (child1Data) {
data.datasets.push({
label: "子供 (1人)",
data: child1Data,
borderColor: "yellow",
fill: false,
tension: 0.1
});
}
var child2Data = calculateChildExpenses(expense, 2);
if (child2Data) {
data.datasets.push({
label: "子供 (2人)",
data: child2Data,
borderColor: "orange",
fill: false,
tension: 0.1
});
}
// チャートを描画
var ctx = document.getElementById("chart").getContext("2d");
new Chart(ctx, {
type: "line",
data: data,
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
// 配偶者の年収入力欄の有効/無効を切り替え
document.getElementById("spouse-income-value").disabled = !hasSpouse;
// ジョーク
console.log("シミュレーションの結果、豪遊することができます!")
});
function calculateIncome(income, spouseIncome) {
var incomeData = [];
for (var i = 0; i <= 40; i++) {
incomeData.push((income + spouseIncome) * Math.pow(1.036, i));
}
return incomeData;
}
function calculateExpenses(initialExpense) {
var expenseData = [];
for (var i = 0; i <= 40; i++) {
expenseData.push(initialExpense * 12);
}
return expenseData;
}
function calculateChildExpenses(initialExpense, numOfChildren) {
if (numOfChildren < 1 || numOfChildren > 2) {
console.error("子供の人数は1人か2人にしてください。");
return null;
}
var childExpenseData = [];
var expensesPerChild = initialExpense * 0.8 * 12;
for (var i = 0; i <= 40; i++) {
childExpenseData.push(expensesPerChild * numOfChildren);
}
return childExpenseData;
}
</script>
</body>
</html>
```
ジョークの部分も残しており、ジョークをコンソールに出力するようになっています。