自定义jQuery Selector方法不捕获文本节点

时间:2009-12-10 04:50:51

标签: jquery

我正在尝试创建一个自定义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>

2 个答案:

答案 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;
};