javascript - Javascript生成的输入字段未发布
问题描述
我正在构建一个表单,其中 JavaScript 允许字段重复与输入到第一个表单输入字段中的数字相等的次数,例如第一个乘客的名字、第一个乘客的姓氏、第二个乘客的名字、第二个乘客的姓氏等。一旦提交按钮是按下表格被发送到下一页。该表单包含从前一页发布的隐藏字段。这些隐藏字段以正确的值发布,这使我相信表单生成代码中存在逻辑错误。在表单发布到的页面上,值是空白的,开发人员工具中的 HTML 代码读取value=""对于 nopass 字段。请注意,该代码没有给出任何语法错误,除了没有发布之外,它的行为与预期一样,出现正确数量的字段,并且在更新影响它的字段时正确更新成本文本。
代码:
HTML 表单
<form name="bookpassdet" id="bookpassdet" method="post" action="bookconf.php">
<fieldset>
<legend>Booking Reference no. <?php echo $bookref; ?></legend>
<label class="amtofpass" for="amountofpassengers">Amount of Passengers</label>
<input type="hidden" name="bookref" id="bookref" value="<?php echo $bookref?>">
<input type="hidden" name="fromob" id="fromob" value="<?php echo $from?>">
<input type="hidden" name="goingob" id="goingob" value="<?php echo $goingto?>">
<input type="hidden" name="monthob" id="monthob" value="<?php echo $month?>">
<input type="hidden" name="dayob" id="dayob" value="<?php echo $day?>">
<input type="text" name ="amountofpassengers" id="nopass">
<input type="checkbox" name="wheelchair" value="yes"> Wheelchair Required<br>
<div id="container"/>
</fieldset>
</form>
JavaScript 生成输入字段
function addPassengers(e){
var pasobj=document.getElementById('nopass').value;
var container = document.getElementById("container");
while (container.hasChildNodes()){
container.removeChild(container.lastChild);
}
for(var i =0;i<pasobj;i++){
container.appendChild(document.createTextNode("Passenger " + (i+1)+" Forename"));
var input = document.createElement("input");
input.type = "text";
input.id = ("pasforname"+i);
container.appendChild(input);
container.appendChild(document.createElement("br"));
container.appendChild(document.createTextNode("Passenger " + (i+1)+" Surname"));
var input = document.createElement("input");
input.type = "text";
input.id = ("passurname"+i);
container.appendChild(input);
container.appendChild(document.createElement("br"));
container.appendChild(document.createTextNode("Passenger " + (i+1)+" Age"));
var agearr = ["<2","3-10","11-16",">16"];
var selectlist = document.createElement("select");
selectlist.id=("myselect"+i);
selectlist.name="myselect";
container.appendChild(selectlist);
container.appendChild(document.createElement("br"));
for(var k =0; k<agearr.length; k++){
var option = document.createElement("option");
option.value = agearr[k];
option.text = agearr[k];
selectlist.appendChild(option);
}
var single_button = makeRadioButton(("journey"+i),"single","Single Journey",("single"+i));
var return_button = makeRadioButton(("journey"+i),"return","Return Journey",("return"+i));
container.appendChild(single_button);
container.appendChild(return_button);
container.appendChild(document.createElement("br"));
container.appendChild(document.createTextNode("Cost: "));
var text = document.createElement("p");
text.id = ("costp"+i);
container.appendChild(text);
container.appendChild(document.createElement("br"));
}
var submit =document.createElement("input");
submit.type = "submit";
submit.id="subbutton";
submit.value="test";
container.appendChild(submit);
//add event listener to each created element in a loop where
if(window.addEventListener) {
for(var m=0;m<pasobj;m++){
document.getElementById("myselect"+m).addEventListener("change",calculateCost,false);
document.getElementById("single"+m).addEventListener("change",calculateCost,false);
document.getElementById("return"+m).addEventListener("change",calculateCost,false);
}
document.getElementById("subbutton").addEventListener("click",submitForm,false);
} else if(window.attachEvent) {
for(var m=0; m<pasobj;m++){
document.getElementById("myselect"+m).addEventListener("change",calculateCost);
document.getElementById("single"+m).addEventListener("change",calculateCost);
document.getElementById("return"+m).addEventListener("change",calculateCost);
}
document.getElementById("subbutton").addEventListener("click",submitForm);
}
}
there are 3 other functions called makeRadioButton(name,value,text, id);
calculateCost(e);
prepareBookPassDet();
prepareBookPassDet 只是将 eventlistener 附加到 keyup 事件调用 addPassengers 函数的 nopass 表单字段
我试过什么:
我试图通过使用请求而不是发布来解决 php 方面的问题,但无济于事。
我能够将一个事件侦听器附加到提交按钮,该按钮创建一个弹出窗口,显示输入 nopass 的值并显示正确的值。
这与正在发布的隐藏字段相结合,使我相信以某种方式输入到字段中的值没有被提交,但表单是。
感谢您抽出时间来阅读。我对 Web 开发尤其是 JavaScript 缺乏经验,因此我希望能够以简单的术语解释任何解决方案,并且不包括框架,坚持基本的 php、html 和 javascript。再次感谢您。
解决方案
要与表单数据一起发送,输入元素需要有一个name
属性。在这个id
地方不生效。这是因为可以有多个相同的名称,例如在单选按钮上,但在 HTML 中只有唯一的 ID 是有效的。
在您的代码中:
var input = document.createElement("input");
input.type = "text";
input.id = 'pasforname'+i;
input.setAttrubute('name', 'pasforname'+i);
推荐阅读
- javascript - Javascript querySelectorAll on :visible 元素不是有效的选择器
- git - Git:比较两个存储库之间的差异
- reactjs - 如何使用 jest + 酶在接收 props 的页面上运行测试(使用 React Router)
- c# - Unity Animator - 空闲状态将我的角色移回起始位置
- r - R包下载CMIP6数据
- javascript - 如何显示我的价值?使用 document.getElementById
- matrix - GNU Octave 加载稀疏矩阵
- javascript - 如果字段为空,$addToSet 如何工作?
- arrays - 拆分字符串并将单词放入数组中
- scala - 使用 s3 jar 时的 Livy 超时