Невозможно нацелить определенный селектор в jQuery - PullRequest
0 голосов
/ 27 мая 2011

У меня есть следующий код jQuery:

$('.save').submit(function(e){
    var formElement = $(this);
    var data = 'id=' + $(this).attr('name') + '&' + $(this).serialize();
    var messageBox = $(this).next('.message');
    messageBox.html('<div class="pending">Saving... please wait...</div>');
    $.post('save.php', data, function(response) {
        messageBox.html(response);
        if(response.indexOf('success') != -1) {
            alert(formElement.closest('li').html());
        }
    });
    e.preventDefault();
});

И это тот HTML, с которым он работает:

<ul class="entries">
   <li id="id8673" class="3">
      <div class="expand">
         <div class="name">...</div>
      </div>
      <div class="entry">
         <div class="description">...</div>
         <form action="index.php." method="post" name="rate8673" class="save">
            <div class="comments">...</div>
            <div class="controls">...</div>
         </form>
         <div class="message">
            <div class="success"></div> // Added by jQuery after form submission
         </div>
       </div>
   </li>
</ul>

Что предупреждает об этом, когда отправляется .save:

<div class="expand">
  <div class="name">...</div>
</div>
<div class="entry">
  <div class="description">...</div>
</div>

Если я обновлю свой код jQuery до:

...

alert(formElement.closest('li .entry').html());

...

Это предупреждает, как и ожидалось:

<div class="description">...</div>

Но если я обновлю свой код jQuery так:

...

    alert(formElement.closest('li .expand').html());

...

Это предупреждает:

NULL

И это должно насторожить:

<div class="name">...</div>

И я не могу понять, почему NULL? Я удалил весь javascript, кроме этой функции, и все элементы HTML сразу становятся доступны после загрузки страницы, так что мне здесь не хватает? Есть ли способ, что такое NULL и откуда он это взял?

1 Ответ

3 голосов
/ 27 мая 2011

http://api.jquery.com/closest

Согласно документации jQuery, .closest() смотрит только на предков. И div.name не является прямым предком формы (это больше похоже на дядю, но нет одного селектора для родного брата родителя).

Вы можете использовать:

alert(formElement.parents('li').find('.expand').html());
...