У меня возникли проблемы с подключением обработчиков событий в определенных строках.
Что у меня есть и что мне нужно:
У меня есть некоторый HTML-код, который будет сгенерирован динамически после загрузки страницы следующим образом:
<table>
<tr>
<td></td>
</tr>
<tr>
<td class="bonus"></td>
</tr>
<tr>
<td></td>
</tr>
</table>
Я хотел бы иметь два click
события:
- Один для строк, которые не являются "бонусной строкой"
- Один для строк, которые имеют после себя "бонусную строку"
Что я пробовал и проблема:
Однако я не могу понять, как использовать селектор для выбора «элемента, который имеет определенный элемент после него» (то есть «предыдущий» селектор). Таким образом, лучшее, на что я могу прийти:
- Строки, которые не являются «бонусной строкой»:
$('tr:not(:has(.bonus))')
- Строки, имеющие после них «бонусную строку»:
$('tr + tr:has(.bonus)').prev()
Это все хорошо, за исключением случаев, когда я использую метод live()
для объекта jQuery, который был получен с помощью обхода, а не чистого выделения, т.е.
$('tr:has(.bonus)').prev().live('click', function() {
alert('hello');
});
Я получаю эту ошибку:
необработанное исключение: синтаксическая ошибка,
нераспознанное выражение:)
Проблема в качестве еще более минимального примера:
Я надеялся, что это локализовано для некоторого сценария, который я использую, но я выделил это для минимального примера jsFiddle, который все еще повторяет проблему для меня: http://jsfiddle.net/ptvrA/
HTML:
<div></div>
<div id="target"></div>
JS:
$('#target').prev().live('click', function () {
alert('f');
});
Из этого ответа кажется, что это известное ограничение live
.
Мои обходные пути
Для справки, мои обходные пути:
- Пометить строки, у которых есть "бонусная строка" после них.
- Свяжите
click
со всеми строками и проверьте, есть ли после них «бонусная строка» в обработчике.
Но если я смогу найти "более приятное" решение, даже из любопытства, если я столкнусь с этой проблемой в другой ситуации, я был бы признателен.
Приветствия