Bitrix ajax режим не работает

Проблемы с Ajax + не могу авторизоваться

Как-то не заладилось с утра:

1) Содержимое включаемой области:

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

вот собственно вызываемый скрипт

в соответствии с рекомендацией: http://dev.1c-bitrix.ru/community/blogs/cookbook/197.php вызывается $APPLICATION->RestartBuffer(); , но скрипт в БУСе ведет себя все равно, как хочет

Т.е. если в мозилле обратиться, как http://localhost:6448/ajax.php?SECTION_ID=14 , он выводит какие-то . — откуда? О_о, причем собственно option-ы не выводятся!

Дальше — больше, если в функции updateservices() делать alert(xmlHttp.responseText) — в мозилле ничего не алертуется, а в опере все равно выводится HTML с доктайпом, хэдером, etc. — откуда? я же вызвал $APPLICATION->RestartBuffer()?

2) Начал грешить на лису и решил попробовать в Опере — напрямую к http://localhost:6448/ajax.php?SECTION_ID=14 БУС не пустил (хотя и стоял доступ «чтение» для всех), решил авторизоваться — ПАРОЛЬ НЕПРАВИЛЬНЫЙ. В состоянии легкого шока решил перепроверить в фоксе: вышел, попробовал зайти и сохраненный до этого пароль оказался неправильным! теперь я вообще в админку не могу зайти, т.к. не знаю, какой ему пароль нужен (неделю работал, нормально все было). Сайт на локалхосте, поэтому ни о тех. поддержке, ни о сбросе пароля по e-mail речи не идет, что делать-то.

ЗЫ: хотел смайлик и оформление кода вставить в это сообщение — дак и то не работает. *dash*

Источник

AJAX — проблемы с JS и CSS компонент

Добрый день!
Есть идея реализации странички с использованием AJAX:
На странице размещается вывоз 3х компонент, вводится переменная (допустим $_GET[«show»]), состояние которой и определяет, какой компонент отображать.
Вот идея и заключается в том, чтобы отображать эти компоненты без перезагрузки страницы.
При работе без ajax (т.е. переходе по ссылкам) проблем нет.

Столкнулся со следующей проблемой:
У меня есть страница /personal/index.php, ее структура аналогична структуре описаной в этом блоге , только компоненты используются

  • bitrix:sale.basket.basket
  • bitrix:subscribe.edit
  • bitrix:main.profile

Проблема в том, что, заходя в раздел, я попадаю на компонент bitrix:sale.basket.basket — все отлично. Когда я перехожу на вкладку с bitrix:main.profile, компонент подгружается, но не работают его JS и CSS.
Если зайти сразу на страницу с профилем /personal/index.php?show=profile, то скрипты и стили работают, но проблема с другими компонентами, загружаемых динамически (остается).
P.S.: ShowHeadStrings()?> и ShowHeadScripts()?> в head’е шаблона сайта есть.
Пробовал вываливать скрипты и стили компонент на страницу, еще до их вызова, т.е. сразу 3х компонент, внезависимости от того, какой потом вызовут.

Кто подскажет как быть, или может другой способ реализации?
(скрипты, подгруженные ajax’ом не доступны — почему?)

Источник

Компонент в режиме AJAX_MODE внутри шаблона другого компонента

Добрый день. Есть очень непонятная проблема.
По порядку:
1. Есть структура шаблона для примера:

2. Есть страница со стандартным комплексным компонентом bitrix:catalog
В шаблоне элемента компонента bitrix:catalog.element (template.php) вставлен код компонента добавления результата веб формы bitrix:form.result.new .

Форма отлично работает.

Теперь проблема:
При переключении компонента bitrix:form.result.new в режим AJAX. (параметр AJAX_MODE=’Y’) едет верстка!

Должно быть так:

Т.е. весь основной контент сайта попадает в header. А теги в которых должен быть контент вставляются куда-нибудь между кодом компонента работающего в режиме AJAX.

Кто встречался с таким? Очень прошу помощи.

