Документация для разработчиков

BX.ajax

XMLHttpRequest BX.ajax(
     object params
);

Низкоуровневая функция для отправки аяксовых запросов. Формат объекта params:

{
      url: URL запроса
      method: GET|POST
      data: POST-данные для отправки (строка или объект)
      dataType: html|json|script – данные какого типа предполагаются в ответе
      timeout: 60 – таймаут запроса в секундах
      async: true|false – должен ли запрос быть асинхронным или нет
      processData: true|false – нужно ли сразу обрабатывать данные?
      scriptsRunFirst: false|true – нужно ли выполнять все найденные скрипты перед тем, как отдавать сожеримое обработчику или только те, в тэге которых присутствует атрибут bxrunfirst
      emulateOnload: true|false – нужно ли эмулировать событие window.onload для загруженных скриптов
      start: true|false – отправить ли запрос сразу или он будет запущен вручную
      cache: true|false – в случае значения false к параметру URL будет добавляться случайный кусок, чтобы избежать браузерного кэширования
      onsuccess: функция-обработчик результата
      onfailure: функция-обработчик ошибки
}

Функция возвращает ссылку на объект XMLHttpRequest, при помощи которого осуществляется запрос. В случае успеха запроса будет вызван обработчик onsuccess. В качестве параметра будет результат запроса. Если параметр processData установлен в true, то обработка будет в зависимости от типа данных:

  • html: результат будет очищен от js-кода. Код будет выполнен после передачи данных обработчику. Перед передачей будут выполнены все скрипты с атрибутом bxrunfirst, или все скрипты, если параметр scriptsRunFirst установлен в true;
  • script: полученный результат будет передан обработчику и выполнен. Что раньше – определяется параметром scriptsRunFirst
  • json: результат будет интерпретирован как описание объекта в формате json. Обработчик получит объект.

Если подключена библиотека для работы с localStorage (core_ls), то помимо перечисленных параметров можно использовать указать параметры:

  • lsId – строковой идентификатор для передачи данных запроса между различными вкладками;
  • lsTimeout – время жизни данных запроса
  • lsForce - false|true

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



Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
1
Алексей Попович
Пример скрипт обработки php-массива
Имеем php-массив с какими-то данными ($PRICE_LIST_DATA). каждую строку массива нужно отправлять ajax-ом в файл на обработку и при это публиковать пользователю результат работы каждого шага. В файле с php после получения массива выводим скрипт:
(простите за смесь BX и jquery).

Код
<sc ript type="text/javascript">
        function work_with_row(index,value,d){
            BX('notes').html('<p>Идет обработка. Строка №'+index+'</p>');
            BX.ajax({   
                url: '/ajax.php',
                data: {
                    <перечисление всех ключей и значений данных для передачи на сервер>
                },
                method: 'POST',
                dataType: 'json',
                timeout: 30,
                async: true,
                processData: true,
                scriptsRunFirst: true,
                emulateOnload: true,
                start: true,
                cache: false,
                onsuccess: function(data){
                    if(parseInt(data.ID)>0){
                        BX('results').append(<результат обработки>);                     
                    } else {
                        $('#errors').append(<результат обработки, если вернулись какие-то не верные данные>);
                    }
                    d && d.resolve();  // добавляем результат обработки в вывод на очередь вывода на экран
                },
                onfailure: function(){
                    d && d.resolve();
                }
            });
        }

        BX.ready(function(){
            var wait = BX.showWait('xls_container');  // показываем прелоадер в правом верхнем углу контейнер
            var PRICE_LIST_DATA = <?=json_encode($PRICE_LIST_DATA);?>;
            var deferreds = [];
            $.each(PRICE_LIST_DATA,function(index,value){  // не знаю, есть ли такой аналог в BX - не разбирался. в АПИ не описано
                var d = new $.Deferred();
                work_with_row(index,value, d);
                deferreds.push(d);
            });
            $.when.apply($, deferreds).done(function () {  // не знаю, есть ли такой аналог в BX - не разбирался. в АПИ не описано
                BX('notes').append('Обработка завершена');
                BX.closeWait('xls_container',wait); // прячем прелоадер
            });
        });
    </sc ript>
 
2
Александр Павлов
Код
BX.ajax({
           url: '<?=urlencode($templateFolder.'/ajax.php');?>',
           data: {'val1':'value', 'val2':'value2'},
           method: 'POST',
           dataType: 'json',
           timeout: 30,
           async: true,
           processData: true,
           scriptsRunFirst: true,
           emulateOnload: true,
           start: true,
           cache: false,
           onsuccess: function(data){
            console.log(data);
           },
           onfailure: function(){

           }
          }); 
Обратите внимание на параметр data, в него можно установить не только строку, но и объект с нужными вам параметрами. Причем предварительно объект можно сформировать отдельно и подставить его в это значение, например:
Код
var objTest = { 
   test    : 5,  
   bla     : true , 
   some : false
}   
 
BX.ajax({
           url: '<?=urlencode($templateFolder.'/ajax.php');?>',
           data: objTest,  
});
Т.е. нет необходимости формировать строку URL а передавать все в data в виде осмысленных переменных.
7
Алексей Попович
пример использования:


Код
BX.ajax({
                    url: '<?=urlencode($templateFolder.'/ajax.php');?>' + '?action=PRODUCT_UPDATE&PRODUCT_ID='+PRODUCT_ID+'quantity='+quantity,
                    data: объект или строка с данными запроса,
                    method: 'POST',
                    dataType: 'json',
                    timeout: 30,
                    async: true,
                    processData: true,
                    scriptsRunFirst: true,
                    emulateOnload: true,
                    start: true,
                    cache: false,
                    onsuccess: function(data){
                        console.log(data);
                    },
                    onfailure: function(){

                    }
                });

скрипт лежит в файле template.php какого-нибудь шаблона компонента. файл для обработки аякс-запросов, ajax.php лежит в папке с данным шаблоном

P.S. добавил пример, т.к. очень долго не мог понять, в чем же у меня ошибка. а ошибка оказалась вообще глупой: забыл параметры в фигурные скобки передать и передавал как: BX.ajax(параметры)  :)  

P.P.S  как передавать пост-параметры, так и не нашел, поэтому передаю их в адресной строке... Если у кого есть идеи по поводу того, как пост-параметры передать - очень было бы хорошо увидеть...
© «Битрикс», 2001-2020, «1С-Битрикс», 2020
Наверх