jQuery Traversing + Live обработчики событий - PullRequest
5 голосов
/ 13 мая 2011

У меня возникли проблемы с подключением обработчиков событий в определенных строках.


Что у меня есть и что мне нужно:

У меня есть некоторый HTML-код, который будет сгенерирован динамически после загрузки страницы следующим образом:

<table>
   <tr>
      <td></td>
   </tr>
   <tr>
      <td class="bonus"></td>
   </tr>
   <tr>
      <td></td>
   </tr>
 </table>

Я хотел бы иметь два click события:

  1. Один для строк, которые не являются "бонусной строкой"
  2. Один для строк, которые имеют после себя "бонусную строку"

Что я пробовал и проблема:

Однако я не могу понять, как использовать селектор для выбора «элемента, который имеет определенный элемент после него» (то есть «предыдущий» селектор). Таким образом, лучшее, на что я могу прийти:

  1. Строки, которые не являются «бонусной строкой»: $('tr:not(:has(.bonus))')
  2. Строки, имеющие после них «бонусную строку»: $('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.


Мои обходные пути

Для справки, мои обходные пути:

  1. Пометить строки, у которых есть "бонусная строка" после них.
  2. Свяжите click со всеми строками и проверьте, есть ли после них «бонусная строка» в обработчике.

Но если я смогу найти "более приятное" решение, даже из любопытства, если я столкнусь с этой проблемой в другой ситуации, я был бы признателен.

Приветствия

Ответы [ 2 ]

2 голосов
/ 13 мая 2011
$('tr + tr:has(.bonus) ~ tr') //for row whose next sibling is a bonus row

Будет делать то, что вы хотите с помощью метода .live.

Для всех людей, которые попадут сюда в будущем с помощью Google.

uncaught exception: Syntax error, unrecognized expression: )

Это происходит потому, что.live () использует оригинальный селектор, который был дан первому вызову в цепочке jQuery.Он не учитывает дополнительные методы, используемые после начального $ ('селектор').

1 голос
/ 13 мая 2011

Если честно, я бы просто использовал вашу вторую идею и привязал клик ко всем строкам, а затем проверил, есть ли в следующей строке бонус td, например:

$('tr:not(:has(.bonus))').live('click', function () {
    if ($(this).next().children('td').hasClass('bonus')) {
       alert('next row has bonus td');
    }
    else {
       alert('next row does not have bonus td');
    }
});

скрипка находится здесь: http://jsfiddle.net/7gdqc/2/

Я не думаю, что есть чистый способ выбора, и это не обходной путь - я бы назвал это правильным решением вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...