Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.01.2019, 14:15
Кандидат Javascript-наук
Отправить личное сообщение для Katy93 Посмотреть профиль Найти все сообщения от Katy93
 
Регистрация: 28.12.2018
Сообщений: 137

Как поменять цвет ячеек без рекурсии?
У меня есть таблица которая состоит из 20 ячеек. Каждой ячейки присвоен класс. Белым ячейкам присвоен класс "d", чёрным - "backg". Как сделать так чтобы при щелчке на любой белой ячейке все клетки влево и вправо меняли цвет на серый до тех пор пока не попадётся чёрная ячейка?

Разумеется я хочу сделать это без рекурсии например циклом while. Мне только удалось перекрасить в серый цвет абсолютно все ячейки таблицы которые белые циклом for.
Вот мой код:
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <script type="text/javascript" src="lib/jquery.min.js"></script>
	<title>Таблица</title>
  <style>
    table td {width:28px; height:28px;}
  </style>
  <script>
    var cell = 20;
    function show()
    {
      for(var i = 0; i < cell; i++)
      {
        d = 't_'+(i+1);
        if($(document.getElementById('t_'+(i+1))).hasClass("backg"))
        {
          document.getElementById('t_'+(i+1)).style.background = "black";
        }
        if($(document.getElementById('t_'+(i+1))).hasClass("d"))
        {
          document.getElementById('t_'+(i+1)).style.background = "white";
        }
        
        document.getElementById(d).addEventListener("mousedown", {handleEvent: click_mouse, ii: i});
      }
      
      
    }
    function click_mouse(ii)
    {
      for(var i = 0; i < cell; i++)
      {
         if(!$(document.getElementById('t_'+(i+1))).hasClass("backg"))
         {
          document.getElementById('t_'+(i+1)).style.background = "LightGrey";
         }
      }
    }
    
  </script>
</head>
<body onload="show()">  
<table border="1" cellspacing="0">
  <tr>
    <td id = "t_1" class="d"></td>
    <td id = "t_2" class="d"></td>
    <td id = "t_3" class="backg"></td>
    <td id = "t_4" class="backg"></td>
    <td id = "t_5" class="d"></td>
    <td id = "t_6" class="d"></td>
    <td id = "t_7" class="d"></td>
    <td id = "t_8" class="d"></td>
    <td id = "t_9" class="d"></td>
    <td id = "t_10" class="d"></td>
    <td id = "t_11" class="backg"></td>
    <td id = "t_12" class="backg"></td>
    <td id = "t_13" class="d"></td>
    <td id = "t_14" class="d"></td>
    <td id = "t_15" class="backg"></td>
    <td id = "t_16" class="backg"></td>
    <td id = "t_17" class="d"></td>
    <td id = "t_18" class="d"></td>
    <td id = "t_19" class="d"></td>
    <td id = "t_20" class="d"></td>
  </tr>
</table>
</body>
</html>
Ответить с цитированием
  #2 (permalink)  
Старый 04.01.2019, 14:51
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Katy93,
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <title>Таблица</title>
  <style>
    table td {width:28px; height:28px;}
    .backg {
        background-color: #000000;
    }
    .d.LightGrey{
        background-color: LightGrey;
    }

  </style>
  <script>
 $(function() {
    $("table").on("click", ".d", function() {
   $(this).prevUntil(".backg").addBack().nextUntil(".backg").addBack().addClass("LightGrey");

})
});

  </script>
</head>
<body>
<table border="1" cellspacing="0">
  <tr>
    <td id = "t_1" class="d"></td>
    <td id = "t_2" class="d"></td>
    <td id = "t_3" class="backg"></td>
    <td id = "t_4" class="backg"></td>
    <td id = "t_5" class="d"></td>
    <td id = "t_6" class="d"></td>
    <td id = "t_7" class="d"></td>
    <td id = "t_8" class="d"></td>
    <td id = "t_9" class="d"></td>
    <td id = "t_10" class="d"></td>
    <td id = "t_11" class="backg"></td>
    <td id = "t_12" class="backg"></td>
    <td id = "t_13" class="d"></td>
    <td id = "t_14" class="d"></td>
    <td id = "t_15" class="backg"></td>
    <td id = "t_16" class="backg"></td>
    <td id = "t_17" class="d"></td>
    <td id = "t_18" class="d"></td>
    <td id = "t_19" class="d"></td>
    <td id = "t_20" class="d"></td>
  </tr>
