Как получить динамический идентификатор с помощью javascript / jquery из цикла php

У меня есть две таблицы в базе данных, которые связаны друг с другом с помощью внешнего ключа «pid».

Я хочу показать таблицу проектов, и когда я щелкаю проект, чтобы показать некоторые детали из другой таблицы в базе данных (внешний ключ). Я пытаюсь работать с Ajax. Проблема в том, что одна часть таблицы находится в одном файле, а другая - в другом (обработка ajax). Я пытаюсь установить динамический идентификатор, но не знаю, как получить конкретный идентификатор с помощью javascript / jquery.

Вот код:

     <table class = "table table-condensed" style = "border-collapse:collapse;">
        <thead>
          <tr>
            <th></th>
            <th style = "font-style:italic;">NO</th>
            <th style = "font-style:italic;">STATUS</th>
            <th style = "font-style:italic;">PROJECT NAME ACTIVITIES</th>
            <th style = "font-style:italic;">OBJECTIVES/NOTES</th>
            <th style = "font-style:italic;">RESPONSIBLE</th>
            <th style = "font-style:italic;">START DATE</th>
            <th style = "font-style:italic;">COMPLETED DATE</th>
            <th style = "font-style:italic;">DURATION</th>
            <th style = "font-style:italic;">COMPLETED</th>
          </tr>
        </thead>
        <tbody>
          <?php $x = 0; foreach ($projects as $project){
            echo "<tr data-toggle=\"collapse\" data-target=\".demo$x\" class=\"accordion-toggle\">
              <td><button onclick='showTimeline()'>click</button></td>
              <td id=\"pid$x\">$project[pid]</td>
              <td>$project[status]</td>
              <td>$project[project_title]</td>
              <td>$project[notes]</td>
              <td>$project[responsible]</td>
              <td>$project[start_date]</td>
              <td>$project[completed_date]</td>
              <td>$project[duration]</td>
              <td>$project[completed]</td></tr>
              <div id='txtHint$x'></div>";
             $x++;}
            ?>
        </tbody>
    </table>

 function showTimeline(a,i) {
  var pid=document.getElementById("pid"+i).value;
  if (id == "") {
      document.getElementById("textHint"+i).innerHTML = "";
      return;
  } else {
      if (window.XMLHttpRequest) {
          // code for IE7+, Firefox, Chrome, Opera, Safari
          xmlhttp = new XMLHttpRequest();
      } else {
          // code for IE6, IE5
          xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      }
      xmlhttp.onreadystatechange = function() {
          if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
              document.getElementById("txtHint"+i).innerHTML = xmlhttp.responseText;
          }
      };
      alert(pid);
      xmlhttp.open("GET","ajax_test.php?q = "+pid,true);
      xmlhttp.send();
   }
 }

Вы на правильном пути, только у <td> нет свойства value, и вы не передаете аргументы showTimeline(), которые ожидает функция.

Dormilich 04.06.2018 14:12

Примечание; Если вы уже используете jQuery, я бы посоветовал вам использовать встроенные функции ajax (например, $.get(), $.post() или $.getJSON()). Избавит вас от многих проблем, например, кроссбраузерности ...

giorgio 04.06.2018 14:16
Поведение ключевого слова "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
2
826
3

Ответы 3

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

<?php foreach ($data as $key => $value) : ?>
    <tr>
        <td><?php echo $value['example']; ?>
    </tr>
<?php endforeach; ?>

чтобы настроить таргетинг на динамически создаваемый элемент, вам нужно использовать $(document). Причина в том, что jQuery работает с DOM при загрузке документа, а ничего не добавляется.

Задайте такую ​​цель:

$(document).on('event', '#my-dynamic-id', function()
{
    alert('clicked dynamic element')
});

Установите класс на button & td, где доступен идентификатор

$(document).on("click", "button", function(){
	var pid = $(this).closest("tr").find(".class name of td where id available").html();
});

@Sohil Sardhara Спасибо, это работает для pid :), но мне нужно что-то подобное и для txtHint, чтобы показать результат в определенной строке таблицы. Любая идея?

Tinchu 04.06.2018 14:26

Вот соль.

 <tbody>
          <?php $x = 0; foreach ($projects as $project){
            echo "<tr data-toggle=\"collapse\" data-target=\".demo$x\" class=\"accordion-toggle\">
              <td><button onclick='showTimeline()' data-pid='<?php echo $project[pid]; ?>'>click</button></td>
              <td id=\"pid$x\">$project[pid]</td>
              <td>$project[status]</td>
              <td>$project[project_title]</td>
              <td>$project[notes]</td>
              <td>$project[responsible]</td>
              <td>$project[start_date]</td>
              <td>$project[completed_date]</td>
              <td>$project[duration]</td>
              <td>$project[completed]</td></tr>
              <div id='txtHint$x'></div>";
             $x++;}
            ?>
        </tbody>

function showTimeline(a,i) {
  var pid=$(this).data('pid');;
  if (pid == "") {
      document.getElementById("textHint"+i).innerHTML = "";
      return;
  } else {
      if (window.XMLHttpRequest) {
          // code for IE7+, Firefox, Chrome, Opera, Safari
          xmlhttp = new XMLHttpRequest();
      } else {
          // code for IE6, IE5
          xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      }
      xmlhttp.onreadystatechange = function() {
          if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
              document.getElementById("txtHint"+i).innerHTML = xmlhttp.responseText;
          }
      };
      alert(pid);
      xmlhttp.open("GET","ajax_test.php?q = "+pid,true);
      xmlhttp.send();
   }
 }

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