Работа с разными областями в таблице

110
27 января 2020, 09:30

Имеется таблица, x*y ячеек Необходимые для считывания данные в ячейках - только первый верхний ряд ячеек (обозначил td id='horizontal') и первый столбец (обозначил td id='vertical'), требуется по клику пользователя, что то вроде суммы координат только после второго клика (это или по вертикали, или по горизонтали) Нужно выделять только по одной ячейке в каждой области, а потом делать вычисление. Вот здесь все прекрасно работает, подсвечиваются только нужные ячейки при наведении мышки, и по вертикальным и по горизонтальным областям

$('#multitable').on('mouseenter', '#horizontal', function() {
        $(this).addClass('hover');
}).on('mouseleave', '#horizontal', function () {
        $(this).removeClass('hover');
});
$('#multitable').on('mouseenter', '#vertical', function() {
        $(this).addClass('hover');
}).on('mouseleave', '#vertical', function () {
        $(this).removeClass('hover');
});

А при кликах, корректно отрабатывает только на горизонтальной области (выделение по одной ячейке), по вертикальной предыдущее выделение так и остается, почему?

$('#multitable').on('click', '#horizontal', function() {
    $(this).parent().children().removeClass('active hover');
        $(this).addClass('active');
        var_one = $(this).text();
});
$('#multitable').on('click', '#vertical', function() {
    $(this).parent().children().removeClass('active hover');
    $(this).addClass('active');
    var_two = $(this).text();    
});

А дальше тупик - как динамически писать в переменную сумму выделенных ячеек, каждый раз обновляя при клике?

Answer 1

Золотое правило скриптов...
«Не используйте скрипт, если то же самое можно запросто сделать на CSS»

(допустим вы хотите покрасить клетку в оражевый цвет при наведении), тогда:

<style> .hover:hover {background-color: orange;}</style>

Вот и всё. Эта строка эквивалентна вашему первому блоку скриптов...

Во вторых... id - уникальное имя элемента. На странице не может быть больше одного одинакового id! В противном случае браузер будет выделять только последнюю.

Ко всем клеткам, которые должны подсвечиваться при наведении курсора, нужно добавить class="hover"... соответственно и в style записать то, что было выше.

А если нужно при клике на конкретную клетку - сделать её оранжевой, добавляем еще один класс, и тут уже реально нужен скрипт, это будет выглядеть так:

<style> .color {background-color: #f36700;} </style>
//При условии, что у всех клеток, которые могут быть кликнуты, уже заранее добавлен класс hover;
$(document).on('click','.hover',function(){  
  $('.hover').removeClass('color');
  $(this).addClass('color');
});

Всего лишь при клике на любой hover, убираем цветной класс со всех hover на странице, после чего добавляем его на текущий кликнутый.

Если хочется, чтобы кликнутый класс не продолжал светится при наведении, можно чутка модифицировать:

$(document).on('click','.hover',function(){  
  $('.hover').removeClass('color');
  $('.color').addClass('hover').removeClass('color');
  $(this).addClass('color').removeClass('hover');
});

Демонстрасьон (JsFiddle)

READ ALSO
Пустой экран json-сервер с ReactJS?

Пустой экран json-сервер с ReactJS?

Пытаюсь реализовать приложение на ReactJS с использованием json-сервераЗахожу на localhost:3001 и localhost:3000 - пустота

146
vue.js axios отправка формы

vue.js axios отправка формы

Пытаюсь отправить форму через axios, судя по devtools форма уходит, все заголовки и request payload там есть, но в php файле принять данные не получаетсяМассив...

132
Uncaught TypeError: Cannot read property &#39;getAttribute&#39; of undefined at move (script.js:112) at script.js:156

Uncaught TypeError: Cannot read property 'getAttribute' of undefined at move (script.js:112) at script.js:156

Проблема в том, что, когда вы вызываете figureBody[0]getAttribute('posX'), массив figureBody пустой, и figureBody[0] = undefined

142
Добавление объекта в JSON с сохранением cookie

Добавление объекта в JSON с сохранением cookie

При клике на кнопку в JSON должен записываться дополнительный объект, но получается что объект просто перезаписывается при клике сохраняя...

146