</table>
</body>
</html>

Последний раз редактировалось рони, 04.01.2019 в 15:09.
Ответить с цитированием
  #3 (permalink)  
Старый 04.01.2019, 15:03
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

andSelf() - function has been deprecated, начиная с 1.8, вроде бы, нужно addBack().
Ответить с цитированием
  #4 (permalink)  
Старый 04.01.2019, 15:10
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

laimas,

заменил
Ответить с цитированием
  #5 (permalink)  
Старый 04.01.2019, 15:21
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Katy93,
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Таблица</title>
  <style>
    table td {width:28px; height:28px;}
    .backg {
        background-color: #000000;
    }
    .d.LightGrey{
        background-color: LightGrey;
    }

  </style>
  <script>
document.addEventListener('DOMContentLoaded', function() {
    document.querySelector('table').addEventListener('click',
    ({target}) => {
        if(target.closest(".d")) {
            const cells = [...target.parentNode.cells];
            const index = cells.indexOf(target);
            for (let i = index , td; td = cells[i]; i++) {
                if(td.classList.contains("d")) td.classList.add("LightGrey");
                else break;
            }
           for (let i = index , td; td = cells[i]; i--) {
                if(td.classList.contains("d")) td.classList.add("LightGrey");
                else break;
            }
        }
    }
    );
  });
  </script>
</head>
<body>
<table border="1" cellspacing="0">
  <tr>
    <td id = "t_1" class="d"></td>
    <td id = "t_2" class="d"></td>
    <td id = "t_3" class="backg"></td>
    <td id = "t_4" class="backg"></td>
    <td id = "t_5" class="d"></td>
    <td id = "t_6" class="d"></td>
    <td id = "t_7" class="d"></td>
    <td id = "t_8" class="d"></td>
    <td id = "t_9" class="d"></td>
    <td id = "t_10" class="d"></td>
    <td id = "t_11" class="backg"></td>
    <td id = "t_12" class="backg"></td>
    <td id = "t_13" class="d"></td>
    <td id = "t_14" class="d"></td>
    <td id = "t_15" class="backg"></td>
    <td id = "t_16" class="backg"></td>
    <td id = "t_17" class="d"></td>
    <td id = "t_18" class="d"></td>
    <td id = "t_19" class="d"></td>
    <td id = "t_20" class="d"></td>
  </tr>
</table>
</body>
</html>

Последний раз редактировалось рони, 04.01.2019 в 15:29.
Ответить с цитированием
  #6 (permalink)  
Старый 05.01.2019, 09:13
Кандидат Javascript-наук
Отправить личное сообщение для Katy93 Посмотреть профиль Найти все сообщения от Katy93
 
Регистрация: 28.12.2018
Сообщений: 137

Я по другому решила цикл происходит до тех пор пока проверка срабатывает в условии цикла.
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <script type="text/javascript" src="lib/jquery.min.js"></script>
	<title>Таблица</title>
  <style>
    table td {width:28px; height:28px;}
  </style>
  <script>
    var cell = 20;
    function show()
    {
      for(var i = 0; i < cell; i++)
      {
        d = 't_'+(i+1);
        if($(document.getElementById('t_'+(i+1))).hasClass("backg"))
        {
          document.getElementById('t_'+(i+1)).style.background = "black";
        }
        if($(document.getElementById('t_'+(i+1))).hasClass("d"))
        {
          document.getElementById('t_'+(i+1)).style.background = "white";
        }
        
        document.getElementById(d).addEventListener("mousedown", {handleEvent: click_mouse, ii: i});
      }
      
      
    }
    function click_mouse(ii)
    {
      i = this.ii+1;
      while($(document.getElementById('t_'+i)).hasClass("backg")==false && i > 0)
      {
           document.getElementById('t_'+i).style.background = "LightGrey";
           i--;
      }
      j = this.ii+1;
      while($(document.getElementById('t_'+j)).hasClass("backg")==false  && j <= 20)
      {
          document.getElementById('t_'+j).style.background = "LightGrey";
          j++;
      }
    }
    
  </script>
