2011-06-10 128 views
1

我有這樣的HTML代碼:HTML名稱不匹配

 <c:forEach items="${config.sources}" var="source" varStatus="sourceStatus"> 
      <form:checkbox path="sources[${sourceStatus.index}].selected" 
      label="${source.sourceName}" 
      name="${sourceStatus.index}" 
      onclick="toggle(this)"/> 
      <br /> 
      <c:forEach items="${source.feeds}" var="feed" varStatus="status"> 
       <c:if test="${feed.display == true }"> 
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
        <form:checkbox path="sources[${sourceStatus.index}].feeds[${status.index}].selected" name="${sourceStatus.index}"/> 
        <c:out value="${feed.name}" /> (provided by ${feed.provider}) 
       <br /> 
       </c:if> 
      </c:forEach> 
     </c:forEach> 

它的作用是讓一堆複選框,其中,如果「主」複選框變爲選中,它調用JavaScript方法「切換」 ,應該選中該「主」複選框的所有「子」複選框。這裏是javascript:

<script type="text/javascript"> 
    function toggle(chkbox) { 

    if (chkbox.checked) { 
      var x = document.getElementsByName(chkbox.name); 
      for (var i in x) { 
       if (!x[i].checked) 
        x[i].click(); 
       alert("HEY!" + x[i].name); 
      } 
     } else if (!chkbox.checked) { 
      var x = document.getElementsByName(chkbox.name); 
      for (var i in x) { 
       if (x[i].checked) 
        x[i].click(); 
       alert("HEY!" + x[i].name); 
      } 
     } 
    } 
</script> 

但是,雖然「主」複選框得到檢查,其「子」框中沒有被檢查。此外,當選擇「主」後警報關閉時,只有一個警報關閉,大概是「主」框,並且不會打印出像預期的索引,而是顯示「來源[X] .selected「其中X是索引。此外,取消選擇時,無論「子」框的數量如何,它都有四個警報。他們總是分別說,「來源[X]。選定」,「未定義」,「項目」和「命名項目」。 WTH正在進行中!我一定在做一些非常錯誤的事情。

+2

如果你的問題措辭良好,你的答案很快,你表現出努力,而有人發生的事情是對這個問題的瞭解。在問題標題和正文中添加快速回答的請求會產生負面影響,因此我的投票結果會下降。 – JYelton 2011-06-10 21:23:20

+8

此外,這不是HTML – Jeff 2011-06-10 21:24:47

+0

你是對的,我讀了你的評論,並將刪除請求一個快速的答案,但布蘭登擊敗了我。 – MirroredFate 2011-06-10 21:26:30

回答

0

好了,所以我的問題是jsp的儲量幾乎每一個設置變量。因此,不能使用名稱,編號或類似的名稱來標識複選框。我落得這樣做是這樣的:

JSP:

 <input type="checkbox" value="false" 
      label="Select/Deselect All" title="-1" 
      onclick="toggle(this, '-1')" /> 
     <br /> 
     <c:forEach items="${config.sources}" var="source" 
      varStatus="sourceStatus"> 
      <form:checkbox path="sources[${sourceStatus.index}].selected" 
       label="${source.sourceName}" title="${sourceStatus.index}" 
       onclick="toggle(this, ${sourceStatus.index})" /> 
      <br /> 
      <c:forEach items="${source.feeds}" var="feed" varStatus="status"> 
       <c:if test="${feed.display == true }"> 
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
        <form:checkbox 
         path="sources[${sourceStatus.index}].feeds[${status.index}].selected" 
         title="${sourceStatus.index}" /> 
        <c:out value="${feed.name}" /> (provided by ${feed.provider}) 
       <br /> 
       </c:if> 
      </c:forEach> 
     </c:forEach> 

的Javascript:

function toggle(chkbox, title) { 
    var y = document.getElementsByTagName("input"); 
    var xIndex = 0; 
    var x = new Array(); 
    for (var i = 0; i < y.length; ++i) { 
     if((y[i] != null) && (y[i].title == title || title == -1)){ 
      x[xIndex] = y[i]; 
      xIndex++; 
     } 
    } 
if (chkbox.checked) { 
     for (var i = 0; i < x.length; ++i) { 
      x[i].checked = true; 
     } 
    } else { 
     for (var i = 0; i < x.length; ++i) { 
      x[i].checked = false; 
     } 
    } 
} 

標題是JSP沒有使用我能找到的唯一可編輯字段。傷心,我知道,但是哦。

1

有兩件事情:

  1. 沒有必要來測試 「chkbox.checked」 和; 「chkbox.checked!」它是一個布爾值,所以如果它不是真的,它是錯誤的。
  2. 不要使用「for ... in」循環。這些應該是

    for (var i = 0; i < x.length; ++i) 
    
  3. 使CheckBox檢查,你應該使用

    x[i].checked = true; 
        x[i].checked = false; // to make it un-checked