Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
2 / 2 / 4
Регистрация: 09.10.2015
Сообщений: 395

Как отследить, что в ячейке таблицы поменялось значение?

19.05.2018, 21:41. Показов 6356. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
подскажите, как отследить, что в ячейке менялось значение, если там были произведены действия, например изменено значение или дописано, то в атрибут строки
HTML5
1
data-new
записать значение 2

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<table  class="heavyTable" contenteditable="true">
                    <thead>
                        <th>Date</th>
                        <th>Due Date</th>
                        <th>RUB</th>
                        <th>EUR</th>
                        <th>Debit</th>
                        <th>Credit</th>
                        <th>Balanse</th>
                    </thead>
                    <tbody>
                        <tr data-id="" data-new="0">
                            <td>1</td>
                            <td>2</td>
                            <td>3</td>
                            <td>1</td>
                            <td>2</td>
                            <td>3</td>
                            <td>3</td>
                        </tr>
                        <tr data-id="" data-new="0">
                            <td>1</td>
                            <td>2</td>
                            <td>3</td>
                            <td>1</td>
                            <td>2</td>
                            <td>3</td>
                            <td>3</td>
                        </tr>
                        <tr data-id="" data-new="0">
                            <td>1</td>
                            <td>2</td>
                            <td>3</td>
                            <td>1</td>
                            <td>2</td>
                            <td>3</td>
                            <td>3</td>
                        </tr>
                        <tr data-id="" data-new="1">
                            <td></td>
                            <td></td>
                            <td></td>
                            <td></td>
                            <td></td>
                            <td></td>
                            <td></td>
                        </tr>
                    </tbody>
                </table>
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.05.2018, 21:41
Ответы с готовыми решениями:

Как сделать так что, если на 2 форме значение label.caption поменялось, то и на 1 форме у label.caption было такое же
У меня есть 2 формы. На них есть по одному label. Как сделать так что, если на второй форме-значение label.caption поменялось, то и на 1...

Excel, как отследить изменение в ячейке?
При выходе пользователя из ячейки должен запуститься Макрос. Можно ли это сделать? Заранее спасибо.

Как можно отследить позицию курсора в ячейке datagridview
как можно контролировать ввод данных согласно формату мак адреса? Добавлено через 2 минуты я так понимаю можно как то атк сделать .....

23
 Аватар для atanov
640 / 481 / 172
Регистрация: 26.05.2016
Сообщений: 2,674
20.05.2018, 08:46
Radioaktiv, а какое событие вызывает изменение данных в таблице?
0
2 / 2 / 4
Регистрация: 09.10.2015
Сообщений: 395
20.05.2018, 09:53  [ТС]
я не знаю) вот и спрашиваю, может keypress в ячейке?
0
 Аватар для diadiavova
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
20.05.2018, 09:56
Radioaktiv, может быть это поможет?
MutationObserver - Интерфейсы веб API | MDN
0
2 / 2 / 4
Регистрация: 09.10.2015
Сообщений: 395
20.05.2018, 10:25  [ТС]
я ничего не понял что это и как использовать
0
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
20.05.2018, 10:33
Radioaktiv,
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
let target = document.querySelector('.heavyTable');
 
const mutationListener = (mutations) => {
  for (let mutation of mutations) {
    if (mutation.type === 'characterData'){
      mutation.target.parentNode.parentNode.dataset.new=2
    }
  }
}
let observer = new MutationObserver(mutationListener);
observer.observe(target, { 
  subtree: true
});
window.onunload=()=>{observer.disconnect()}
Добавлено через 16 секунд
Расписать?

Добавлено через 47 секунд
В смысле, мало ли..
0
2 / 2 / 4
Регистрация: 09.10.2015
Сообщений: 395
20.05.2018, 10:33  [ТС]
да, пожалуйста
0
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
20.05.2018, 10:53
Тогда, прошу пару минут - я тут щас опус буду писать )))

Добавлено через 16 минут
Итак.. мы же редактируем таблицу. Но вот событие change или input ей не привяжешь. Это события формы. Есть событие DOMSubtreeModified, но оно устарело. Сейчас используются наблюдатели за деревом DOM. Один такой мы использовали.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//получаем таблицу в качестве наблюдаемого объекта. Почему не ячейку спросите Вы? Отвечаю, в этом случае пришлось прочесать их все. И каждой повесить наблюдателя? Бред...
let target = document.querySelector('.heavyTable');
 
 // здесь по ссылке мы будем записывать изменения. И проходя по ним циклом, определять какие нам нужны. В данном случае, мы остановимся на [B]subtree[/B]. Этот тип мутациий будет наблюдать за любыми изменениями внутри цели, то есть таблицы. И как только пройдет совпадение, мы поменяем у родителя ячейки, то есть строки, нужный атрибут. Вы спросите, как так? Мы же следим за таблицей. А тут ловим изменение ячейки. Дело в делегировании. Событие чекнувшее на элементе, относится и к потомкам.
