您不需要知道索引值,只要您提供的结构是一致的。
$('textarea').on('keyup',function(){
if(this.value.length > 0){
$(this).prev().prop('checked',true);
} else {
$(this).prev().prop('checked',false);
}
});
您可以根据需要对此进行优化,但只要您要激活的复选框在更改文本框值的复选框之前,您就可以只使用.prev()
.
编辑
所以看起来你每行都有一个复选框cx[]
,你想检查是否有任何文本框值从它们的原始值改变?像这样的东西怎么样:
$('textarea').on({
focus:function(){
$(this).data('curval',this.value);
},
'blur keyup':function(){
if(this.value !== $(this).data('curval')){
$(this).prevAll('input[type="checkbox"]').prop('checked',true);
}
}
});
该focus
函数将在聚焦时存储 textarea 的现有值,然后在模糊或键入时比较该值(模糊是为了防止有人通过鼠标复制/粘贴)。如果它发生了变化,那么它会在同一级别的 DOM 树中循环返回,直到到达复选框并选中它。
缺少“取消选中它”是因为实现起来变得无限复杂......即使您“将其更改回”,它也是对先前值的更改,因此将是一个更改。另一个注意事项是,我基于它是唯一复选框的假设做了选择器......如果你有其他选择器,你会根据名称选择一个选择器,比如.prevAll('[name="cx[]"]')
.
希望这是您正在寻找的。
编辑 2
原来我过于简单化了.......prevAll()
行不通,因为你需要检查父母,然后是以前的孩子。我把它改成这样:
$(".tx").on({
focus:function(){
$(this).data('curval',this.value);
},
'blur keyup':function(){
if(this.value !== $(this).data('curval')){
var val = this.value;
$(this).data('curval',val).parents('tr').find('.cx').prop('checked',true);
}
}
});
这行得通。它将新值分配给curval
,然后搜索行的父行 ( tr
),并找到复选框。我无法根据涉及名称的选择器使其工作(无论如何,这非常低效,你应该避免像瘟疫一样的属性选择器),所以我只给出了适当的项目类。这是一个更干净的选择器。
这是更新的 jsFiddle。