【发布时间】:2017-05-17 06:35:07
【问题描述】:
在提供一堆代码之前,我想先了解一下我正在尝试做的事情是否可行。
我使用 HTML 和 JavaScript 创建了一个名为 PIG 的基于网络的骰子游戏版本。用户可以通过点击主页上的“设置”按钮来更改一些游戏的设置。这个按钮会弹出一个包含 HTML 表单 () 的模式窗口。我想使用用户在此表单上输入和提交的数据来更新游戏主页上的各种设置。
我选择使用 HTML5 表单是因为希望使用原生 HTML5 表单验证功能,而不是尝试自己使用 JavaScript 复制验证检查逻辑。
所以我的方法是使用 javascript 在提交时从表单中获取数据。我尝试了两种不同的方法来让它工作:
1) 在标签上使用“onsubmit=function getSettings()” 2) 使用带有 onclick="getSettings()" 的表单提交按钮。
通过这两种方法,我能够成功地从提交表单中获取所有值,并使用这些值使用 gettSettings() 函数成功填充主游戏页面,但是当我退出 getSettings() 函数时,网页我更新的值不会保持不变...无论我使用这两种方法中的哪一种,它们都会恢复为原始值。
我知道值已成功更新,因为当我在 getSettings() 方法的最后一条语句上设置断点时,我可以看到主页上的所有值都已更新以反映在表单...所以我知道我已成功获取所有数据并使用这些值更新主页。
我很困惑为什么我在网页上成功更改的值只是在退出 getSettings() 函数时恢复到原来的值。
也许不可能做我想做的事?如果不是,有没有人知道为什么,因为我可以看到值在恢复到原始值之前已成功更改。我错过了什么?
我再次使用表单并在提交时收集数据,以便我可以利用“原生”HTML5 表单验证功能。
问候。
***** 编辑以添加关键代码段 *******
这里是模态表单的代码 HTML 代码:
<form name="config-settings" onsubmit="getSettings()">
<!-- <form name="config-settings">-->
<span class="errMsg"></span>
<div class="row clearfix">
<div>
<label>Player 1:</label>
</div>
<div>
<input type="text" name="input-name-0" id="input-name-0" maxlength="10" placeholder="Enter name" pattern="^\S+$">
</div>
</div>
<div class="row clearfix">
<div>
<label>Player 2:</label>
</div>
<div>
<input type="text" name="input-name-1" id="input-name-1" maxlength="6" placeholder="Enter name" pattern="^\S+$">
</div>
</div>
<div class="row clearfix">
<div>
<label>Winning Score:</label>
</div>
<div>
<input type="number" name="winning-score" id="winning-score" default="100" placeholder="Enter winning score">
</div>
</div>
<div class="row clearfix">
<div>
<label>Number of Dice:</label>
</div>
<div>
<select name="diceValues" id="dice-value">
<option value=""> - Select - </option>
<option value="dice-1">One Dice</option>
<option value="dice-2">Two Dice</option>
</select>
</div>
</div>
<!-- Below is alt method I used to submit form..yields same results -->
<!-- <input type="submit" value="Submit" onclick="getSettings()">-->
<input type="submit" value="Submit">
</form>
这里是在 getSettings() 方法中定义和使用的全局变量:
// Global variables
var scores, roundScore, activePlayer, gamePlaying, gamesWonCount, playerNames, winningScore, numOfDice, matchScore, msgs;
var player0, player1, score;
var player0Field = document.getElementById('name-0');
var player1Field = document.getElementById('name-1');
var scoreField = document.getElementById('winScore');
这里是主网页上设置按钮的监听器,它会调出包含设置表单的设置模式窗口:
//*********************************************************
// Open Settings Modal Windows
//*********************************************************
document.querySelector('.btn-settings').addEventListener('click', function () {
// Settings can't be changed if game is actively underway
if (!gamePlaying || roundScore === 0) {
document.querySelector('#modal-settings').style.display = 'block';
} else {
// Make error message visible
msgs.style = 'block';
// Create message to indicate settings successfully updated
msgs.textContent = "Settings can't be updated during game";
msgs.style.backgroundColor = 'pink';
fadeOut(msgs);
}
});
这里是 getSettings() javaScript 函数(注意:这个函数中没有定义局部变量...它们都被定义为全局值(javaScript 应用程序的前几行)。
function getSettings() {
// Alternative call if I want this function to be called via eventListner
//document.querySelector('.btn-save').addEventListener('click', function () {
console.log("getSettings method called");
player0 = document.forms["config-settings"]["input-name-0"].value;
player1 = document.forms["config-settings"]["input-name-1"].value;
score = document.forms["config-settings"]["winning-score"].value;
// Reset msgs so they will be displayed each time
msgs.style = 'block';
playerNames[0] = player0;
player0Field.innerHTML = playerNames[0];
playerNames[1] = player1;
player1Field.textContent = playerNames[1];
// Set Winning score on UI to value on form
scoreField.textContent = score;
// numOfDice = document.getElementById('dice-value').value;
// Create message to indicate settings successfully updated
msgs.textContent = "Successfully updated settings";
msgs.style.backgroundColor = 'lightgreen';
fadeOut(msgs);
document.querySelector('#modal-settings').style.display = 'none';
}
【问题讨论】:
-
Nelutu,谢谢。作为回应,这里是我的 cmets:1)关于依赖 HTML 验证..这只是一个玩具应用程序,没有保存或发送关键信息,所以在这种情况下我不担心。 2) getSettings() - 只获取表单中输入的值并更新主页上的相关值。 3) 我只使用表单提交选项来利用 HTML5 验证..AFAIK 我必须提交表单才能利用它们。 4)我没有在 getSettings() 方法中使用任何局部变量。它们是全局变量,专门避免范围界定问题。干杯
-
Nelutu,仅供参考...在我发布我的代码之前,我也担心问题与范围相关,因此我通过将 getSettings() 方法中的所有局部变量的定义移至我的 javaScript 文件的开头......不幸的是,这并没有解决我的问题。也许仍然存在某种类型的范围界定问题,但如果是这样,我已经做了我知道要做的事情来消除这个问题......也许我需要做更多的事情?
标签: javascript html forms onclick onsubmit