2017-06-26 2 views
2

Ich habe eine Seite mit mehreren Zeilen mit Informationen, die von mehreren Benutzern erstellt wurden. Ich suche nach einer Möglichkeit, alle Benutzerzeilen bei Mouseover hervorzuheben.Markieren Sie mehrere Zeilen in mehreren Tabellen

Diese "Highlight multiple items on hover's condition" löste fast mein Problem, aber da die Klassen oder IDs in meinem Problem dynamisch aus einer Datenbank sind, würde sie einen Bezeichner aus der Datenbank enthalten und sind jedes Mal einzigartig. Ich konnte es nicht anwenden.

Beispielcode: https://jsfiddle.net/3cehoh78/

<table class="testtable"> 
 
     <tr id="uniqueIDthatcantbechanged"> 
 
     <td class="cellclass">Line 1a</td> 
 
     <td class="cellclass">Sam</td> 
 
     <td class="cellclass">data</td> 
 
     </tr> 
 
     <tr id="uniqueIDthatcantbechanged"> 
 
     <td class="cellclass">Line 2a</td> 
 
     <td class="cellclass">Frodo</td> 
 
     <td class="cellclass">data</td> 
 
     </tr> 
 
     <tr id="uniqueIDthatcantbechanged"> 
 
     <td class="cellclass">Line 3a</td> 
 
     <td class="cellclass">Sam</td> 
 
     <td class="cellclass">data</td> 
 
     </tr> 
 
     <tr id="uniqueIDthatcantbechanged"> 
 
     <td class="cellclass">Line 4a</td> 
 
     <td class="cellclass">Legoman</td> 
 
     <td class="cellclass">data</td> 
 
     </tr> 
 
    </table> 
 
    <br> 
 
    <br> 
 
    <table class="testtable"> 
 
     <tr id="uniqueIDthatcantbechanged"> 
 
     <td class="cellclass">Line 1b</td> 
 
     <td class="cellclass">Sauron</td> 
 
     <td class="cellclass">data</td> 
 
     </tr> 
 
     <tr id="uniqueIDthatcantbechanged"> 
 
     <td class="cellclass">Line 2b</td> 
 
     <td class="cellclass">Sam</td> 
 
     <td class="cellclass">data</td> 
 
     </tr> 
 
     <tr id="uniqueIDthatcantbechanged"> 
 
     <td class="cellclass">Line 3b</td> 
 
     <td class="cellclass">Sam</td> 
 
     <td class="cellclass">data</td> 
 
     </tr> 
 
     <tr id="uniqueIDthatcantbechanged"> 
 
     <td class="cellclass">Line 4b</td> 
 
     <td class="cellclass">Legoman</td> 
 
     <td class="cellclass">data</td> 
 
     </tr> 
 
     <tr id="uniqueIDthatcantbechanged"> 
 
     <td class="cellclass">Line 5b</td> 
 
     <td class="cellclass">Frodo</td> 
 
     <td class="cellclass">data</td> 
 
     </tr> 
 
    </table>

In diesem Beispiel möchte ich alle Zeilen mit "Sam" markiert mit der Maus darüber auf einem von ihnen werden, also Reihen 1a, 3a, 2b, 3b. Ich dachte über das Hinzufügen einer Klasse zu allen Sam-Zeilen beim Erstellen der Tabellen (Sam hat eine eindeutige Benutzer-ID), aber wie ändere ich dann CSS, die alle Zeilen bei mouseover (und nicht nur eine) betrifft. Bitte beachten Sie, dass ich keine CSS-Klassen für alle eindeutigen Benutzer-IDs hinzufügen kann, dies ist nur ein Beispiel.

+0

Ich nehme an, der Benutzer-ID für den Benutzer bekannt ist (das heißt, die Seite an den Benutzer geliefert). Ich nehme an, dass die Seite (d. H. JavaScript) die Zeilen verfolgen kann, die der Benutzer hinzugefügt/hinzugefügt hat. Es sollte dann möglich sein, entweder die * Benutzer-ID * als eine Klasse für alle * Zeilen zu verwenden, die der Benutzer hinzugefügt hat, oder einfach eine generische Klasse hinzuzufügen (die den Besitz angibt). – domsson

+0

Ist die Verwendung von jQuery zulässig? –

+0

Einfachste Sache ist, verwenden Sie sie als Datenattribut .... hatte was auch immer ausgespuckt wird ein Daten-Name = "Foo" und dann können Sie einfach die Elemente auswählen. Es scheint komisch, dass Sie den Code nicht ändern können, der die Tabelle ausspuckt, um sie etwas zu verändern. Ohne diese Option müssen Sie entweder einen teuren contains() - Selektor oder eine Schleife über die Tabelle beim Laden der Seite ausführen und das Attribut – epascarello

