2

以下结构:

<label class="selectit">
    <input value="3" type="checkbox" name="tax_input[event_type][]" id="in-event_type-3">
     Workshops
</label>

我可以很容易地找出复选框是否被选中……</p>

if ( $('#in-event_type-3').attr('checked') ) {

还有一些方法可以使用选择器,我可以在“研讨会”中选择复选框?问题是id复选框的 是动态生成的,并且不时更改。但是,label-text“Workshops”是由我设置的,我想知道我是否可以以某种方式编写一个使用此“Workshops”字符串来选择复选框的选择器?

有什么想法吗?

4

6 回答 6

6

尝试:contains选择器:

$(".selectit:contains('Workshops')").find(":checkbox").prop('checked');
于 2012-04-12T13:47:03.767 回答
1

给你的标签一个 for 属性:

<label class="selectit" for="in-event_type-3">

编辑:抱歉,没有意识到 ID 不时更改。你也可以放一些 jQuery 来查找输入,然后分配 for。像这样:

$('input').each( function() {
    $(this).parent().attr('for', $(this).attr('id') );
});
于 2012-04-12T13:48:54.493 回答
1

不能加类吗?

以后更容易选择了吗?

if($('.Workshops').is(':checked'))
于 2012-04-12T13:49:18.770 回答
0

如果您可以控制输入以在其上放置一个类(让我们称之为“研讨会”),那么它将是:

$(".workshop").attr("checked", "checked");
于 2012-04-12T13:54:02.110 回答
0

所以,其他人都说要使用课程——听他们说!这要容易得多!

但是,有时更改 HTML 内容根本不是一种选择。在这种情况下,我们将不得不求助于一些肮脏的工作并查看标签元素中包含的所有文本以找到相应的复选框。

var selectedCheckboxes = [];
$.each($("#container > label"),function(index,elem){
  var labelText = $(elem).text();
  var testString = "Workshops";
  if (labelText.match(testString)){
    selectedCheckboxes = $(elem).find("input[type='checkbox']:checked");
  }
});

我必须警告您,此解决方案适用于您提供的简单示例,但是如果标记稍微复杂一些(例如在具有自己的文本内容的附加子元素中),那么此方法将不得不变得更大并且更复杂.

没有内置的选择器来匹配 HTML 标记中元素的文本内容,这是正确的。元素的文本内容应该只是数据或信息的可视化表示;它不应该包含身份信息。为了识别一个元素和集合与其兄弟或后代分开,我们使用idclass属性。还有更多可以使用的,但这些是基本的构建块。

这里要注意的一件事是 jQuery.text()函数的行为。它会 :

获取匹配元素集中每个元素的组合文本内容,包括它们的后代。

强调添加

选择:contains()器对于后代具有类似的行为,并且已经在之前的答案中介绍过。

关于这个限制的更实际和更直观的例子......

鉴于这个简约的 HTML 片段:

<div id="matt">
  One
  <span>Two</span>
  <div> 
     <label>Three</label>
  </div>
  Four
</div>

调用$("#matt").text()将导致:

一二三四

还包括所有后代文本内容...

于 2012-04-12T14:03:10.277 回答
0
var element = $('input').filter(function() {
    return $.trim($(this).parent('label').text())=='Workshops'?$(this):null;
});

var isChecked = $(element).attr('checked'); //true-false
于 2012-04-12T14:13:21.860 回答