我正在尝试创建一个自定义jQuery选择器,它将focus()放在输入文本字段上,其标签文本由用户提供。
很简单,我拿用户提供的文字,搜索所有标签的文本节点,得到匹配标签的'for'属性值,并用它作为id来获取输入元素。
我的问题是我无法访问文本节点,因为在堆栈中传递的节点是除文本节点之外的所有内容。我检查了标签的子元素,并在firebug中显示为null。
以下是代码的部分内容:
$.expr[':'].findipfromlabel = function(obj, index, meta, stack) {
if($(obj).find("label").text() == meta[3]) {
var forattr = $(obj).attr('for');
}
return ($(input).attr('id' == forattr));
};
$(document).ready(function() {
$(': findipfromlabel(Male)').focus();
});
在上面,存在标签元素,但该标签没有子元素。有下一个兄弟,但如果我知道文本节点值等于用户输入的内容,如何确认使用标签? HTML是:
<form>
<label for="v">test</label>
<input type="text" name="v" id="v" /><br/>
<label for="male">Male</label>
<input type="text" name="m" id="male" />
<br />
<label for="fe">Female</label>
<input type="text" name="f" id="fe" />
</form>
答案 0 :(得分:2)
你有点错误的方式..搜索合适的标签然后获取id会更有效率 - 就像这样:
var id = $('label:contains(Male)').attr('for');
if (id)
$('#' + id).focus ();
答案 1 :(得分:1)
我看到两个一个问题 s :首先,“forattr”变量是在if块的范围内定义的,所以它不是可用于您的退货声明。第二,你的return语句返回页面上最后一个输入的“true”属性的值,这可能不是你想要的。
尝试这样的事情:
$.expr[':'].findipfromlabel = function(obj, index, meta, stack)
{
if($(obj).find("label").text() == meta[3])
{
return $('input#' + $(obj).attr('for'));
}
return null;
};
击> <击> 撞击>
编辑:删除了有关JavaScript范围规则的错误假设。
编辑:这次真的有效:
好的,我想我现在已经确定了。这对于自定义表达式专家来说是显而易见的,但实际上我刚刚学会了如何编写它们。关键是如果“obj”是您正在寻找的节点(即输入),则应该返回true,否则返回false。这适用于我的测试页面:
$.expr[':'].findipfromlabel = function(obj, index, meta, stack)
{
var label = $('label').filter( function() { return $(this).text() == meta[3]; } );
if( label.length > 0 )
{
return $(obj).attr('id') == label.attr('for');
}
return false;
};