const mutationListener = (mutations) => {
  for (let mutation of mutations) {
    if (mutation.type === 'characterData'){
      mutation.target.parentNode.parentNode.dataset.new=2
    }
  }
}
 
// здесь мы собственно создаем наблюдатель. Почему ниже  в коде? Все просто - интерпретатор сначала собирает объявления, потом выражения. Поэтому в принципе плевать где мы его объявим.
let observer = new MutationObserver(mutationListener);
 
//А здесь мы определяем опции наблюдателя. В качестве такой опции мы установили как раз [B]subtree[/B]
observer.observe(target, { 
  subtree: true
});
 
// Этой строчкой мы отключаем наблюдателя от страницы по событию выхода с документа
window.onunload=()=>{observer.disconnect()}
Добавлено через 1 минуту
Надеюсь внятно объяснил
1
 Аватар для atanov
640 / 481 / 172
Регистрация: 26.05.2016
Сообщений: 2,674
20.05.2018, 11:10
Qwerty_Wasd, у меня к Вам вопрос по строке 18 - по умолчанию false или нужно явно указывать true/false?
0
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
20.05.2018, 11:11
atanov,
Цитата Сообщение от atanov Посмотреть сообщение
по умолчанию false
по умолчанию null. Не указали - не поймали
0
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
20.05.2018, 11:24
Я прошу прощения - вот полностью рабочий вариант. А то я пока писал, не все предоставил. Вот песочница => https://codepen.io/qwerty_wasd/pen/RyEOwJ
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let target = document.querySelector('.heavyTable');
 
const mutationListener = (mutations) => {
  for (let mutation of mutations) {
    if (mutation.type === 'characterData'){
      mutation.target.parentNode.parentNode.dataset.new=2
    }
  }
}
let observer = new MutationObserver(mutationListener);
observer.observe(target, {
  childList: true,
  characterData: true,
  subtree: true
});
window.onunload=()=>{observer.disconnect()}
Миниатюры
Как отследить, что в ячейке таблицы поменялось значение?  
1
2 / 2 / 4
Регистрация: 09.10.2015
Сообщений: 395
20.05.2018, 11:32  [ТС]
объясните плиз, как он находит атрибут и меняет значение
я здесь ничего не понял, понял что родителя нашли и new
JavaScript
1
mutation.target.parentNode.parentNode.dataset.new=2
0
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
20.05.2018, 11:44
Лучший ответ Сообщение было отмечено Radioaktiv как решение

Решение

Radioaktiv, mutation.target => объект, на котором повешен наблюдатель, То есть таблица со всеми потомками. Мы изменяем текстовый узел(да,да обычный текст тоже нода), потомка таблицы. parentNode=> получаем родителя, то есть td. Второй parentNode => получаем родителя td, то есть tr. Что нам собственно и нужно было. И вот у него уже присваиваем нужное значение атрибуту data => dataset.new=2
1
2 / 2 / 4
Регистрация: 09.10.2015
Сообщений: 395
23.05.2018, 10:45  [ТС]
а из-за чего в консоле эта ошибка?
JavaScript
1
2
Uncaught TypeError: Cannot read property 'parentNode' of null
    at MutationObserver.mutationListener
0
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
23.05.2018, 11:31
Radioaktiv,
Цитата Сообщение от Radioaktiv Посмотреть сообщение
Cannot read property 'parentNode' of null
Вы пытаетесь получить родителя пустого объекта. Вы пройдите еще раз в песочницу https://codepen.io/qwerty_wasd/pen/RyEOwJ. Посмотрите на код html. Потом на код JS. Малейшее изменение в дереве DOM влечет за собой такие ошибки. Я ведь не давал Вам таблетки от всех бед. Просто скопипастить мой код и приложить его к вашей странице не получиться. Я привел пример КАК сделать то, что нужно. Лишь пример.
0
2 / 2 / 4
Регистрация: 09.10.2015
Сообщений: 395
23.05.2018, 11:43  [ТС]
подскажите, как сделать, чтобы слежка была в строках у которых data-new = 1?

Добавлено через 1 минуту
сори, разобрался
0
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
23.05.2018, 11:46
Лучший ответ Сообщение было отмечено Radioaktiv как решение