Пробовал такие варианты:
1. В основном файле шаблона (template.php) компонента bitrix:catalog.element убирал весь код который есть, оставлял только код компонента bitrix:form.result.new. — ПРОБЛЕМА СОХРАНЯЕТСЯ.
2. Вставлял код bitrix:form.result.new в файл element.php комплексного компонента catalog вместо всего что там есть (вместо вызова шаблона элемента) — ПРОБЛЕМА ИСЧЕЗАЕТ.
3. Просто ставил вызов компонента bitrix:form.result.new на чистую страницу с хедером и футтером. — ПРОБЛЕМЫ НЕТ

Т.е. проблема именно при размещении AJAX компонента в шаблоне другого компонента.
Нашел похожую тему, там был совет что подобный косяк с версткой может быть если где то в шаблонах компонентов используются отложенные функции. Но в данном случае ничего не нашел.

Источник

Ajax компонент после запроса отображается на пустой странице без шаблона. Не срабатывает аякс компонент

Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.

История одного бага

Сегодня описывал техподдержке один нетривиальный баг в работе компонентов в режиме ajax, да столько понаписал, что появилось желание посвятить этому багу пост во блоге.

Итак. Как известно, любой компонент битрикса гипотетически может работать в режиме ajax — для этого лишь надо в параметрах подключения компонента указать AJAX_MODE => Y. При наличии этой опции система сама подменяет нужные ссылки и сабмиты форм на js-вызовы ( документация ).

При клике по ссылке, ведущей на этот же компонент, серверу отправляется асинхронный запрос через XHR. При отправке же данных из формы передача данных происходит через скрытый iframe. Результат запроса в обоих случаях вставляется через innerHTML и, как следствие, js-скрипты при такой вставке не исполняются. Для обхода этого ограничения в битриксе были разработаны специальные методы для отработки javascript в контексте страницы.

Возвращаемся к проблеме. В 10 версии продукта сабмиты форм отлавливались путём добавления атрибута onsubmit к форме ( bitrix/modules/main/ajax_tools.php ):

И всё было прекрасно вне зависимости от набора данных, возвращаемых аякс-запросом.

В 11 версии обработчик на сабмит стал вешаться не через атрибут onsubmit , а байндингом с помощью addEventListener , т.е. подписка на событие происходит путем вызова js-кода. Вроде бы всё ок и в преобладающем большинстве случаев оно работает. Однако, из-за особенностей реализации выполнения js-кода, передаваемого компонентом в ответе, возможна ситуация, когда байндинг не будет происходить после получения ajax-ответа и всё будет ломаться. Вот в такой ситуации и оказались читатели одного интернет-СМИ.

Пользователь открывает страницу, на которой размещён компонент с формой и включенным аяксом. Система генерирует js-код, который навешивает обработчик сабмита формы:

300 миллисекунд, байндинг сабмита не происходит и следующий сабмит формы идёт уже не аяксом, а обычной перезагрузкой страницы, в итоге пользователь видит вывод компонента на пустой странице (т.к. AJAX_CALL=Y ).

По этой проблеме был создан тикет, но был получен отлуп — «У компонента iblock.element.add.form нет ajax режима работы». Формально всё верно, т.к. галочки соответствующей у компонента действительно нет.

Однако, есть документация по работе компонентов в режиме ajax, которая регламентирует аякс-режим работы любого правильно сделанного компонента. Что ж, не будем ничего доказывать, копаем сами. Возникновения подобной проблемы можно добиться на любом стандартном компоненте с долго отдаваемой фотографией. Сделать это очень просто — втыкаем на страницу комплексный компонент catalog со включённым компонентом фильтра. В шаблон каталога производим вставку картинки:

Отключаем временно показ этой картинки. Открываем каталог (ссылка вырезана цензурой:-)), нажимаем кнопку «Сбросить» в фильтре — каталог нормально отображается. Нажимаем ещё раз — всё ок.

Теперь подключаем картинку, проводим те же самые манипуляции. Нажимаем первый раз «Сбросить» — каталог прогрузился, однако, выскочила js-ошибка вида (копипаст из firebug):

