У меня есть простая таблица, которая выглядит так:
<table>
<tbody>
<tr>
<td>
<input type="text">
</td>
<td>
<input type="text">
</td>
<td>
<input type="text">
</td>
<td>
<input type="text">
</td>
<td>
<input type="text">
</td>
</tr>
<tr>
<td>
<input type="text">
</td>
<td>
<input type="text">
</td>
<td>
<input type="text">
</td>
<td>
<input type="text">
</td>
<td>
<input type="text">
</td>
</tr>
<tr>
<td>
<input type="text">
</td>
<td>
<input type="text">
</td>
<td>
<input type="text">
</td>
<td>
<input type="text">
</td>
<td>
<input type="text">
</td>
</tr>
<tr>
<td>
<input type="text">
</td>
<td>
<input type="text">
</td>
<td>
<input type="text">
</td>
<td>
<input type="text">
</td>
<td>
<input type="text">
</td>
</tr>
<tr class="error">
<td>
<input type="text">
</td>
<td>
<input type="text">
</td>
<td>
<input type="text">
</td>
<td>
<input type="text">
</td>
<td>
<input type="text">
</td>
</tr>
</tbody>
</table>
Когда я нажимаю на tr
мне нужно добавить к нему специальный класс, но только я нажимаю на tr
, а не на input
внутри него. Как это сделать?
Я попробовал что-то вроде этого:
table.find('tbody').on('click', 'tr:not(input)', function(){
jQuery(this).toggleClass('error');
});
Я думаю, что лучшее, что вы можете здесь сделать, это проверить имя узла, чтобы увидеть, является ли это td или tr - или включать другие теги, если вы хотите.
$('tbody').on('click', 'tr', function (e) {
if (e.target.nodeName.toLowerCase() === "td" || e.target.nodeName.toLowerCase() === "tr") {
$(this).toggleClass('error');
}
});
Если вы специально хотите, чтобы входные данные были исключены, вы могли бы исключить их:
$('tbody').on('click', 'tr', function (e) {
if (!$(e.target).is(':input')) {
$(this).toggleClass('error');
}
});
table.find('tbody').on('click', 'tr', function(e) {
if (e.target != this)
return;
$(this).toggleClass('error');
});
Вы можете остановить событие от пузырьков до элемента tr
, используя event.stopPropagation
:
table.find("tr").on("click", function () {
jQuery(this).toggleClass("error");
}).find("input").on("click", function (event) {
event.stopPropagation();
});
Вот некоторая документация для ya, если вы хотите узнать больше: http://api.jquery.com/event.stopPropagation/
Здесь JSFiddle решения: http://jsfiddle.net/tM59b/1/
if (event.target.type != 'text')
if (event.target.tagName != "INPUT")
для прямой проверки. Не уверен, есть ли другие элементы, которые имеют свойство type
, равное text
.
Добавьте на input
прослушиватель кликов и return false;
от него, чтобы остановить событие от распространения до tr
.
Вот так:
$('tr input').click(function(e){
return false;
});
if (e.target === this) $(this).toggleClass('error');
, я бы использовалif (e.target === this) $(this).toggleClass('error');
td
вложенные в элементыtr
? Или, например, если был тегdiv
span
илиp
который вы нажимаете ...