Решение

Radioaktiv, если использовать такое дерево
Кликните здесь для просмотра всего текста
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<table  class="heavyTable" contenteditable="true">
                    <thead>
                        <th>Date</th>
                        <th>Due Date</th>
                        <th>RUB</th>
                        <th>EUR</th>
                        <th>Debit</th>
                        <th>Credit</th>
                        <th>Balanse</th>
                    </thead>
                    <tbody>
                        <tr data-id="" data-new="0">
                            <td>1</td>
                            <td>2</td>
                            <td>3</td>
                            <td>1</td>
                            <td>2</td>
                            <td>3</td>
                            <td>3</td>
                        </tr>
                        <tr data-id="" data-new="0">
                            <td>1</td>
                            <td>2</td>
                            <td>3</td>
                            <td>1</td>
                            <td>2</td>
                            <td>3</td>
                            <td>3</td>
                        </tr>
                        <tr data-id="" data-new="0">
                            <td>1</td>
                            <td>2</td>
                            <td>3</td>
                            <td>1</td>
                            <td>2</td>
                            <td>3</td>
                            <td>3</td>
                        </tr>
                        <tr data-id="" data-new="1">
                            <td></td>
                            <td></td>
                            <td></td>
                            <td></td>
                            <td></td>
                            <td></td>
                            <td></td>
                        </tr>
                    </tbody>
                </table>

то
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let target = document.querySelector('.heavyTable');
 
const mutationListener = (mutations) => {
  for (let mutation of mutations) {
    if (mutation.type === 'characterData'&&mutation.target.parentNode.parentNode.dataset.new==1){
      mutation.target.parentNode.parentNode.dataset.new=2
    }
  }
}
let observer = new MutationObserver(mutationListener);
observer.observe(target, {
  childList: true,
  characterData: true,
  subtree: true
});
window.onunload=()=>{observer.disconnect()}
Добавлено через 25 секунд
Цитата Сообщение от Radioaktiv Посмотреть сообщение
сори, разобрался
отлично
1
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
23.05.2018, 14:42
Radioaktiv, Qwerty_Wasd, во всяком теге с установленным атрибутом contenteditable поддерживается событие oninput, так что вы довольно просто можете отслеживать изменения в режиме реального времени
1
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
23.05.2018, 15:31
kalabuni,
Цитата Сообщение от kalabuni Посмотреть сообщение
во всяком теге с установленным атрибутом contenteditable поддерживается событие oninput
благодарю, не знал однако. Запомню.

Добавлено через 10 минут
kalabuni, дополню Ваше замечание -
Цитата Сообщение от kalabuni Посмотреть сообщение
во всяком теге с установленным атрибутом contenteditable поддерживается событие oninput
но при этом событие не делегируется. Пруф - https://codepen.io/qwerty_wasd/pen/VxNVeJ
JavaScript
1
2
3
document.querySelector('.heavyTable').addEventListener('input',e=>{
  if(e.target.tagName=='TD') alert(1)
})
А вот так будет работать
JavaScript
1
2
3
document.querySelector('.heavyTable').addEventListener('input',e=>{
  alert(11)
})
Добавлено через 2 минуты
И придется отслеживать каждую ячейку, изменилась она или нет. Так что мне кажется вариант с мутацией проще. ИМХО естественно.
0
 Аватар для atanov
640 / 481 / 172
Регистрация: 26.05.2016
Сообщений: 2,674
23.05.2018, 16:16
Цитата Сообщение от kalabuni Посмотреть сообщение
Radioaktiv, Qwerty_Wasd, во всяком теге с установленным атрибутом contenteditable поддерживается событие oninput, так что вы довольно просто можете отслеживать изменения в режиме реального времени
а у <td> разве установлен атрибут contenteditable или я что-то пропустил?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.05.2018, 16:16
Помогаю со студенческими работами здесь

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

Автоматически изменить значение в определенной ячейке таблицы
Добрый день, уважаемые пользователи ! Скажите пожалуйста, можно ли средствами MySQL реализовать автоматическое изменение значений в опред....

Как указать в запросе имя таблицы, записанное в ячейке этой таблицы
Добрый день. Помогите пожалуйста решить проблему: Есть таблица 'budget' со следующей структурой: магазин | категория магазина |...

Что в ячейке - значение или формула
Можно ли как-то определить, что находится в ячейке: значение или формула? Без использования макросов. Пример того, что требуется: во...

Что находиться в ячейке, формула или значение.
Существует ли в Excel возможность различать что находиться в ячейке, формула или значение с помощью формулы. Формат ячейки дата.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru