假设我有一个html表单。每个input / select / textarea都有一个对应的<label>
,for
属性设置为其伴随的id。在这种情况下,我知道每个输入只有一个标签。
给定javascript中的输入元素 - 例如通过onkeyup事件 - 找到相关标签的最佳方法是什么?
答案 0 :(得分:97)
如果你正在使用jQuery,你可以做这样的事情
$('label[for="foo"]').hide ();
如果您不使用jQuery,则必须搜索标签。这是一个函数,它将元素作为参数并返回关联的标签
function findLableForControl(el) {
var idVal = el.id;
labels = document.getElementsByTagName('label');
for( var i = 0; i < labels.length; i++ ) {
if (labels[i].htmlFor == idVal)
return labels[i];
}
}
答案 1 :(得分:74)
首先,扫描页面中的标签,并从实际表单元素中分配对标签的引用:
var labels = document.getElementsByTagName('LABEL');
for (var i = 0; i < labels.length; i++) {
if (labels[i].htmlFor != '') {
var elem = document.getElementById(labels[i].htmlFor);
if (elem)
elem.label = labels[i];
}
}
然后,你可以去:
document.getElementById('MyFormElem').label.innerHTML = 'Look ma this works!';
不需要查找数组:)
答案 2 :(得分:23)
HTML5 standard中有一个labels
属性,指向与输入元素关联的标签。
所以你可以使用这样的东西(支持原生的labels
属性,但如果浏览器不支持它,可以使用回退来检索标签)...
var getLabelsForInputElement = function(element) {
var labels = [];
var id = element.id;
if (element.labels) {
return element.labels;
}
id && Array.prototype.push
.apply(labels, document.querySelector("label[for='" + id + "']"));
while (element = element.parentNode) {
if (element.tagName.toLowerCase() == "label") {
labels.push(element);
}
}
return labels;
};
// ES6
var getLabelsForInputElement = (element) => {
let labels;
let id = element.id;
if (element.labels) {
return element.labels;
}
if (id) {
labels = Array.from(document.querySelector(`label[for='${id}']`)));
}
while (element = element.parentNode) {
if (element.tagName.toLowerCase() == "label") {
labels.push(element);
}
}
return labels;
};
如果你使用jQuery会更容易......
var getLabelsForInputElement = function(element) {
var labels = $();
var id = element.id;
if (element.labels) {
return element.labels;
}
id && (labels = $("label[for='" + id + "']")));
labels = labels.add($(element).parents("label"));
return labels;
};
答案 3 :(得分:21)
我有点惊讶,似乎没有人知道你要做perfectly allowed:
<label>Put your stuff here: <input value="Stuff"></label>
任何建议的答案都不会被提取,但将正确标记输入。
以下是一些考虑到这种情况的代码:
$.fn.getLabels = function() {
return this.map(function() {
var labels = $(this).parents('label');
if (this.id) {
labels.add('label[for="' + this.id + '"]');
}
return labels.get();
});
};
用法:
$('#myfancyinput').getLabels();
一些注意事项:
aria-labelledby
之类的东西(作为练习留给读者)。答案 4 :(得分:14)
...早些时候
var labels = document.getElementsByTagName("LABEL"),
lookup = {},
i, label;
for (i = 0; i < labels.length; i++) {
label = labels[i];
if (document.getElementById(label.htmlFor)) {
lookup[label.htmlFor] = label;
}
}
...后来
var myLabel = lookup[myInput.id];
Snarky评论:是的,您也可以使用JQuery。 : - )
答案 5 :(得分:8)
使用jquery你可以做类似
的事情var nameOfLabel = someInput.attr('id');
var label = $("label[for='" + nameOfLabel + "']");
答案 6 :(得分:6)
document.querySelector(&#34; label [for =&#34; + vHtmlInputElement.id +&#34;]&#34;);
这以最简单和最简洁的方式回答了这个问题。 这使用vanilla javascript并适用于所有主流适当的浏览器。
答案 7 :(得分:4)
如果你愿意使用querySelector(你可以,甚至可以使用IE9,有时甚至是IE8!),另一种方法也可行。
如果您的表单字段有ID,并且您使用标签的for
属性,那么在现代JavaScript中这变得非常简单:
var form = document.querySelector('.sample-form');
var formFields = form.querySelectorAll('.form-field');
[].forEach.call(formFields, function (formField) {
var inputId = formField.id;
var label = form.querySelector('label[for=' + inputId + ']');
console.log(label.textContent);
});
有些人注意到多个标签;如果它们对for
属性使用相同的值,则只需使用querySelectorAll
代替querySelector
并循环以获取所需内容。
答案 8 :(得分:2)
$("label[for='inputId']").text()
这帮助我使用其ID获取输入元素的标签。
答案 9 :(得分:2)
Gijs的回答对我来说最有价值,但遗憾的是扩展无效。
这是一个有效的重写扩展,它可以帮助某人:
jQuery.fn.getLabels = function () {
return this.map(function () {
var parentLabels = $(this).parents('label').get();
var associatedLabels = this.id ? associatedLabels = $("label[for='" + this.id + "']").get() : [];
return parentLabels.concat(associatedLabels);
});
};
答案 10 :(得分:1)
在表单中添加id实际上要容易得多,例如:
<label for="firstName" id="firstNameLabel">FirstName:</label>
<input type="text" id="firstName" name="firstName" class="input_Field"
pattern="^[a-zA-Z\s\-]{2,25}$" maxlength="25"
title="Alphabetic, Space, Dash Only, 2-25 Characters Long"
autocomplete="on" required
/>
然后,你可以简单地使用这样的东西:
if (myvariableforpagelang == 'es') {
// set field label to spanish
document.getElementById("firstNameLabel").innerHTML = "Primer Nombre:";
// set field tooltip (title to spanish
document.getElementById("firstName").title = "Alfabética, espacio, guión Sólo, 2-25 caracteres de longitud";
}
javascript必须在body onload函数中才能工作。
只是一个想法,对我来说很漂亮。
答案 11 :(得分:1)
正如已经提到的那样,(目前)评价最高的答案没有考虑在标签内嵌入输入的可能性。
由于没有人发布过无JQuery的答案,这是我的:
var labels = form.getElementsByTagName ('label');
var input_label = {};
for (var i = 0 ; i != labels.length ; i++)
{
var label = labels[i];
var input = label.htmlFor
? document.getElementById(label.htmlFor)
: label.getElementsByTagName('input')[0];
input_label[input.outerHTML] =
(label.innerText || label.textContent); // innerText for IE8-
}
在此示例中,为简单起见,查找表由输入HTML元素直接索引。这几乎没有效率,你可以随意调整它。
如果您想同时获取多个表单的标签,可以使用表单作为基本元素,也可以使用整个文档。
不对不正确的HTML(标签内多个或缺少输入,缺少相应的htmlFor id的输入等)进行检查,但可以随意添加它们。
您可能希望修剪标签文本,因为当输入嵌入标签时,通常会出现尾随空格。
答案 12 :(得分:0)
使用JQuery选择器:
$("label[for="+inputElement.id+"]")
答案 13 :(得分:0)
对于未来的搜索者......以下是FlySwat接受的答案的jQuery-ified版本:
var labels = $("label");
for (var i = 0; i < labels.length; i++) {
var fieldId = labels[i].htmlFor;
if (fieldId != "") {
var elem = $("#" + fieldId);
if (elem.length != 0) {
elem.data("label", $(labels[i]));
}
}
}
使用:
$("#myFormElemId").data("label").css("border","3px solid red");
答案 14 :(得分:0)
您是否尝试过使用document.getElementbyID('id'),其中id是标签的ID,或者是您不知道要查找哪一个的情况
答案 15 :(得分:0)
我知道这已经过时了,但是我遇到了一些解决方案的麻烦并将它拼凑在一起。我在Windows(Chrome,Firefox和MSIE)和OS X(Chrome和Safari)上测试了这一点,并相信这是最简单的解决方案。它适用于这三种附加标签的方式。
<label><input type="checkbox" class="c123" id="cb1" name="item1">item1</label>
<input type="checkbox" class="c123" id="cb2" name="item2">item2</input>
<input type="checkbox" class="c123" id="cb3" name="item3"><label for="cb3">item3</label>
使用jQuery:
$(".c123").click(function() {
$cb = $(this);
$lb = $(this).parent();
alert( $cb.attr('id') + ' = ' + $lb.text() );
});
我的JSFiddle:http://jsfiddle.net/pnosko/6PQCw/
答案 16 :(得分:0)
我已经满足了自己的需要,对某些人有用:JSFIDDLE
$("input").each(function () {
if ($.trim($(this).prev('label').text()) != "") {
console.log("\nprev>children:");
console.log($.trim($(this).prev('label').text()));
} else {
if ($.trim($(this).parent('label').text()) != "") {
console.log("\nparent>children:");
console.log($.trim($(this).parent('label').text()));
} else {
if ($.trim($(this).parent().prev('label').text()) != "") {
console.log("\nparent>prev>children:");
console.log($.trim($(this).parent().prev('label').text()));
} else {
console.log("NOTFOUND! So set your own condition now");
}
}
}
});
答案 17 :(得分:0)
我有点惊讶没有人建议使用CSS关系方法?
在样式表中,您可以从元素选择器引用标签:
var yourVariable= getUrlParameter("rf");
如果复选框的ID为“XXX” 那么标签可以通过jQuery找到:
<style>
//for input element with class 'YYY'
input.YYY + label {}
</style>
您还可以应用.find('+ label')从jQuery复选框元素返回标签,即在循环时很有用:
$('#XXX + label');
答案 18 :(得分:0)
所有其他答案非常过时!!
您所要做的就是:
input.labels
HTML5已经被所有主流浏览器支持多年。绝对没有理由你必须自己从头开始做这个或者填充它!简单地使用input.labels
就可以解决你所有的问题。
答案 19 :(得分:0)
一个非常简洁的解决方案,使用ES6功能,如解构和隐式返回,将其变成一个方便的一个班轮将是:
const getLabels = ({ labels, id }) => labels || document.querySelectorAll(`label[for=${id}]`)
或者只是获取一个标签,而不是NodeList:
const getFirstLabel = ({ labels, id }) => labels && labels[0] || document.querySelector(`label[for=${id}]`)
答案 20 :(得分:0)
最好的答案可以很好地解决问题,但在大多数情况下,遍历所有label
元素是过大且效率低的。
这是一种有效的功能,可获取与label
元素一起出现的input
:
function getLabelForInput(id)
{
var el = document.getElementById(id);
if (!el)
return null;
var elPrev = el.previousElementSibling;
var elNext = el.nextElementSibling;
while (elPrev || elNext)
{
if (elPrev)
{
if (elPrev.htmlFor === id)
return elPrev;
elPrev = elPrev.previousElementSibling;
}
if (elNext)
{
if (elNext.htmlFor === id)
return elNext;
elNext = elNext.nextElementSibling;
}
}
return null;
}
对我来说,这一行代码就足够了:
el = document.getElementById(id).previousElementSibling;
在大多数情况下,label
会非常接近或接近输入,这意味着上述函数中的循环仅需要迭代很少的次数。