2013-03-09 107 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