Используя живой () - преимущества - подобный для привязки ()

Это может быть сделано двумя способами

  1. Возврат response_content, просто разрезая, как показано ниже.
def __str__(self):
        return (str(self.id) + " " + self.author_name + "|" + self.resonse_content[:10])
  1. Используя фильтр по умолчанию Django, а именно truncatechars.
from django.template.defaultfilters import truncatechars

class Response(models.Model):
...
    def __str__(self):
        return (str(self.id) + " " + self.author_name + "|" + truncatechars(self.resonse_content, 10))

9
задан Coughlin 1 December 2011 в 22:47
поделиться

3 ответа

Предупреждение : Этот ответ старый. Все еще очень полезно , но live устарело и удалено в более новых версиях jQuery. Так что прочитайте ответ, потому что варианты использования не изменились, и вы узнаете, почему и когда использовать меньше обработчиков событий. Но если вы до сих пор не используете действительно старую версию jQuery (v1.4.2 или более раннюю), вам следует рассмотреть возможность написания нового эквивалентного кода. Как описано в jQuery API для live и скопировано здесь:

Переписать метод .live () с точки зрения его преемников просто; это шаблоны для эквивалентных вызовов для всех трех методов вложения событий:

  1. $ (селектор) .live (события, данные, обработчик); // jQuery 1.3+
  2. $ (document) .delegate (селектор, события, данные, обработчик); // jQuery 1.4.3+
  3. $ (document) .on (события, селектор, данные, обработчик); // jQuery 1.7+

Иногда у вас есть набор элементов при загрузке страницы, например, скажем, редактировать ссылки:

<table>
  <tr>
    <td>Item 1</td>
    <td><a href="#" class="edit">Edit</a></td>
  </tr>
  <tr>
    <td>Item 2</td>
    <td><a href="#" class="edit">Edit</a></td>
  </tr>
  <tr>
    <td>Item 3</td>
    <td><a href="#" class="edit">Edit</a></td>
  </tr>
</table>

Теперь, может быть, у вас что-то подобное с jQuery:

$(document).ready(function() {
  $('a.edit').click(function() {
    // do something
    return false;
  });
});

Но что, если вы добавите Новый элемент в этой таблице динамически, после начальной загрузки страницы?

$('table').append('
    <tr><td>Item 4</td><td><a href="#" class="edit">Edit</a></td></tr>
');

Когда вы нажимаете «Изменить» для этого нового элемента, ничего не произойдет, потому что события были связаны с загрузкой страницы. Войти в прямом эфире. С его помощью вы можете связать указанное выше событие следующим образом:

$(document).ready(function() {
  $('a.edit').live('click', function() {
    // do something
    return false;
  });
});

Теперь, если вы добавите любые новые элементы с классом , отредактируйте после первоначальной загрузки страницы, это будет по-прежнему регистрировать этот обработчик событий.

Но как это сделать?

jQuery использует так называемое делегирование события для достижения этой функциональности. Делегирование событий полезно в этой ситуации или когда вы хотите загрузить большое количество обработчиков. Допустим, у вас есть DIV с изображениями:

<div id="container">
    <img src="happy.jpg">
    <img src="sad.jpg">
    <img src="laugh.jpg">
    <img src="boring.jpg">
</div>

Но вместо 4 изображений у вас есть 100, или 200, или 1000. Вы хотите связать событие щелчка с изображениями, чтобы действие X выполнялось, когда пользователь нажимал на него. Выполнение этого, как вы могли ожидать ...

$('#container img').click(function() {
    // do something
});

... связывало бы сотни обработчиков, которые все делают одно и то же! Это неэффективно и может привести к снижению производительности в тяжелых веб-приложениях. С делегированием событий, даже если вы не планируете добавлять больше изображений позже, использование live может быть намного лучше для такой ситуации, поскольку вы можете затем привязать один один обработчик к контейнеру и проверить, когда он щелкните, если целью было изображение, и затем выполните действие:

// to achieve the effect without live...
$('#container').click(function(e) {
    if($(e.target).is('img')) {
        performAction(e.target);
    }
});

// or, with live:
$('img', '#container').live('click', function() {
    performAction(this);
});

Так как jQuery знает, что новые элементы могут быть добавлены позже или что производительность важна, вместо привязки события к реальным изображениям, оно может добавить его к div, как в первом примере (на самом деле я уверен, что оно связывает их с телом, но может с контейнером в примере выше), а затем делегировать. Это свойство e.target позволяет ему проверять после того, соответствует ли событие, на которое щелкнули / воздействовали, выбранный вами селектор.

Чтобы было понятно: это полезно не только в прямой способ не привязывать события, но это может быть значительно быстрее для большого количества предметов.

22
ответ дан 4 December 2019 в 08:34
поделиться

Преимущество заключается в том, что обработчик событий также будет добавлен в новые соответствующие элементы при создании этих элементов. Это избавляет вас от необходимости вручную добавлять обработчик событий каждый раз, когда вы создаете новый элемент (соответствующий ранее использовавшемуся селектору), который нуждается в нем.

Добавлено в jQuery 1.3: привязывает обработчик на событие (например, нажмите) для всех текущий - и будущий - совпал element.

Из http://docs.jquery.com/Events/live#typefn , выделено мое.

1
ответ дан 4 December 2019 в 08:34
поделиться

По сути, с .live () вам не нужно беспокоиться об обновлении обработчиков событий, если у вас очень динамичный веб-сайт.

$('.hello').live('click', function () {
  alert('Hello!');
});

Этот пример свяжет событие click с любыми элементами, которые уже имеют класс «hello» , а также с любыми элементами, которые динамически вставляются, будь то AJAX или по старомодному JavaScript.

2
ответ дан 4 December 2019 в 08:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: