ajax в ajax'е

Главные вкладки

Аватар пользователя 7Rei 7Rei 12 июля 2018 в 16:17

Добрый день!
Не силен в js, и столкнулся с такой проблемой:
Подгружаю ноды через ajax, в нодах используется поле Editable Fields, у которого есть свой ajax. Этот ajax перестает работать после его загрузки на страницу. Родные js и css при вызове ajax подгружаются. На той части кода которую подгружаю (до подгрузки), тоже все работает идеально. Но видимо какое-то одно конкретное событие после вызова не срабатывает.
Слышал что есть Drupal behaviors, но я не пониманию как в чужом модуле вычислить то одно событие которое не срабатывает, и уговорить его работать? Может есть какой-то специальный инструмент для таких случаев?

Комментарии

Аватар пользователя Olegars Olegars 12 июля 2018 в 16:27

бехаворс может не сработать, а вот
$(document).ajaxComplete(function(event, xhr, settings) {}
железно сработает. Соответственно после ajax надо просто восстановить все как было
Ну вообще конечно сначала надо бехаворс попробовать

(function($) {
Drupal.behaviors.название = {
  attach: function (context,settings) {

все js внутрь

Аватар пользователя Olegars Olegars 12 июля 2018 в 16:37

Хотя это все не поможет скорее всего, раз не срабатывает ajax, значит он висит на определенном id, а после срабатывания "внешнего" - назову его так ajax, id того поля меняется и естественно ajax не сработает
вот по этому поводу все расписано

Не используйте привязку к ID-шникам элементов форм, так как после каждого AJAX’а они изменяются! Поэтому я взял за правило использовать атрибут class вместо id в качестве селектора. В данном примере это конечно не критично, однако если попытаетесь привязаться к ID какого-нибудь input’a будьте готовы, что не получите желаемого результата. Это же самое касается и CSS.

http://www.angarsky.ru/drupal/ispolzovanie-ajax-s-drupal-forms-api.html

Аватар пользователя 7Rei 7Rei 12 июля 2018 в 16:37

все js внутрь

В том то и вопрос, как понять какие js надо вставлять внутрь (вызвать после)? Ведь разработчики модуля могли часть скриптов выполнять средствами самого друпала?

Аватар пользователя 7Rei 7Rei 12 июля 2018 в 16:40

Да про id гипотезу проработал. Модуль пропатчил, теперь у всех форм id уникальное, в том числе подгружаемых.

Аватар пользователя 7Rei 7Rei 12 июля 2018 в 16:52

Распишу конкретнее:
В подгружаемых нодах несколько ajax полей разных типов. Есть которые редактируются через кнопку edit, а есть в виде отрытого поля input, которые сразу же после редактирования обновляют поле сущности (ajax срабатывает по клику вне поля). Так вот, поля обновляемые по кнопке работают нормально. А вот через инпут обработчик пропадает. Причем в коде есть кнопка submit которая скрывается, и далее вызывается скриптом через js. И если в нормальных условиях к ней добавляется класс "processed", то после загрузки через ajax этого уже не происходит.

Пример подгружаемой ноды с ее полями:

Аватар пользователя Olegars Olegars 12 июля 2018 в 16:58

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

Аватар пользователя 7Rei 7Rei 12 июля 2018 в 17:27

Чтобы окончательно убедиться в гипотезе, проверил через FF, разница между подгружаемым кодом и обычным в том что, в подгружаемом меньше на одно событие, а именно: misc/ajax.js

function(event) {
  if (!Drupal.settings.urlIsAjaxTrusted[ajax.url] && !Drupal.urlIsLocal(ajax.url)) {
    throw new Error(Drupal.t('The callback URL is not local and not trusted: !url', {
      '!url': ajax.url
    }));
  }
  return ajax.eventResponse(this, event);
}

Причем не на самом инпуте, а на скрытой кнопке, которая вызывает его обработку

Аватар пользователя 7Rei 7Rei 13 июля 2018 в 0:16

Вы оказались правы на 100%! Дело исключительно в id. Тот патч который я применил решил проблему с редактируемыми полями через кнопку edit. А вот на id импутов это никак не повлияло.. Где-то в модуле идет завязка на edit-submit. Посмотрел место генерации формы, про id ни строчки. Куда смотреть дальше пока не ясно..
Похоже надо кого-то подключать..