У меня есть приложение HTML5, в котором есть таблица (идентификатор - #myTable
в оставшейся части этого вопроса). Таблица заполняется запросом ajax.
После ответа ajax одна строка таблицы выглядит следующим образом:
<tr>
<td>ID 001</td>
<td>Foo</td>
<td>Bar</td>
<td>Baz</td>
<td><a href="/fge?id=001" class="btn-fge">Find group entries</a></td>
</tr>
Якорь в последнем столбце isn ' присутствует на каждом ряду. Появляется только для определенных строк. Если якорь не появляется, отображается пустая строка: <td></td>
.
До того, как этот якорь был добавлен, я написал функцию, которая переключает расширение / свертывание каждой строки. После расширения был сделан дополнительный запрос ajax для представления дополнительных данных. Поведение было таким, что пользователь мог щелкнуть в любом месте строки.
$('#myTable tbody').on('click', 'td', function (e) {
var tr = $(this).closest('tr');
// Code to expand/collapse tr
// ...
// Ajax request for additional row data
// ...
}
Все это работало без проблем.
Однако я хочу разделить поведение таким образом, чтобы приведенный выше код не срабатывал, если пользователь нажал на якорь. И наоборот, если они щелкают где-нибудь внутри строки, отличной от якоря, оно должно срабатывать.
Я прочитал Проверьте, не имеет ли выбранный элемент определенного c класса и попытался нацелиться .btn-fge
с использованием условия :not()
следующим образом.
$('#myTable tbody').on('click', 'td:not(.btn-fge)', function (e) {
}
Это не работает (хотя я полагаю, что это может быть потому, что .btn-fge
не класс <td>
, а скорее якорь внутри него?). Поведение сворачивающейся / расширяющейся строки все еще срабатывает, после чего браузер перенаправляет на значение href
. В приведенном примере поведение выглядит следующим образом:
- Щелкните
.btn-fge
. - Строка развернута (или, если она уже развернута, свернута).
- Браузер следует
href
на .btn-fge
, поэтому в этом случае перенаправляет на /fge?id=001
.
Я хочу, чтобы (1) следовал (3), но не (2) при нажатии .btn-fge
.
Я попытался войти console.log($(this));
, а затем e.preventDefault()
. Неважно, где находится строка, по которой я щелкаю - независимо от того, находится она на кнопке или нет - она выдает тот же результат, как показано ниже.
![enter image description here](https://i.stack.imgur.com/bE9hr.png)
Как можно ли настроить таргетинг таким образом, чтобы поведение кнопки отличалось от нажатия других мест внутри строки?
Я использую jquery версию 3.2.1 и предпочел бы решение jquery, но ваниль JavaScript один также будет приемлемым.
Редактировать - я сделал скрипку здесь https://jsfiddle.net/adrq0nhz/, и если вы щелкнете где-нибудь внутри таблицы, появится консоль «Это все еще стреляет», что фактически является проблемой якоря не имея отдельного поведения. Примечание: класс .btn-fge
находится на привязке, а не <td>
, и это нельзя изменить.