在JavaScript中用前面的标签填充文本框
Fill textbox with preceding label in JavaScript
我试图用JavaScript制作一个表单填充器,它将从下面的代码中获取InputLabel字段的值,并将该值放入InputAnswer字段。
<div id="pi58741row2" class="regComponentRow">
<div id="piInputOption221812" class="regInputItem">
<div id="piInputLabel221812" class="inputLabel">
<font color="#C65E09">*</font>First Name
</div><div id="piInputAnswer221812" class="inputAnswer">
<input name="firstName" type="text" value="This is a test" maxlength="80" id="firstName" style="width:150px;">
</div>
</div>
</div>
我已经能够用下面的代码用我自己的文本填充字段,但该字段有时可能用于First Name以外的其他内容,所以我希望将标签放在字段中,而不是输入名称。
if (type == 'text') {
if (!inp.value) {
if (inp.name.indexOf('ame') != -1) {
inp.value = 'First Name';
}
}
}
如果您稍微格式化一下HTML,就更容易看到如何做到这一点:
<div id="pi58741row2" class="regComponentRow">
<div id="piInputOption221812" class="regInputItem">
<div id="piInputLabel221812" class="inputLabel">
<font color="#C65E09">*</font>First Name
</div>
<div id="piInputAnswer221812" class="inputAnswer">
<input name="firstName" type="text" value="This is a test" maxlength="80" id="firstName" style="width:150px;">
</div>
</div>
</div>
现在我们可以很容易地看到标签和字段周围的div是兄弟姐妹,并且input
在inputAnswer
div内。因此,如果我们选择所有inputAnswer
元素,我们可以从它们前面的inputLabel
中获得文本,并将其应用于里面的input
。
Array.prototype.forEach.call(document.querySelectorAll(".inputAnswer"), function(answer) {
var label = answer.previousElementSibling;
var input = answer.querySelector("input");
input.value = (label.innerText || label.textContent).trim();
});
生活例子:
Array.prototype.forEach.call(document.querySelectorAll(".inputAnswer"), function(answer) {
var label = answer.previousElementSibling;
var input = answer.querySelector("input");
input.value = (label.innerText || label.textContent).trim();
});
<div id="pi58741row2" class="regComponentRow">
<div id="piInputOption221812" class="regInputItem">
<div id="piInputLabel221812" class="inputLabel">
<font color="#C65E09">*</font>First Name
</div>
<div id="piInputAnswer221812" class="inputAnswer">
<input name="firstName" type="text" value="This is a test" maxlength="80" id="firstName" style="width:150px;">
</div>
</div>
</div>
<div id="pi58741row3" class="regComponentRow">
<div id="piInputOption221813" class="regInputItem">
<div id="piInputLabel221813" class="inputLabel">
<font color="#C65E09">*</font>Last Name
</div>
<div id="piInputAnswer221813" class="inputAnswer">
<input name="firstName" type="text" value="This is a test" maxlength="80" id="lastName" style="width:150px;">
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
关于这一点有几点注意:
- 正如你所看到的,我们使用
forEach
从数组,即使document.querySelectorAll
的返回值不是一个数组。它是类似数组的,这就足够了。像IE8这样的旧浏览器可能需要为forEach
添加shim/polyfill。 -
querySelectorAll
和querySelector
被所有现代浏览器支持,也包括IE8。我们允许浏览器使用innerText
或textContent
的可能性。它们很相似,但略有不同,有些浏览器支持其中一种,有些浏览器支持另一种,有些浏览器甚至两者都支持。对于我们正在做的事情,这并不重要,所以我们只是通过奇怪的强大的||
操作符来尝试这两种操作。 - 一些浏览器可能没有
String#trim
(我在最后使用)。不过,它可以很容易地上光/填充。
或者如果你正在使用jQuery,只是不记得标记:
$(".inputAnswer").each(function() {
var $this = $(this);
var $label = $this.prev(".inputLabel"); // Only if adjacent
var $input = $this.find("input");
$input.val($.trim($label.text()));
});
在浏览器的现代特性(querySelectorAll
, forEach
, String#trim
)下,在这种情况下,它并没有给我们带来太多的好处。
旁注:font
标签已经被弃用很多年了,你并没有把它用于它最初对任何人的意义。建议使用span
元素:
<span style="color: #C65E09">*</span>
或者更好:
<span class="flag">*</span>
…并在CSS中着色。
旁注2:标记输入的正确方法是使用label
元素,将它们与包含(将input
放在 label
内)或label
上的for
属性关联到input
上的id
。(如果你想要你的label
是一个块,像div
,你可以用CSS。)您可以考虑这样做:
<div id="pi58741row2" class="regComponentRow">
<div id="piInputOption221812" class="regInputItem">
<label for="firstName">
<span class="flag">*</span>First Name
</label>
<div id="piInputAnswer221812" class="inputAnswer">
<input name="firstName" type="text" value="This is a test" maxlength="80" id="firstName" style="width:150px;">
</div>
</div>
</div>
相关文章:
- JavaScript:如何用变量填充单选按钮值和标签
- 隐藏 DIV 标签,直到填充所有文本字段
- 使用 Javascript/Jquery 预填充表单字段和来自 URL 的标签
- (X-Editable)与(Select2标签)不工作,可以't填充当前标签并跟踪添加/删除的标签
- 轨道:填充表单中选择标签的输入
- 用 javascript 数组填充 struts2 select 标签
- 具有自动填充功能的标签和搜索系统
- HTML5 数据列表标签未在 Safari 中填充
- 为什么选择标签没有填充我的 ng 选项
- 用$ngresource承诺的 Angularjs 填充选择标签
- 为什么 jQuery 在使用样式标签填充 iframe 时会删除正文和头部标签,但不能没有样式标签
- 如何通过一个标签进行计数,并对每个标签应用+1rem填充
- gRaphael折线图:用JSON数据填充弹出标签而不是x&y坐标
- 为什么React会用最后一个键盘输入预先填充输入标签
- 重复一个函数调用7次,然后使用angularjs用返回值填充标签
- 在JavaScript中用前面的标签填充文本框
- 表格单元格中预填充的文本显示为“未定义”.当在JS中添加HTML标签时
- 标签重叠的预填充内容在物化
- 用javascript填充标签值.回发后代码中的标签为空
- 如何使选择选项标签填充与url的动作属性,使其可以打开该网站