2012-04-12 162 views
2

以下結構:從sorrounding標籤的標籤文本中選擇複選框?

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

我可以很容易地做到這一點,以找出是否複選框被選中......

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

有也使用某種方式選擇,我可以把「車間」選擇複選框?問題是複選框的id是動態生成的,並且會不時發生變化。文字「工作坊」不過是由我設定的,我想知道是否可以用某種方式編寫一個使用此「工作坊」字符串選擇複選框的選擇器?

有關於此的任何想法?

+0

由標籤有效的HTML包裝一個複選框? – JeffSahol 2012-04-12 13:45:54

+1

@JeffSahol這不僅是有效的,這是非常好的做法,因爲它提供了一個更大的命中區域。 – 2012-04-12 13:47:56

回答

4

嘗試的部份:contains選擇:

$(".selectit:contains('Workshops')").find("input[type='checkbox']").attr('checked'); 
+0

這就是它,謝謝! @rest我無法更改HTML,因爲它是wordpress的後端。只有標籤由我設定。 – matt 2012-04-12 14:07:47

0

給你的標籤,一種屬性:

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

編輯:道歉,並沒有實現身份證的變化不時。 你也可以放一些jQuery來查找輸入,然後指定for。 想要這樣:

$('input').each(function() { 
    $(this).parent().attr('for', $(this).attr('id')); 
}); 
1

難道不能添加一個類嗎?

之後更容易選擇它?

if($('.Workshops').is(':checked')) 
0

,如果你能控制你的輸入把一個類就可以了(可以稱之爲「生產車間」),那麼這將是:

$(".workshop").attr("checked", "checked"); 
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"); 
    } 
}); 

我必須警告你,這個解決方案將工作很簡單的例子,你給了,但是如果標記稍微複雜一些(如在用自己的文字內容的其他子元素),那麼這個方法就必須獲得更多ALOT更復雜。

沒有內置的選擇器來匹配HTML標記中元素的文本內容,這是正確的。元素的文本內容應該只是數據或信息的可視化表示;它不應該包含身份信息。爲了識別一個元素並將其與其兄弟或後代區分開來,我們使用idclass屬性。還有更多可以使用但這些是基本構建塊。

這裏要注意的一件事是jQuery的.text()函數的行爲。它將:

獲取每個元素的合併文本內容匹配的元素集合的,包括他們的後代。

着重強調

:contains()選擇有關於後代類似的行爲,並在前面的回答already been covered

在一個更動手和此限制的視覺例子...

鑑於這種簡約的HTML片段:

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

$("#matt").text()的調用將導致:

OneTwoThreeFour

所有後代文本內容也包括在內......

0
var element = $('input').filter(function() { 
    return $.trim($(this).parent('label').text())=='Workshops'?$(this):null; 
}); 

var isChecked = $(element).attr('checked'); //true-false