Antwort

0

Hier ist eine Lösung mit JQuery https://jsfiddle.net/3cehoh78/5

$(document).ready(function() { 


    $("tr").hover(function() { 
    var search = $(this).find("td:eq(1)").text(); 

    $(".highlight").removeClass("highlight"); 


    $("tr:contains('"+search+"')").addClass("highlight"); 
    }); /* END HOVER */ 

}); // end document ready 
+0

Schön, das scheint die Arbeit zu erledigen, ich bin ein bisschen besorgt, dass es zu schwer sein könnte, da es viele Daten auf der Seite gibt. Ich werde es morgen ausprobieren und sehen. Wäre es einfacher, wenn ich der Reihe einen einzigartigen Wert hinzufügen würde? z.B. Benutzer-ID aus der Datenbank? – ThisIsMe

+0

Leistung am besten wäre, geben Sie Ihrem tr eine Klasse mit der Benutzerkennung .Klasse, weil Sam mehrere Zeilen haben kann und IDs nur einmal erlaubt sind. Und dann, anstatt eine Suche durch das DOM zu machen, markieren Sie einfach alle Zeilen mit dieser Klasse bei Hover. –

+0

https://jsfiddle.net/3cehoh78/7/ Beispiel wird für SAM im Moment funktionieren –

0

Einfache Lösung ohne Verwendung von jQuery und co: https://jsfiddle.net/3cehoh78/3/

var rows = [].slice.call(document.querySelectorAll('.testtable tr')); 

rows.forEach(function(row) { 
    row.addEventListener('mouseover', function() { 
    resetHighlighting(); 
    var name = row.querySelector('td:nth-child(2)').textContent; 
    rows.forEach(function(r) { 
     if (r.querySelector('td:nth-child(2)').textContent === name) { 
     r.classList.add('highlighted'); 
     } 
    }); 
    }); 
}); 

function resetHighlighting() { 
    rows.forEach(function(row) { 
    row.classList.remove('highlighted'); 
    }); 
} 
+0

Schön, das scheint die Arbeit zu erledigen, ich bin ein bisschen besorgt, dass es zu schwer sein könnte, da es viele Daten auf der Seite gibt. Ich werde es morgen ausprobieren und sehen. Wäre es einfacher, wenn ich der Reihe einen einzigartigen Wert hinzufügen würde? z.B. Benutzer-ID aus der Datenbank? – ThisIsMe

+0

Warum markieren Sie es nicht als akzeptierte Antwort ;-) Sicher, ein Hinzufügen eines eindeutigen Markers zu den Zeilen der gleichen Gruppe wäre schneller. Sie könnten den Selektor für die richtige untergeordnete Spalte und die Verwendung von textContent, die in einigen Fällen teuer sein könnte, ersparen. – alex3683

0

Hier ist eine andere Art und Weise Vanille-JavaScript verwenden.

var tds = document.querySelectorAll('td'); 

var highlight = function() { 
    // take this person's name from the 2nd cell 
    var name = this.parentNode.children[1].innerHTML; 
    // highlight cells with same name 
    tds.forEach(function (td) { 
     var tr = td.parentNode; 
     // compare other's person name with this person name 
     // highlight if there is a match 
     tr.classList.toggle('highlight', tr.children[1].innerHTML === name) 
    }); 
} 
// attach an event listener to all cells 
tds.forEach(function (td) { 
    td.onmouseover = highlight; 
}); 

Demo

+0

Schön, das scheint den Job zu erledigen, ich bin ein bisschen besorgt, dass es sein könnte zu schwer, da auf der Seite viele Daten vorhanden sind. Ich werde es morgen ausprobieren und sehen. Wäre es einfacher, wenn ich der Reihe einen einzigartigen Wert hinzufügen würde? z.B. Benutzer-ID aus der Datenbank? – ThisIsMe

+0

@ThisIsMe Wenn Sie einen eindeutigen Wert für jedes "tr" verwenden möchten, kann es nicht in einem Attribut 'id' gespeichert werden, da sie eindeutig sein sollen (einmal angezeigt). Ich speichere normalerweise Datenbank-IDs in [HTML5-Datenattribute] (https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes), z. 'Daten-ID'. Dies mit einer Kombination von Caching Ihrer 'tr's, wie in meinem Beispiel (erste Zeile) und alex3683's gemacht, kann die Leistung erhöhen. Aber manchmal ist der saubere und kurze Weg besser als bei Tom. – Mikey

+0

@ThisIsMe Diese [Demo 2] (https://jsfiddle.net/w5gye6ay/) wäre eine Revision, wenn Sie das Datenattribut mit einer ID verwenden würden. – Mikey

Verwandte Themen