2013-03-09 131 views
1

我想從複選框中選擇一個動態變量來禁用或啓用,取決於複選框的狀態。 HTML代碼:JQuery選擇動態變量

<input type="checkbox" name="only_once_1" id="only_once_1" class="onlyonce" > 
<input type="text" id="temp_1" name="temp_1"> 

JAVASCRIPT

$(".onlyonce").change(function($){ 
    var parts = this.name.match(/(\D+)(\d+)$/); 
    if(this.value == "on"){ 
     $("#"+"temp_"+parts[2]).disable() 
    }else{ 
     $("#"+"temp_"+parts[2]).enable() 
    } 
}); 

的想法是,我可能有這些框動態添加許多副本。任何想法如何讓這個工作?

謝謝!

+1

減少字符串連接的數量'#「+」temp _「+ parts [2]'to'」#temp _「+ parts [2 ]' – vol7ron 2013-03-09 21:46:36

+0

你可以進一步評論這個評論,並且'['#temp _',parts [2]]。join('')' – vol7ron 2013-03-23 05:49:31

回答

3

您有3個錯誤。這裏是工作代碼:

$(".onlyonce").change(function() { // <-- error #1: remove $ parameter 
    var parts = this.name.match(/(\D+)(\d+)$/); 
    if (this.checked) { // <-- error #2: use checked property 
     $("#" + "temp_" + parts[2]).prop('disabled', true) // <-- error #3: use prop method 
    } else { 
     $("#" + "temp_" + parts[2]).prop('disabled', false) 
    } 
}); 

http://jsfiddle.net/XR9me/

主要的問題是在這裏:$(".onlyonce").change(function($) {。通過將$作爲參數傳遞給change方法,您將覆蓋對jQuery的引用(在關閉$成爲事件對象內部)。

你也可以把它寫乾淨了一點:

$(".onlyonce").change(function() { 
    var parts = this.name.match(/(\D+)(\d+)$/); 
    $("#temp_" + parts[2]).prop('disabled', this.checked); 
}); 

http://jsfiddle.net/XR9me/1/

+0

不客氣 – dfsq 2013-03-09 21:51:44

1

如果你可以控制你的HTML結構,您可以:

$('.onlyonce').change(function(){ 
    $(this).next('input[type=text]').prop('disabled', this.checked); 
}); 

http://jsfiddle.net/vol7ron/XR9me/2/

+0

這也是一個很好的解決方案,如果我想要輸入所有類型的文本到被禁用。我特別希望選擇另一個不一定是文本的元素。不過謝謝,這是一個非常優雅的解決方案。 – Jon 2013-03-23 04:40:46

+0

@Jon:它不會對所有輸入起作用。它在複選框後面的下一個元素上起作用,僅當它是文本輸入時。如果下面的元素不是,它不會做任何事情。如果文本框出現在另一個元素之後,則要麼使用'siblings('input')。eq(0)'或'.nextAll('input')。eq(0)'。無論類型如何,它都會選擇多個輸入,'eq(0)'會給出結果集中的第一個;否則你將需要使用另一個選擇器。另外,你可能已經想出了'[type = text]'是可選的,它可以進一步過濾返回的元素。 – vol7ron 2013-03-23 05:56:46