J'ai un tableau simple et j'ai besoin d'imprimer un texte dans une certaine colonne en fonction de la condition sur les colonnes masquées. Il y a plusieurs lignes comme enregistrement qui ont le même ID TD. Ce que je dois faire est de parcourir chaque ligne du tableau et de vérifier status1 ( gv-field-15-139
), status2 ( gv-field-15-140
) et status3 ( gv-field-15-141
). Si l'un de ces statuts ( gv-field-15-150
) est "Terminé", je veux imprimer Terminé dans la colonne Statut. est-ce possible?
<table> <tr> <th>Student Name</th> <th>Nationality</th> <th>Status</th> <th>Status1</th> <th>Status2</th> <th>Status3</th> </tr> <tr> <td id="gv-field-15-1">Student A</td> <td id="gv-field-15-90">India</td> <td id="gv-field-15-150"> </td> <td id="gv-field-15-139">Completed</td> <td id="gv-field-15-140">Pending</td> <td id="gv-field-15-141">Pending</td> </tr> <tr> <td id="gv-field-15-1">Student B</td> <td id="gv-field-15-90">China</td> <td id="gv-field-15-150"> </td> <td id="gv-field-15-139">Completed</td> <td id="gv-field-15-140">Pending</td> <td id="gv-field-15-141">Pending</td> </tr> </table>
$(document).ready(function(){ if(($('td#gv-field-15-139').text() == 'Completed') || ($('td#gv-field-15- 140').text() == 'Completed') || ($('td#gv-field-15-141').text() == 'Completed') ) { $("td#gv-field-15-150").text('Completed'); }
Cela ne fonctionne que pour 1 ligne et quand il devient 2 lignes ou plus cela ne fonctionne pas. Pourriez-vous s'il vous plaît me montrer un moyen d'y parvenir.
6 Réponses :
Bouclez votre tr
sauf le premier tr qui a th
et vérifiez td
. Bien que vous puissiez résoudre votre problème avec les identifiants, il est recommandé d'utiliser la classe au lieu des identifiants.
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <table> <tr> <th>Student Name</th> <th>Nationality</th> <th>Status</th> <th>Status1</th> <th>Status2</th> <th>Status3</th> </tr> <tr> <td id="gv-field-15-1">Student A</td> <td id="gv-field-15-90">India</td> <td id="gv-field-15-150"> </td> <td id="gv-field-15-139">Completed</td> <td id="gv-field-15-140">Pending</td> <td id="gv-field-15-141">Pending</td> </tr> <tr> <td id="gv-field-15-1">Student B</td> <td id="gv-field-15-90">China</td> <td id="gv-field-15-150"> </td> <td id="gv-field-15-139">Completed</td> <td id="gv-field-15-140">Pending</td> <td id="gv-field-15-141">Pending</td> </tr> <tr> <td id="gv-field-15-1">Student B</td> <td id="gv-field-15-90">China</td> <td id="gv-field-15-150"> </td> <td id="gv-field-15-139">Pending</td> <td id="gv-field-15-140">Pending</td> <td id="gv-field-15-141">Pending</td> </tr> </table>
$(document).ready(function() { var trs = $('tr').not(':eq(0)'); $.each(trs, function() { var $this = $(this); if (($this.find('>td#gv-field-15-139').text() == 'Completed') || ($this.find('>td#gv-field-15-140').text() == 'Completed') || ($this.find('>td#gv-field-15-141').text() == 'Completed')) { $this.find(">td#gv-field-15-150").text('Completed'); } }); });
Cette solution est tellement simpliste qu'elle n'a même pas besoin de jQuery, j'ai également pensé qu'il serait peut-être plus agréable de lire si vous rompiez un peu la logique, c'est-à-dire plutôt que d'avoir une déclaration if laide et longue, J'ai implémenté la fonction isComplete
.
Pour info. Les identifiants sont censés être uniques sur toute la page, il peut être préférable de les changer en classes si vous le pouvez.
Après avoir regardé la belle solution produite par @HMR, j'ai pensé inclure une partie du code élégant qui a été implémenté dans cette solution , Je ne peux pas m'en attribuer tout le mérite!
<table> <tr> <th>Student Name</th> <th>Nationality</th> <th>Status</th> <th>Status1</th> <th>Status2</th> <th>Status3</th> </tr> <tr> <td id="gv-field-15-1">Student A</td> <td id="gv-field-15-90">India</td> <td id="gv-field-15-150"> </td> <td id="gv-field-15-139">Completed</td> <td id="gv-field-15-140">Pending</td> <td id="gv-field-15-141">Pending</td> </tr> <tr> <td id="gv-field-15-1">Student B</td> <td id="gv-field-15-90">China</td> <td id="gv-field-15-150"> </td> <td id="gv-field-15-139">Completed</td> <td id="gv-field-15-140">Pending</td> <td id="gv-field-15-141">Pending</td> </tr> <tr> <td id="gv-field-15-1">Student C</td> <td id="gv-field-15-90">China</td> <td id="gv-field-15-150"> </td> <td id="gv-field-15-139">Pending</td> <td id="gv-field-15-140">Pending</td> <td id="gv-field-15-141">Pending</td> </tr> </table>
// Just short hand. const $e = queryString => document.querySelectorAll(queryString); const term = 'Completed'; // Returns a boolean. const isComplete = td => td.textContent.replace(/\ /, '') === term; // Some fallback function. const fallback = () => console.log('Next...'); // Render the update(s). const render = (v, t) => v.includes(true) ? t.textContent = term : fallback(); // Updates the relevant td tags. const update = tr => { const tds = Array.from(tr.querySelectorAll('td')); const [, , , ...values] = tds.map(td => isComplete(td)); const [, , td] = tds; render(values, td); }; // Iterate over the relevant tr tags. const loop = () => Array.from($e("table tr")).splice(1, ).forEach(tr => update(tr)); // Start the process. loop();
Il y a quelques problèmes:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> <table> <tr> <th>Student Name</th> <th>Nationality</th> <th>Status</th> <th>Status1</th> <th>Status2</th> <th>Status3</th> </tr> <tr> <td class="gv-field-15-1">Student A</td> <td class="gv-field-15-90">India</td> <td class="gv-field-15-150"> </td> <td class="gv-field-15-139">Completed</td> <td class="gv-field-15-140">Pending</td> <td class="gv-field-15-141">Pending</td> </tr> <tr> <td class="gv-field-15-1">Student B</td> <td class="gv-field-15-90">China</td> <td class="gv-field-15-150"> </td> <td class="gv-field-15-139">Pending</td> <td class="gv-field-15-140">Pending</td> <td class="gv-field-15-141">Pending</td> </tr> </table>
$(document).ready(function() { var $tr = $('table tr'); $.each($tr, function(index, tr) { if ( ($('.gv-field-15-139', tr).text() == 'Completed') || ($('.gv-field-15- 140', tr).text() == 'Completed') || ($('.gv-field-15-141', tr).text() == 'Completed') ) { $(".gv-field-15-150", tr).text('Completed'); } }) });
N'utilisez pas d'identifiants en double, vous pouvez utiliser l'index des cellules en tête:
<table> <tr> <th>Student Name</th> <th>Nationality</th> <th>Status</th> <th>Status1</th> <th>Status2</th> <th>Status3</th> </tr> <tr> <td>Student A</td> <td>India</td> <td>xxx</td> <td>Completed</td> <td>Pending</td> <td>Pending</td> </tr> <tr> <td>Student B</td> <td>China</td> <td>xxx</td> <td>Completed</td> <td>Pending</td> <td>Pending</td> </tr> <tr> <td>Student C</td> <td>Not Completed</td> <td>xxx</td> <td>Pending</td> <td>Pending</td> <td>Pending</td> </tr> </table>
const table = document.querySelector('table'); //take all rows except the header const rows = Array.from(table.querySelectorAll('tr')).slice( 1, ); rows.forEach((row) => { const cells = Array.from( row.querySelectorAll('td') ); //get the 3rd cell const [, , toSet] = cells; //all values after 3rd cell const [, , ,...values] = cells.map( (cell) => cell.innerText.trim()//map to the innerText of the cell ); if(values.includes('Completed')){ toSet.innerHTML = 'Completed' } });
Probablement la meilleure réponse à ce jour, très belle solution!
Parcourez toutes les lignes du tableau sauf la première ligne (et donc => $('tr').length-1
).
.eq () est utilisée pour accéder à chaque élément / texte par index.
$(document).ready(function () { for(i=0;i<$('tr').length-1;i++){ if( ($('td#gv-field-15-139').eq(i).text() == 'Completed') || ($('td#gv-field-15-140').eq(i).text() == 'Completed') || ($('td#gv - field - 15 - 141').eq(i).text() == 'Completed') ) { $("td#gv-field-15-150").eq(i).text('Completed'); } } });
Les
#ID
doivent toujours être uniques Le fait d'avoir des #ids
dupliqués rend le HTML invalide, plus important encore, il paralyse JS / jQ car on s'attend à ce que Les #ids
sont uniques, donc une fois trouvés, aucun effort n'est fait pour continuer pour la deuxième occurrence d'un #id
.
#ids
ont été remplacés par .classes
de chaque ligne ont une classe partagée: .status
- Le 3ème
de chaque ligne a une nouvelle classe: .primary
Référence
Demo
Trois lignes de code ... c'est tout ce dont vous avez besoin.
<table>
<tr>
<th>Student Name</th>
<th>Nationality</th>
<th>Status</th>
<th>Status1</th>
<th>Status2</th>
<th>Status3</th>
</tr>
<tr>
<td class="gv-field-15-1">Student A</td>
<td class="gv-field-15-90">India</td>
<td class="gv-field-15-150 primary"> </td>
<td class="gv-field-15-139 status">Completed</td>
<td class="gv-field-15-140 status">Pending</td>
<td class="gv-field-15-141 status">Pending</td>
</tr>
<tr>
<td class="gv-field-15-1">Student B</td>
<td class="gv-field-15-90">China</td>
<td class="gv-field-15-150 primary"> </td>
<td class="gv-field-15-139 status">Completed</td>
<td class="gv-field-15-140 status">Pending</td>
<td class="gv-field-15-141 status">Pending</td>
</tr>
<tr>
<td class="gv-field-15-1">Student C</td>
<td class="gv-field-15-90">USA</td>
<td class="gv-field-15-150 primary"> </td>
<td class="gv-field-15-139 status">ERROR</td>
<td class="gv-field-15-140 status">Pending</td>
<td class="gv-field-15-141 status">Pending</td>
</tr>
<tr>
<td class="gv-field-15-1">Student D</td>
<td class="gv-field-15-90">France</td>
<td class="gv-field-15-150 primary"> </td>
<td class="gv-field-15-139 status">Pending</td>
<td class="gv-field-15-140 status">Pending</td>
<td class="gv-field-15-141 status">Completed</td>
</tr>
</table>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
$('.status').each(function() {
if ($(this).text() === 'Completed') {
$(this).prevAll('.primary').text('Completed');
}
});
Ne dupliquez pas les identifiants, c'est pourquoi vous ne pouvez pas accéder au-delà du premier. Lorsque JS trouve un identifiant, il suppose naturellement que c'est la seule balise avec cet identifiant. Changez vos identifiants en classes.