.nextAll函数在单击函数中使用时不起作用

时间:2012-07-11 05:58:06

标签: javascript jquery

我试图在模式窗口中列出的复选框内使用jquery中的.nextAll选项..所以当用户点击链接并且模态窗口打开时,通过函数.on(“click”),那就是当chexkbox出现时,我在click函数中写了一个代码,它改变了复选框的check prop。

$('input[name="Company"],input[name="Country"]').live("click",function(){

if ($(this).is(':checked')){
    alert("s");
      $(this).nextAll('input[name="'+this.name+'Sub"]').prop('checked',true);
} else {
       alert("n");
      $(this).nextAll('input[name="'+this.name+'Sub"]').prop('checked',false);   
}
});

 <input type="checkbox" class="entityCheckboxHeader1" id="entityCheckboxHeader" name="Company">Company
 <input class="modalEntityCompany" id="entity1" type="checkbox" name="CompanySub">Microsoft
 <input class="modalEntityCompany" id="entity2" type="checkbox" name="CompanySub">Apple
<br /> 
<input type="checkbox" class="entityCheckboxHeader2" id="entityCheckboxHeader" name="Country">Country
 <input class="modalEntity" id="entity3" type="checkbox" name="CountrySub">USA
 <input class="modalEntity" id="entity4" type="checkbox" name="CountrySub">UK

当我在jsfiddle中或在我们创建的新html中尝试时,该程序可以正常工作,但是当它在我创建的单击函数中使用时,它不会出现问题。什么可能导致冲突?

注意:我使用.live()函数作为复选框,因为当使用.on()时它甚至不会进入.nextAll部分

DYNAMIC CREATION PART

function generateTreeHTML(input) {

var html = '';
var entityNumber = 1;
var color = 663399;
html = "<ul id='tree' class='treeview-black' >";
for ( var m = 0; m < input.length; m++) {


        html+="<li>";

    currentEntity = input[m];

    currentEntityType = currentEntity.entity;

    html += "<span style='font-size:12px;  font-family:Helvetica; font-weight:bold;' id='entityHeader' class='entityHeader"
            + getEntityHeader()
            + "'><input name='" + currentEntityType +"' type='checkbox' id='entityCheckboxHeader' class=\""
            + 'entityCheckboxHeader'
            + getEntityCheckboxHeader()
            + "\" />"
            + currentEntityType
            + "</span><div style='width:15px; height:10px; background-color:#"
            + colorArray[entityNumber]
            + "; float:right; margin-right:50px; margin-top:5px;'></div>";
            html+="<ul>";
    for ( var n = 0; n < currentEntity[currentEntityType].length; n++) {
        html += "<li>";
        var entityName = currentEntity[currentEntityType][n].entity;
        var entityName1 = entityName.split('.').join("");
        entityName1 = entityName1.split('_').join("");
        entityName1 = entityName1.replace(/ /g, "");
        html += "<span><input type='checkbox' key=\"" + entityName
                + "\" mapKey=\"" + currentEntityType
                + "\" categoryNumber=\"" + entityNumber
                + "\" class='modalEntity' id=\"" + 'entity' + getEntityID()
                + "\" name='" + currentEntityType +  "Sub'>" + entityName + "</span>";

        html += "</li>";

    }

    html+="</ul></li>";
    entityNumber = entityNumber + 1;
    html += "<div style='width:200px; border-bottom:1px solid #cccccc; height:1px;'></div>";
}
html += "</ul>";
return html;
    }

2 个答案:

答案 0 :(得分:1)

.nextAll() method只能找到下一个兄弟元素(如doco中所述)。您动态创建的结构似乎将相关的复选框分别放在不同li元素中的各自的跨度中 - 即,它们是不是彼此的兄弟姐妹或者您的单击处理程序所属的标题复选框。您不能指望您使用的遍历方法找到适用于不同html结构的元素,而不仅仅是从我的办公室到我家的行车路线都可以到达您家。

请改为尝试:

$('input[name="Company"],input[name="Country"]').live("click",function(){    
   if ($(this).is(':checked')){
      alert("s");
      $('input[name="'+this.name+'Sub"]').prop('checked',true);
   } else {
       alert("n");
      $('input[name="'+this.name+'Sub"]').prop('checked',false);   
   }
});

可以大大简化为:

$('input[name="Company"],input[name="Country"]').live("click",function(){    
      $('input[name="'+this.name+'Sub"]').prop('checked',this.checked);    
});

或者,如果您担心文档中的其他位置可能存在其他同名复选框,则您可以看到所单击的标题框所属的同一个li元素:

$(this).closest('li')
       .find('input[name="'+this.name+'Sub"]').prop('checked',this.checked); 

答案 1 :(得分:0)

向复选框checkinput

提供课程input[name="Company"] and input[name="Country"]"
$('body').delegate(".checkinput","click",function(){

    if ($(this).is(':checked')){
        alert("s");
          $(this).nextAll('input[name="'+$(this).attr('name')+'Sub"]').prop('checked',true);
    } else {
           alert("n");
          $(this).nextAll('input[name="'+$(this).attr('name')+'Sub"]').prop('checked',false);   
    }
    });