选择后显示和隐藏表单的字段
Display and hide fields of a form after select
我有一个javascript函数,可以在选择后显示和隐藏div。div 包含表单的字段。div test2 包含div test1 的字段以及其他字段。所有字段均为必填项。
我有 2 个问题:
1) 当我显示 test2 并完成字段时,无法保存表单,因为在 test1 中找到 test2 中的某些字段。这意味着某些字段具有相同的名称。
2)所有字段都是必填的,这意味着即使我完成了test2中的字段,我仍然无法保存,因为test1中的字段没有完成和隐藏。如何创建代码结构以允许保存此内容?
function visibilite1(_this) {
var id = _this.value;
var divs = document.getElementsByTagName('div');
for(var no=0;no<divs.length;no++) {
if (divs[ no].className=='divs') {
'divs'
divs[ no].style.display = "none";
}
}
document.getElementById(id).style.display = "block";
}
<select name="role" id="role"
onchange="visibilite1(this);hide()" >
<option value='test1'>Year1</option>
<option value='test2'>Year2</option>
</select>
<div id="test1" class="divs">
<label>Name </label>
<input type="text" name= "name" id= "name" required> </br>
<label>User name </label>
<input type="text" name= "username" id= "username" required></br>
<label >Password <em>*</em></label>
<input type="password" name= "password" id= "password" required></br>
</div>
<div id="test2" class="divs">
<label>Name </label>
<input type="text" name= "name" id= "name" required>
<label>User name </label>
<input type="text" name= "username" id= "username" required>
<label>Password <em>*</em></label>
<input type="password" name= "password" id= "password" required>
<input type="text" name= "username" id= "username" required>
<label>Adress<em>*</em></label>
<input type="text" name= "adress" id= "adress" required>
<label>Client name</label>
<?php
$sql="select ClientName from claims_follow_up.Client where id
!='10001' order by ClientName asc ";
$req=mysqli_query($dbc,$sql) or die("Erreur d'execution");
?>
<select name="ClientName" id="ClientName"
onchange="
var maVal = document.getElementById('ClientName').value;
if (maVal == 'Create new client')
{
window.open('newClientCreate.php', 'blank', 'scrollbars=yes,
resizable=no, top=50, left=155, width=1200, height=700');
};activer()" required disabled="true" onkeypress="activerSubmit()">
<option value="">select client </option>
<?php
while($d=mysqli_fetch_array($req))
{
echo'<option
value="'.$d['ClientName'].'">'.$d['ClientName'].'</option>';
}
mysqli_free_result($req);
?>
<option value="Create new client" style="color:blue;
font-weight:bold">create new client</option>
</select>
</div>
正如您所发现的,html 页面中的元素永远不应该具有相同的 id,html 表单中的不同输入元素不应该具有相同的名称。
假设你想留在原版javascript的世界里,不想使用javascript框架(例如angular,ember),你可以通过设置元素的内部html来实现这一点。这样,"隐藏"html 就不会出现在 html 标记中。
像...
<script>
function hide () {
console.log("whatever")
}
function visibilite1(_this) {
var formgroup1 = '<div id="test1" class="divs"><label>Name </label><input type="text" name= "name" id= "name" required> </br><label>User name </label><input type="text" name= "username" id= "username" required></br><label >Password <em>*</em></label><input type="password" name= "password" id= "password" required></br></div>'
var formgroup2 = '<div id="test2" class="divs"><label>Name </label><input type="text" name= "name" id= "name" required><label>User name </label><input type="text" name= "username" id= "username" required><label>Password <em>*</em></label><input type="password" name= "password" id= "password" required><input type="text" name= "username" id= "username" required><label>Adress<em>*</em></label><input type="text" name= "adress" id= "adress" required></div>'
var formtestElement = document.getElementById('formtest');
if (_this.value == "test1") {
formtestElement.innerHTML = formgroup1
} else if (_this.value == "test2") {
formtestElement.innerHTML = formgroup2
};
}
</script>
<select name="role" id="role"
onchange="visibilite1(this);hide()" >
<option value='test1'>Year1</option>
<option value='test2'>Year2</option>
</select>
<div id="formtest">
<div id="test1" class="divs">
<label>Name </label>
<input type="text" name="name" id="name" required> </br>
<label>User name </label>
<input type="text" name="username" id="username" required></br>
<label>Password <em>*</em></label>
<input type="password" name="password" id="password" required></br>
</div>
</div>
更新:已编辑以默认显示 test1 表单。
另一种方法是克隆元素并在显示/隐藏时将正确的元素放入表单中。在窗口 onload 事件中,我将选择设置为所需的索引,然后克隆并保存元素,从表单中删除隐藏的元素。更改时,我删除了可见元素并添加了选定的元素。
var divsCloned = [];
function visibilite1(_this) {
if (divsCloned.length == 0) {
return;
}
var currDiv = document.getElementsByTagName('div')[0];
_this.parentNode.removeChild(currDiv);
_this.parentNode.insertBefore(divsCloned[_this.selectedIndex], _this.nextSibling);
}
window.onload = function() {
var divs = document.getElementsByTagName('div');
for (var no = 0; no < divs.length; no++) {
divsCloned.push(divs[no].cloneNode(true));
if (no != 0 && divs[no].parentNode) {
divs[no].parentNode.removeChild(divs[no]);
}
}
}
<form>
<select name="role" id="role"
onchange="visibilite1(this);">
<option value='test1'>Year1</option>
<option value='test2'>Year2</option>
</select>
<div id="test1" class="divs">
<label>Name </label>
<input type="text" name="name" id="name" required> </br>
<label>User name </label>
<input type="text" name="username" id="username" required></br>
<label>Password <em>*</em></label>
<input type="password" name="password" id="password" required></br>
</div>
<div id="test2" class="divs">
<label>Name </label>
<input type="text" name="name" id="name" required>
<label>User name </label>
<input type="text" name="username" id="username" required>
<label>Password <em>*</em></label>
<input type="password" name="password" id="password" required>
<input type="text" name="username" id="username" required>
<label>Adress<em>*</em></label>
<input type="text" name="adress" id="adress" required>
</div>
<input id="submit" type="submit" value="Submit">
</form>
第一件事不要为 2 个组件放置相同的 id,即使它在不同的div 中......第二个要获得您的结果,当您隐藏div 时,禁用与之对应的输入字段并在需要时重新启用它
第一反应是文档中的ID必须是唯一的! - 表单元素名称可以相同,但这意味着它们是组的一部分(即:在选项按钮集合中,只有一个可能的选择)。
最好使它们都保持唯一,否则您需要专门引用formName和elementName。
每当隐藏div 时,将其中的所有输入设置为禁用。禁用输入时,将忽略必需属性,并且禁用的输入不会随表单一起提交,因此后端不会发生名称冲突。
var inputs = divs[no].getElementsByTagName('input');
for (var x = 0, len = inputs.length; x < len; x++) {
inputs[x].disabled = true;
}
显然,当您取消隐藏div 时,您还需要遍历并重新启用该div 中的所有输入。
更新:下面是根据要求使用给定代码的示例。首先,JS:
function visibilite1(_this) {
var inputs;
var divToShow;
var id = _this.value;
var divs = document.getElementsByTagName('div');
for(var no=0;no<divs.length;no++) {
if (divs[no].className=='divs') {
divs[no].style.display = "none";
inputs = divs[no].getElementByTagName('input');
for (var x = 0, len = inputs.lenght; x < len; x++) {
inputs[x].disabled = true;
}
}
}
divToShow = document.getElementById(id);
divToShow.style.display = "block";
inputs = divToShow.getElementByTagName('input');
for (var x = 0, len = inputs.lenght; x < len; x++) {
inputs[x].disabled = false;
}
}
还有 HTML(减少了一点,但足以看到它应该是什么样子):
<select name="role" id="role" onchange="visibilite1(this);hide()" >
<option value='test1'>Year1</option>
<option value='test2'>Year2</option>
</select>
<div id="test1" class="divs">
<label>Name </label>
<input type="text" name= "name" required> </br>
<label>User name </label>
<input type="text" name= "username" required></br>
<label >Password <em>*</em></label>
<input type="password" name= "password" required></br>
</div>
<div id="test2" class="divs">
<label>Name </label>
<input type="text" name= "name" required>
<label>User name </label>
<input type="text" name= "username" required>
<label>Password <em>*</em></label>
<input type="password" name= "password" required>
<input type="text" name= "username" required>
<label>Adress<em>*</em></label>
<input type="text" name= "adress" required>
</div>
- 通过单击动态加载的表中同一行的另一个字段来更新一行的字段
- 添加和删除隐藏字段数组中的值,而不提交表单
- 单击鼠标,用MySQL数据填充html表单输入字段
- 带有条件字段的PHP表单
- 验证PDF表单中的字段
- HTML提交表单,同时包含空字段检查和按钮隐藏
- 在表单中的输入字段上提交事件
- 当所有输入文本字段都为空时,禁止表单提交,但当jquery中的任何字段不为空时允许提交
- 表单输入字段随着溢出的文本而增长
- 如何将onChange方法添加到ExtJS 4表单中的所有字段(textField)中
- 尝试使用名称访问表中字段的日期选取器时出现问题
- Javascript 表单 - 字段不是必需的
- 单击按钮时更改数据库表的字段值
- 数据表将字段值关联到按钮,而 ajax 填充表
- 返回数据表输入字段
- 更改附加表行字段jQuery的名称
- Angularjs表单/字段验证使用JavaScript函数,无需指令
- 仅在Firefox中,表脱离字段集边界
- 如何在表单提交后使用JQuery从附加到HTML表的字段中获取$_POST数组中的值
- 什么's提交表单后,从post数组中动态附加的表行字段中获取值的问题