События jquery ajax, вызываемые для каждого элемента на странице, когда они направлены только на один элемент - PullRequest
2 голосов
/ 29 июля 2009

Итак, у вас есть страница:

<html><head>
<script type="text/javascript" src="jquery.1.3.2.js"></script>
<script type="text/javascript">
$(function() {
  var onajax = function(e) { alert($(e.target).text()); };
  var onclick = function(e) { $(e.target).load('foobar'); };
  $('#a,#b').ajaxStart(onajax).click(onclick);
});
</script></head><body>
<div id="a">foo</div>
<div id="b">bar</div>
</body></html>

Ожидаете ли вы одно предупреждение или два, когда вы нажмете 'foo'? Я бы ожидал только один, но я получаю два. Почему одно событие имеет несколько целей? Это наверняка нарушает принцип наименьшего удивления. Я что-то пропустил? Есть ли способ отличить через объект события, на который был сделан вызов load ()? Это было бы полезно ...

РЕДАКТИРОВАТЬ: чтобы уточнить, щелчок материал только для демонстрации. Моя цель - иметь неуниверсальный обработчик ajaxStart. я хочу, чтобы div # a делал одну вещь, когда он является предметом события ajax, а div # b делал что-то другое. Итак, по сути, я хочу быть в состоянии сказать, какой div вызывался load (), когда я ловлю событие ajax. Я начинаю думать, что это невозможно. возможно, мне стоит заняться этим с помощью jquery-dev ...

Ответы [ 3 ]

1 голос
/ 29 июля 2009

Хорошо, я пошел дальше и посмотрел на jQuery ajax и код события. jQuery только когда-либо запускает события ajax глобально (без целевого элемента):

jQuery.event.trigger("ajaxStart");

Никакой другой информации нет. (

Итак, когда метод триггера получает такой вызов, он просматривает jQuery.cache и находит все элементы, для которых есть обработчик, связанный с этим типом события, и снова jQuery.event.trigger, но на этот раз с этим элементом в качестве цели.

Итак, именно так, как это выглядит в демоверсии. Когда происходит одно фактическое событие ajax, jQuery запускает не пузырьковое событие для каждого элемента, с которым связан обработчик для этого события.

Итак, я полагаю, что мне нужно лоббировать их, чтобы отправить больше информации вместе с триггером "ajaxStart", когда происходит вызов load ().

Обновление: Ариэль недавно поддержал это. Это должно быть в jQuery 1.4 (или как они решили назвать следующую версию).

0 голосов
/ 29 июля 2009

когда вы установите ajaxStart, он отключится для обоих div. поэтому, когда вы устанавливаете каждый div для реакции на событие ajaxStart, каждый раз при запуске ajax они оба выключаются ...

вы должны сделать что-то отдельное для каждого обработчика кликов и что-то общее для вашего события ajaxStart ...

0 голосов
/ 29 июля 2009

Поскольку у вас есть селектор с двумя элементами, вы создаете два обработчика ajaxStart. ajaxStart является глобальным событием, поэтому, как только вы запустите какое-либо событие ajax, функция onajax будет вызвана дважды. Так что да, вы получите два всплывающих окна.

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