Я нашел некоторые особенности того примера, что я давал вчера. Потому я решил немного ещё поэкспериментировать, чтобы дать более качественное решение.
Вот какие особенности я заметил у прошлого варианта:
- Многократный bind кода и соответственно его многократный вызов. В некоторых случаях это не важно, но скорее всего приведет к неожиданным результатам.
- Вторая особенность «подливает масла в котел» первой проблемы. Она заключается в том, что при одном запросе к серверу, могут быть сформированы несколько вызовов обработчика с разными контекстами.
Начну со второй проблемы — преодоления «мультиконтекста». Следует проверять в контексте какого контейнера идет вызов. Для этого можно проверить id контейнера или его класс:
1 2 3 4 5 6 7 8 9 10 |
Drupal.behaviors.MyCode = { attach: function(context, settings) { // у контекстного контейнера можно // проверить id или класс if ($(context).hasClass('webform-client-form')) { //... console.log('success'); } } }; |
Казалось бы это решает и проблему c привязкой к событию ‘ajaxSuccess’, т.е. многократный bind обработчика. Но тесты показывают, что это не так.
Вот в такой конфигурации, я отправлял данные формы webform по ajax:
1 2 3 4 5 6 7 8 9 10 11 12 |
Drupal.behaviors.MyCode = { attach: function(context, settings) { if ($(context).hasClass('webform-client-form')) { //цепляем код к событию ajaxSuccess $(context).bind('ajaxSuccess', function(data, status, xhr) { console.log('binded code exec'); }); //пишем в консоль маркер console.log('success'); } } }; |
В консоли раз за разом был виден инкремент зацепок к ajaxSuccess.
По моей логике, перезагружаемый контейнер должен был терять все свои «пользовательские» обработчики. Зацепка к ajaxSuccess может быть важна тем, что мы получаем доступ к передаваемым в результате ajax данным. Если это не так, что можно обойтись и без bind.
1 2 3 4 5 6 7 8 9 10 |
Drupal.behaviors.MyCode = { attach: function(context, settings) { // проверить контекст if ($(context).hasClass('ваш-класс-контейнера')) { // выполним нужный нам js код // в требуемом нам контексте ... } } }; |