При повторном нажатии на «Сбросить» страница уже перегружается и на ней отображается вывод компонента без шаблона сайта. Как раз то, что нужно — неведомый баг, который я отлавливал на протяжении полутора дней. Просто, быстро, но печально.

Стабильная повторяемость бага достигнута, теперь бы надо его пофиксить. Часик поразмышляв над нарисованными в тетради схемами вызовов всех функций, приводящих к багу, родилось два вариант
Из очевидных решений на ум пришло два:

1. Реализация deferred-обработчиков load+ready для ифрэйма с костылем под обычный xhr.

2. Двухстрочный файлов ядра, позволящий сделать исполнение js-кода, выводимого компонентов, всегда после замены вывода компонента, тем самым решая проблема с асинхронностью. Сурово, но иначе никак. Без копания в ядре нижеприведённый патч вам ничего не скажет, но разобрать проблему и не показать решение было бы подло:-)

./bitrix/modules/main/classes/general/component_ajax.php, __prepareScripts().
Исходная строка:
setTimeout(‘top.BX.ajax.__runOnload();’, 300);
Модифицированная строка:
top === self ? setTimeout(‘top.BX.ajax.__runOnload();’, 300) : null;

./bitrix/js/main/core/core_ajax.js, BX.ajax.submitComponentForm().
Исходная строка:
obForm.BXFormCallback = function(d) ;
Модифицированная строка:
obForm.BXFormCallback = function(d) ;

Как ни странно, столь развёрнутый разбор проблемы не вызвал никаких возражений со стороны саппорта, поэтому тикет погулял по нескольким ответственным и направился в отдел разработки. Бага признана незначительной, однако надеюсь, что фикс выйдет действительно в ближайших обновлениях системы, а не в далёком и туманном будущем

Источник

Ajax режим в bitrix:iblock.element.add.form

Доброго времени суток. В публичной части сайта размещен компонент bitrix:iblock.element.add.form, шаблон пока что не модифицирован. В вызов компонента для работы в ajax-режиме (форма должна открываться в попапе) добавлено следующее:

Ajax-режим срабатывает нормально 1 раз, если я нажимаю submit второй раз — остается вместо страницы только сама форма, ломается обработчик судя по всему. При этом, если я залогиненым смотрю страницу, сверху есть панель администратора, все работает нормально, сколько бы раз я ни нажимал на сабмит. Какого-то скрипта не хватает, почему так? Шапка сайта такая:

Если кто столкнется — на данный момент лечится отключением оптимизации js в настройках главного модуля.

Если подробнее, то на ответе от компонента биндятся на битрикс-событие onAjaxSuccess некие действия, в частности по перебинду сабмита формы. Это событие не срабатывает, потому что в ответе в некоем массиве arAjaxPageData приходит пустой ключ SCRIPTS. PHP туда пишет все скрипты, если ajax запрос ($this->bInAjax, может это значит что-то другое) или если сайт «не js оптимизирован». $this->bInAjax в труе ставит функция ShowAjaxHead, которая вроде бы не вызывается при работе компонента в ajax-режиме, поэтому пришлось отключить «оптимизацию js», чтобы злополучный ключ SCRITPS был не пустой. Как-то так.

А у меня в режиме AJAX на мобильных устройствах. компонент bitrix:iblock.element.add.form работал не правильно, при успешном заполнении или при ошибке (не заполнено то то ) вместо подгрузки текста ошибки-сообщения, на странице оставалось только окно модуля.

Вылечил добавлением в настройки компонента
«AJAX_MODE» => «Y»,
«AJAX_OPTION_SHADOW» => «Y»,

(у меня на странице было два одинаковых компонента, добавлять строку «AJAX_OPTION_SHADOW» => «Y» пришлось в оба )

На пк без «AJAX_OPTION_SHADOW» => «Y» работало/ет без глюков

Источник

Читайте также:  Nerf power moves spider man не работает
Оцените статью