Получить значение столбца onClick во вложенной таблице HTML [Javascript]

У меня есть вложенная таблица HTML, которая расширяется при нажатии. Когда я нажимаю внутреннюю строку, я хотел бы получить значение столбца. Прямо сейчас я получаю значение столбца при щелчке внешней строки. Например, на изображении ниже, когда я нажимаю кодирование/тестирование, я хотел бы передать предупреждение как «Место». Прямо сейчас я получаю предупреждение как «место», когда я нажимаю город.

Получить значение столбца onClick во вложенной таблице HTML [Javascript]

Компонент:

 trigger(){
  var table: any = document.getElementById("table");
  var rows = table.rows;
  for (var i = 0; i < rows.length; i++) {
  rows[i].onclick = (function (e) {
    var j = 0;
    var td = e.target;
    while( (td = td.previousElementSibling) != null ) 
        j++;
    alert(rows[0].cells[j].innerHTML);
 });
 }
 }

Демо

Почему вы устанавливаете обработчик событий rows[i].onclick в методе trigger?

Gosha_Fighten 29.05.2019 01:27
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
937
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам не нужны какие-либо манипуляции с DOM, вы можете упростить свое решение, как показано ниже:

app.component.ts

// .......
export class AppComponent {
  trigger(columnName: string) {
    alert(columnName);
  }
// .......
}

app.component.html

<table class = "table table-hover table-bordered table-responsive-xl" id = "table">
    <tr>
        <td> Name </td>
        <td> Place </td>
        <td> Phone </td>
    </tr>

    <tbody>

        <ng-container *ngFor = "let data of data1">
            <tr (click) = "data.expanded = !data.expanded">
                <td (click) = "trigger('Name outer')"> {{ data.expanded ? '&ndash;' : '+'}} {{data.name}} </td>
                <td (click) = "trigger('Place outer')"> {{data.place}} </td>
                <td (click) = "trigger('Phone outer')"> {{data.phone}} </td>
                <td (click) = "trigger('Hobbies Outer')"> {{data.hobbies}} </td>
                <td (click) = "trigger('Profession outer')"> {{data.profession}} </td>
            </tr>

            <ng-container *ngIf = "data.expanded">
                <tr *ngFor = "let data of findDetails(data)">
                    <td style = "padding-left: 12px" (click) = "trigger('Name inner')"> {{data.datades.name}} </td>
                    <td (click) = "trigger('Hobbies inner')"> {{data.datades.hobbies}} </td>
                    <td (click) = "trigger('Profession inner')"> {{data.datades.profession}} </td>
                </tr>
            </ng-container>
        </ng-container>
    </tbody>
</table>

У меня есть несколько строк таблицы. Я не хотел добавлять функцию щелчка к каждому td, поэтому искал другой подход.

User123 29.05.2019 00:26
Ответ принят как подходящий

Я не уверен, почему у вас есть этот код в вашей функции trigger. Но если вам нужно получить имя столбца при нажатии на ячейку данных, вы можете использовать следующий подход.

  1. Вставьте в вызов функции trigger текущий объект мероприятие и элемент строки заголовка переменная шаблона:
<table class = "table table-hover table-bordered table-responsive-xl" id = "table">
    <tr #header>
    </tr>
    <tbody>
        <ng-container *ngFor = "let data of data1">
            <ng-container *ngIf = "data.expanded">
                <tr *ngFor = "let data of findDetails(data)" (click) = "trigger($event, header)">
                </tr>
            </ng-container>
        </ng-container>
    </tbody>
</table>

Итак, #header name присваивается первому tr элементу, а затем передается вместе с $event в функцию trigger.

  1. В вашей функции trigger используйте эти два параметра. $event будет обычным объектом Событие мыши, а header будет обычным элементом тр. После этого вы можете найти щелкнутый заголовок столбца по индексу щелкнутой ячейки в вашей строке. gsnedders в Поток StackOverflow предоставил решение, как найти индекс элемента внутри его родителя. Ваша функция trigger может выглядеть так:
trigger($event, header) {
  const index = this.getChildNumber($event.target);
  alert(header.childNodes[index].textContent.trim());
}

Этот Проект StackBlitz иллюстрирует этот подход.

Другие вопросы по теме