JavaScript + css - изменить флажок основной категории css, если какие-либо элементы под ним отмечены - PullRequest
0 голосов
/ 17 декабря 2009

All

У меня есть прикрепленный фрагмент кода, где отмечен флажок категории, если все элементы под ним отмечены. Как я могу изменить код так, чтобы:

  1. Если установлен флажок под любой категорией, CSS-стиль родительского флажка «Категория» должен выглядеть серым. (Я не хочу отключать флажок. Просто посмотрите серый или любой цвет через CSS). Это будет означать, что некоторые элементы проверяются, если категория свернута.

  2. Если все элементы отмечены под категорией, то флажок не должен выглядеть серым, так как он также будет проверен.

Все существующие функциональные возможности кода должны быть сохранены, поскольку они прекрасно работают ..

PS: Извините за HTML, который был беспорядком ...

Есть предложения? Спасибо

<html>
<head>

<script src="http://www.google.com/jsapi"></script>

<script>
google.load("jquery", "1.3.2");
google.load("jqueryui", "1.7.2");
</script>

<script language="JavaScript">
function toggleTableRows()
{
  $(document).ready(function() {
    $('img.parent')
      .css("cursor","pointer")
      .toggle(
        function() {
          $(this).attr("title","Click to Expand")
          $(this).attr("src","arrow_collapsed.gif");
          $('tr').siblings('#child-'+this.id).toggle();
        },
        function() {
          $(this).attr("title","Click to Collapse");
          $(this).attr("src","arrow_expanded.gif");
          $('tr').siblings('#child-'+this.id).toggle();
        }
      ); 
    initCheckBoxes();
  });
} 
function toggleCheckboxes(current, form, field) {
  $(document).ready(function() {
    $("#"+ form +" :checkbox[name^='"+ field +"[']")
      .attr("checked", current.checked);
  });
} 
function toggleParentCheckboxes(current, form) {        
  var checked = $("#"+ form +" :checkbox[name='"+ current.name +"']").length == 
                $("#"+ form +" :checkbox[name='"+ current.name +"']:checked").length;
  // replace '[anything]' with '' instead of just '[]'
  $("#"+ form +" :checkbox[name='"+ current.name.replace(/\[[^\]]*\]/, "") +"']")
    .attr("checked", checked);
} 
function initCheckBoxes(form) {
  $("#"+ form +" :checkbox:checked").each(function() {
    if (this.name.match(/chk[0-9]\[.*\]/)) {
      toggleParentCheckboxes(this, form);
    }
  });
}
</script>
<script language="JavaScript">toggleTableRows();</script>
  <style type="text/css">tr.c1 {display: none;}</style>
</head>
<body>

<form name="frmDinnerMenu" id="frmDinnerMenu" method="POST" action="">
<table border=1>
<tr>
    <td><img class="parent" id="0" src="arrow_collapsed.gif" title="Click to Expand">Category - Fruits</td>
    <td><input type="checkbox" name="chk0" onclick="toggleCheckboxes(this, 'frmDinnerMenu', 'chk0');"/></td>
</tr>
<tr class="c1" id="child-0">
    <td>Apple</td>
    <td><input type="checkbox" value="true" name="chk0[]" onclick="toggleParentCheckboxes(this, 'frmDinnerMenu');"/></td>
</tr>
<tr class="c1" id="child-0">
    <td>Banana</td>
    <td><input type="checkbox" value="false" name="chk0[]" onclick="toggleParentCheckboxes(this, 'frmDinnerMenu');"/></td>
</tr>
<tr class="c1" id="child-0">
    <td>Orange</td>
    <td><input type="checkbox" checked value="true" name="chk0[]" onclick="toggleParentCheckboxes(this, 'frmDinnerMenu');"/></td>
</tr>
<tr>
    <td><img class="parent" id="1" src="arrow_collapsed.gif" title="Click to Expand">Category - Vegetables</td>
    <td><input type="checkbox" name="chk1" onclick="toggleCheckboxes(this, 'frmDinnerMenu', 'chk1');"/></td>
</tr>
<tr class="c1" id="child-1">
    <td>Eggplant</td>
    <td><input type="checkbox" value="true" name="chk1[]" onclick="toggleParentCheckboxes(this, 'frmDinnerMenu');"/></td>
</tr>
<tr class="c1" id="child-1">
    <td>Tomato</td>
    <td><input type="checkbox" value="false" name="chk1[]" onclick="toggleParentCheckboxes(this, 'frmDinnerMenu');"/></td>
</tr>
<tr class="c1" id="child-1">
    <td>Cabbage</td>
    <td><input type="checkbox" checked value="true" name="chk1[]" onclick="toggleParentCheckboxes(this, 'frmDinnerMenu');"/></td>
</tr>
</table>
</form>
</body>
</html>

Ответы [ 2 ]

1 голос
/ 17 декабря 2009

Код выглядит знакомым;)

Включите класс CSS, подобный этому (добавьте дополнительные стили, если вам это нужно)

.graymeout { background-color:#D8D8D8 }

Измените toggleParentCheckboxes на это (включая некоторые «оптимизации». Изменили общие части селектора и удалили «двойной» выбор с помощью фильтра)

function toggleParentCheckboxes(current, form) {
    var selector1 = "#"+ form +" :checkbox[name='";
    var selector2 = selector1 + current.name +"']";
    var set = $(selector2);
    var checked = set.length == set.filter(":checked").length;
    // replace '[anything]' with '' instead of just '[]'
    var ele = $(selector1 + current.name.replace(/\[[^\]]*\]/, "") +"']");
    ele.attr("checked", checked);
    if(!checked)
        ele.addClass("graymeout")
    else
        ele.removeClass("graymeout");
    ele=null; set=null; selector1=null; selector2=null;
}

Если вы измените вызов на initCheckBoxes в toggleTableRows на initCheckBoxes("frmDinnerMenu");, вы получите выделение также при загрузке страницы, а не только при изменении первого дочернего элемента.

0 голосов
/ 17 декабря 2009

Я также использовал тот же подход, который упоминал джиттер. Он работает довольно хорошо, и, на мой взгляд, это единственный доступный вариант, поскольку флажок с тремя состояниями недоступен в браузере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...