Я пытаюсь применить изменения к DOM при нажатии на <tr>
. При нажатии, она должна добавить data-state=enabled
и data-display=expanded
к щелкнули <tr>
при применении data-state=disabled
и data-display=collapsed
к каждый<tr>
.Изменение атрибута данных при щелчке элементов HTML
Таким образом, это должно выглядеть как выделение щелкнутой строки при отключении других строк.
Затем, когда выделена строка, и пользователь щелкает в другом месте, он должен сброса по умолчанию, т.е. data-state=enabled
и data-display=collapsed
для всех <tr>
«s
В настоящее время у меня он работает так, что когда <tr>
, эта строка подсвечивается, а все остальные отключены. Однако, сценарий не имеет сброса к умолчанию, потому что если щелкнуть другое <tr>
, оно сразу подсвечивает это и отключает остальные.
Я хотел бы сделать это в javascript vanilla, но я также открыт для использования jQuery, если он значительно проще и не повлияет на производительность заметно.
Вот в JSbin с рабочим кодом, чтобы увидеть, где он по адресу: https://jsbin.com/kirati/
И код до сих пор:
<table class="table">
<thead>
<tr>
<th class="sort-key asc"><a href="#">Pet Name </a></th>
<th><a href="#">Owner (Last, First)</a></th>
<th><a href="#">Species</a></th>
<th><a href="#">Breed</a></th>
<th><a href="#">ID</a></th>
</tr>
</thead>
<tbody>
<tr>
<td>
Fluffy
<div class="table-row__expanded-content">
<data-key>Sex: </data-key> <data-value>Male</data-value><br />
<data-key>DOB: </data-key> <data-value>12/08/2010</data-value> <br />
<data-key>Weight: </data-key> <data-value>20 lbs</data-value> <br />
<data-key>Location: </data-key> <data-value>Kennel 2B</data-value> <br />
<data-key>Temperament: </data-key> <data-value>Aggresive</data-value> <br />
<data-key>Allergies: </data-key> <data-value>Sulfa, Penicillin, Peanuts</data-value>
</div>
</td>
<td>Anderson, James</td>
<td>Dog</td>
<td>Bulldog-Shitzu</td>
<td>ABCDE1234567</td>
</tr>
<tr>
<td>Feather</td>
<td>Michelle Charlotte, <br /> Angel Vanessa</td>
<td>Cat</td>
<td>American Bobtail</td>
<td>FGHIJ1234567</td>
</tr>
<tr>
<td>Fluffer-Nutter</td>
<td>Rakerstraw, Rickey</td>
<td>Dog</td>
<td>American Eskimo</td>
<td>KLMNO1234567</td>
</tr>
<tr>
<td>Farley</td>
<td>Cunningham, Stephanie</td>
<td>Dog</td>
<td>Pomeranian</td>
<td>PQRST1234567</td>
</tr>
<tr>
<td>Fuzzy</td>
<td>Venice, Harding</td>
<td>Cat</td>
<td>Burmese</td>
<td>UVWXY1234567</td>
</tr>
<tr class="alphabet-label">
<td>G</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Goldie</td>
<td>Cherilyn, Mitchener</td>
<td>Dog</td>
<td>Chihuahua-Maltese</td>
<td>ZABCD1234567</td>
</tr>
</tbody>
</table>
И Javascript
window.onload = function() {
var tablerow = document.body.getElementsByTagName('tr');
console.log(tablerow);
// Convert the HTMLCollection into a true javascript Array, so we can do "stuff" with it
var tablerowArr = Array.prototype.slice.call(tablerow);
console.log(tablerowArr);
// Do stuff
tablerowArr.forEach(function (value, i) {
console.log(i, value);
tablerow[i].onclick = function (e) {
//console.log("clicked!");
var newArr = tablerowArr.slice(i, i + 1);
//console.log(tablerow);
console.log(i);
//console.log(tablerowArr);
console.log('newArr', newArr);
tablerowArr.forEach(function (value, i) {
// first reset all instances of data-XXX
tablerowArr[i].setAttribute('data-display', "collapsed");
// tablerowArr[i].setAttribute('data-state', "enabled");
// Set the <tr> data-display attribute to expanded/collapsed on click
newArr[0].setAttribute('data-display', tablerowArr[i].getAttribute('data-display') === "collapsed" ? "expanded" : "collapsed");
//tablerowArr[i].setAttribute('data-display', tablerowArr[i].getAttribute('data-display') === "collapsed" ? "expanded" : "collapsed");
// Set the <tr> data-state attribute to enabled/disabled on click
newArr[0].setAttribute('data-state', newArr[0].getAttribute('data-state') === "disabled" ? "enabled" : "enabled");
tablerowArr[i].setAttribute('data-state', newArr[0].getAttribute('data-state') === "enabled" ? "disabled" : "enabled");
});
e.preventDefault();
};
});
};
попробовать это решение, возможно, это может помочь [Как изменить данные элемента HTML Object значение атрибута в JavaScript] (http://stackoverflow.com/questions/4836290/how-to-change-html-object- element-data-attribute-value-in-javascript) или этот [Установить атрибут данных с использованием JavaScript] (http: // stackoverflow.com/questions/11286661/set-data-attribute-using-javascript) – Gardezi
«используйте jQuery, если он значительно проще и не повлияет на производительность заметно» - он всегда значительно проще и не влияет на производительность –
Я предпочитаю VanillaJS потому что это помогает мне лучше понимать JavaScript, а не полагаться на «волшебство» из классных библиотек, таких как jQuery. Конечно, есть время и место для библиотек, потому что они делают некоторые вещи очень легкими - но бывают случаи, когда pureJS просто отлично (и помогает моему пониманию расти). – TetraDev