</head>
<body onload="show()">  
<table border="1" cellspacing="0">
  <tr>
    <td id = "t_1" class="d"></td>
    <td id = "t_2" class="d"></td>
    <td id = "t_3" class="d"></td>
    <td id = "t_4" class="backg"></td>
    <td id = "t_5" class="d"></td>
    <td id = "t_6" class="d"></td>
    <td id = "t_7" class="d"></td>
    <td id = "t_8" class="d"></td>
    <td id = "t_9" class="d"></td>
    <td id = "t_10" class="d"></td>
    <td id = "t_11" class="backg"></td>
    <td id = "t_12" class="backg"></td>
    <td id = "t_13" class="d"></td>
    <td id = "t_14" class="d"></td>
    <td id = "t_15" class="backg"></td>
    <td id = "t_16" class="backg"></td>
    <td id = "t_17" class="d"></td>
    <td id = "t_18" class="d"></td>
    <td id = "t_19" class="d"></td>
    <td id = "t_20" class="d"></td>
  </tr>
</table>
</body>
</html>

Как при щелчке из группы клеток выявить номер первой клетки. Например при щелчке группа клеток начинается с 3 и до 8, они все меняют цвет как в цикле обозначить третью клетку и занести её например в переменную?
Ответить с цитированием
  #7 (permalink)  
Старый 05.01.2019, 10:16
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Сообщение от Katy93
Как при щелчке из группы клеток выявить номер первой клетки.
пост #5 строка 27
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
    <title>Таблица</title>
  <style>
    table td {width:28px; height:28px;}
    .backg {
        background-color: #000000;
    }
    .d.red{
        background-color: #FF0000;
    }

  </style>
  <script>
document.addEventListener('DOMContentLoaded', function() {
    document.querySelector('table').addEventListener('click',
    ({target}) => {
        if(target.closest(".d")) {
            const cells = [...target.parentNode.cells];
            const index = cells.indexOf(target);
            let i = index , td;
            for (; td = cells[--i];) {
               if(!td.classList.contains("d")) {td = cells[++i];break};
            }
            td.classList.add("red");
            alert(i)
        }
    }
    );
  });
  </script>
</head>
<body>
<table border="1" cellspacing="0">
  <tr>
    <td id = "t_1" class="d"></td>
    <td id = "t_2" class="d"></td>
    <td id = "t_3" class="backg"></td>
    <td id = "t_4" class="backg"></td>
    <td id = "t_5" class="d"></td>
    <td id = "t_6" class="d"></td>
    <td id = "t_7" class="d"></td>
    <td id = "t_8" class="d"></td>
    <td id = "t_9" class="d"></td>
    <td id = "t_10" class="d"></td>
    <td id = "t_11" class="backg"></td>
    <td id = "t_12" class="backg"></td>
    <td id = "t_13" class="d"></td>
    <td id = "t_14" class="d"></td>
    <td id = "t_15" class="backg"></td>
    <td id = "t_16" class="backg"></td>
    <td id = "t_17" class="d"></td>
    <td id = "t_18" class="d"></td>
    <td id = "t_19" class="d"></td>
    <td id = "t_20" class="d"></td>
  </tr>
</table>
</body>
</html>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
событье onclick как вызвать без клика и без подозрений... Александр_1997 Events/DOM/Window 0 21.06.2014 17:38
Как поменять значение таймера ? Shenia1123 Ваши сайты и скрипты 0 27.05.2014 14:05
Как изменить цвет текста в таблице при наведении на нее? Amateur jQuery 3 01.09.2012 06:19
Мигающий текст как поменять цвет? Cerver Общие вопросы Javascript 2 08.05.2009 03:37
Как поменять SRC у Img в Pocket IE Maxidrom Events/DOM/Window 2 08.10.2008 15:05